php小程序登录时解密getUserInfo获取openId和unionId等敏感信息
在获取之前先了解一下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 授权登陆,完整代码
——现在的努力,只为小时候吹过的牛逼! ——