1. 程式人生 > >php小程序登錄時解密getUserInfo獲取openId和unionId等敏感信息

php小程序登錄時解密getUserInfo獲取openId和unionId等敏感信息

special nat 開發者 != 應用 失敗 lse get devel

在獲取之前先了解一下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) { console.log(res) //獲取服務器返回的結果 } }) } }) } } })

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小程序登錄時解密getUserInfo獲取openId和unionId等敏感信息