PHP试题网_中国最大的免费网络PHP试题测试平台,PHP试卷调查,PHP试卷模板、PHP考试测验
公告: 【20201211】公告:复杂试卷成功上线,问答模块很快上线……网站将有诸多变化

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



作者:OK兄 浏览次数:21