PHP 微信小程序之获取并解密用户数据(获取openId、unionId,或者手机号码)(小程序必须要绑定在微信开发平台才会有unionId的)

   

  • unionId : 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionId是相同的。详情登录微信开放平台(open.weixin.qq.com) 。
  • 在微信小程序开发中,unionId等敏感数据则被加密在encryptedData,于是需要以下流程来解密敏感数据,从而获取unionId等信息。

 

//解密获取unionId
    public function decrypt_index($sessionKey,$encryptedData,$iv){

        $appid = '';//小程序的appid
        $sessionKey=str_replace(' ', "+", $sessionKey);

        //传参过程中,通过post发送到服务器端的base64字符串,在服务器端接收后+丢失,替换掉
        $encryptedData=str_replace(' ', "+", $encryptedData);

        $iv=str_replace(' ', "+", $iv);

        $errCode = $this->decryptData($encryptedData, $iv, $appid ,$sessionKey );
        if ($errCode['status'] == 0) {
            $arr=json_decode($errCode['data'],true);
            $unionId = $arr['unionId'];//这里是需要获取什么就根据对应的键值获取,还有注意的一点是小程序必须要绑定在微信开发平台才会有unionId
            return $unionId;
        } else {
            return 0;
        }
    }

        /**
     * 检验数据的真实性,并且获取解密后的明文.
     * @param $encryptedData string 加密的用户数据
     * @param $iv string 与用户数据一同返回的初始向量
     * @param $data string 解密后的原文
     *
     * @return int 成功0,失败返回对应的错误码
     */
    public function decryptData( $encryptedData, $iv, $appid ,$sessionKey )
    {   
        $data = [];
        if (strlen($sessionKey) != 24) {
            $data['status'] = -41001;
            return $data;
        }
        $aesKey=base64_decode($sessionKey);

        
        if (strlen($iv) != 24) {
            $data['status'] = -41002;
            return $data;
        }
        $aesIV=base64_decode($iv);

        $aesCipher=base64_decode($encryptedData);

        $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);

        $dataObj=json_decode( $result );
        if( $dataObj  == NULL )
        {   
            $data['status'] = -410033;
            return $data;
        }
        if( $dataObj->watermark->appid != $appid )
        {   
            $data['status'] = -410034;
            return $data;
        }
        $data['status'] = 0;
        $data['data'] = $result;
        return $data;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值