zoukankan      html  css  js  c++  java
  • 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 授权登陆,完整代码

  • 相关阅读:
    WPA/WPA2无法暴力破解
    被书本知识所边缘化的软件工程师
    栈和队列
    Oracle update 之部分更新
    SAAS之初体验
    Entity Framework
    ResourceWriter和ResxResourceWriter的區別
    C#中將顏色轉換成網頁16進制顏色代碼
    Javascript功能代码收集(不断更新中...)
    .net1.1转换成更高版本的问题总结
  • 原文地址:https://www.cnblogs.com/zxf100/p/10087473.html
Copyright © 2011-2022 走看看