在获取之前先了解一下openId和unionId

openId : 用户在当前小程序的唯一标识

unionId : 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionId是相同的。详情登录微信开放平台(open.weixin.qq.com) 。
在微信小程序开发中,unionId等敏感数据则被加密在encryptedData,于是需要以下流程来解密敏感数据,从而获取unionId等信息。
 
1.客户端调用wx.login登录接口
wx.login({
success(rs){
var code = rs.code //登录凭证
if(code){ // 调用授权 获取用户信息接口
wx.getUserInfo({
success: function (res) {
console.log(res) var encryptedData = res.encryptedData
var iv = res.iv
var rawData = res.rawData
var signature = res.signature //请求服务器,解密获取openId和unionId
wx.request({
url: app.domain + 'teacherapi/Wx_Decode/WxDecode',
method: 'POST',
header: { 'content-type': 'application/x-www-form-urlencoded' },
data: { encryptedData: encryptedData, iv: iv, rawData: rawData, signature: signature ,code:code},
success: function (res) {
          var data = JSON.parse(res.data.msg)    //json转对象
                console.log(data)  //获取服务器返回的结果
}
})
}
})
}
}
})

2.后台解密

public function httpGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
} /**
* @author: zxf
* @date: 2018-12-08
* @description: 解密微信用户敏感数据
* @return array
*/
public function WxDecode()
{
// 接收参数
$data = request() -> param(); // 引入解密文件 在微信小程序开发文档下载
vendor('wx.WXBizDataCrypt');
vendor('wx.ErrorCode'); $appid = config('APPID');
$appsecret = config('APPSECREET');
$grant_type = "authorization_code"; //授权(必填) $code = $data['code']; //有效期5分钟 登录会话 $encryptedData=$data['encryptedData'];
$iv = $data['iv'];
$signature = $data['signature'];
$rawData = $data['rawData']; // 拼接url
$url = "https://api.weixin.qq.com/sns/jscode2session?"."appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=".$grant_type;
$res = json_decode($this->httpGet($url),true); $sessionKey = $res['session_key']; //取出json里对应的值
$signature2 = sha1(htmlspecialchars_decode($rawData).$sessionKey);
// 验证签名
if ($signature2 !== $signature){
return json("验签失败");
} $pc = new \WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data ); if ($errCode == 0) {
return return_succ($data);
} else {
return return_error($errCode);
}
}

说明:应该必须在线上测试,需要注意的是防止“登录凭证code”过期(有效期5分钟)

解密SDK下载地址 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

完整代码请参考我另外一篇 微信小程序+php 授权登陆,完整代码

最新文章

  1. 重温 w3cshool css3
  2. .NET Oracle Developer的福音——ODP.NET Managed正式推出
  3. 1全志 A20 camera移植
  4. CSS强制性换行word-break与word-wrap的使用
  5. 最完美的xslt数值函数与字符串函数(转)
  6. Git权威指南 读笔(1)
  7. Quartz1.8.5例子(四)
  8. GDB学习之道:GDB调试精粹及使用实例
  9. 【原创】USART异步模式配置
  10. asp.net mvc area实现多级controller和多级view
  11. SQL-45 将titles_test表名修改为titles_2017。
  12. windows系统文件和linux系统文件
  13. quic协议实时视频直播
  14. epel源报错怎么解决?
  15. 11-基于dev的bug(还没想通)
  16. CodeForces 658C Bear and Forgotten Tree 3 (构造)
  17. Redis单台的安装部署及集群部署
  18. platform_set_drvdata()/platform_get_drvdata()/container_of()【转】
  19. maven中常用命令
  20. iOS开发 - CoreData框架 数据持久化

热门文章

  1. 9.代码抽取(adapter)
  2. ubuntu下makeinfo安装,其实真正安装的是texinfo包
  3. java中根据key获取resource下properties资源文件中对应的参数
  4. spring boot -junit单元测试方法示例
  5. [原创]k8exe2bat任意文件转Bat工具(WebShell无法上传EXE解决方案)
  6. 整理+学习《骆昊-Java面试题全集(上)》
  7. 另类SQL拼接方法
  8. Activity的生命周期函数
  9. linux服务器部署tomcat和Nginx
  10. 【原创】c++拷贝初始化和直接初始化的底层区别