PHP微信小程序之获取并解密用户数据获取openId和unionId,,小程序登陆

前言
微信小程序API文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html
在实际的小程序开发中,往往需要用户授权登陆并获取用户的数据,快速对接用户系统。
openId: 用户在当前小程序的唯一标识
unionId : 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionId是相同的。详情登录微信开放平台(open.weixin.qq.com) 。
在微信小程序开发中,unionId等敏感数据则被加密在encryptedData,于是需要以下流程来解密敏感数据,从而获取unionId等信息。

流程

1、(客户端)微信小程序客户端调用 wx.login()接口获取登录凭证(code)

//1、调用微信登录接口,获取code
wx.login({
    success: function (r) {
        var code = r.code;//登录凭证
        if (code) {
            //2、调用获取用户信息接口
            //...
 
        } else {
            console.log('获取用户登录态失败!' + r.errMsg)
        }
    },
    fail: function () {
        callback(false)
    }
})

2、(客户端)微信小程序客户端调用 wx.getUserInfo()接口获取 用户基本信息、encryptedData(用户敏感信息加密数据) 和 iv(加密算法的初始向量 )

//1、调用微信登录接口,获取code
wx.login({
    success: function (r) {
        var code = r.code;//登录凭证
        if (code) {
            //2、调用获取用户信息接口
            wx.getUserInfo({
                success: function (res) {
                    console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})
                    //3.解密用户信息 获取unionId
                    //...
                },
                fail: function () {
                    console.log('获取用户信息失败')
                }
            })
 
        } else {
            console.log('获取用户登录态失败!' + r.errMsg)
        }
    },
    fail: function () {
        callback(false)
    }
})

3、(客户端)将前面获取到的 code 、encryptedData、iv发送到自己的服务器(开发者服务器),通过自己的服务器(开发者服务器)解密获取信息

//1、调用微信登录接口,获取code
wx.login({
    success: function (r) {
        var code = r.code;//登录凭证
        if (code) {
            //2、调用获取用户信息接口
            wx.getUserInfo({
                success: function (res) {
                    console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})
                    //3.请求自己的服务器,解密用户信息 获取unionId等加密信息
                    wx.request({
                        url: 'https://xxxx.com/wxsp/decodeUserInfo',//自己的服务接口地址
                        method: 'post',
                        header: {
                            'content-type': 'application/x-www-form-urlencoded'
                        },
                        data: {encryptedData: res.encryptedData, iv: res.iv, code: code},
                        success: function (data) {
 
                            //4.解密成功后 获取自己服务器返回的结果
                            if (data.data.status == 1) {
                                var userInfo_ = data.data.userInfo;
                                console.log(userInfo_)
                            } else {
                                console.log('解密失败')
                            }
 
                        },
                        fail: function () {
                            console.log('系统错误')
                        }
                    })
                },
                fail: function () {
                    console.log('获取用户信息失败')
                }
            })
 
        } else {
            console.log('获取用户登录态失败!' + r.errMsg)
        }
    },
    fail: function () {
         console.log('登陆失败')
    }
})

4、(服务端 php)自己的服务器发送code到微信服务器获取openid(用户唯一标识)和session_key(会话密钥),最后将encryptedData、iv、session_key通过AES解密获取到用户敏感数据
解密需要 引用的文件官网可以下载
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

/**
     * 解密用户敏感数据
     *
     * @param encryptedData 明文,加密数据
     * @param iv            加密算法的初始向量
     * @param code          用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key
     * @return
     */
$code = input('get.code');
        $appid = 'wx8c9d056ead85efd7';
        $secret = '849fbc7dff5c949c2a9707d9a20df7a8';
        $encryptedData = input('encryptedData');
        $iv = input('iv');

        if($code != ''){
            $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code='.$code.'&grant_type=authorization_code';
            $html = file_get_contents($url);
            $obj = json_decode($html);

            if(isset($obj->errcode)){
                // 获取用户信息失败
                return $html;
            }else{

                $arrlist['openid'] = $obj->openid;
                $arrlist['session_key'] = $obj->session_key;
                /**
                 * 解密用户敏感数据
                 *
                 * @param encryptedData 明文,加密数据
                 * @param iv            加密算法的初始向量
                 * @param code          用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key
                 * @return
                 */

                include_once "wxBizDataCrypt.php";

                $pc = new \WXBizDataCrypt( $appid, $arrlist['session_key']);

                $errCode = $pc->decryptData($encryptedData, $iv, $data );
                $data  = json_decode($data);//$data 包含用户所有基本信息
                $arrlist['time'] = time();
                $arrlist['city'] = $data->city;//城市-市
                $arrlist['country'] = $data->country;//国家
                $arrlist['gender'] = $data->gender;//性别
                $arrlist['language'] = $data->language;//语言
                $arrlist['nickName'] = $data->nickName;//昵称
                $arrlist['avatarUrl'] = $data->avatarUrl;//头像
                $arrlist['province'] = $data->province;//城市-省份
                //判断获取信息是否成功
                if ($errCode != 0) {
                    return $errCode;
                }
                //存入数据库
                $user = db('xw_userinfo');
                //判断是否已存在
                $list = $user->where('openid',$arrlist['openid'])->find();
                if(empty($list)){
                    //数据不存在 则存入数据
                    $user->insert($arrlist);
                }else{
                    //数据存在 则更新数据
                    $where['openid'] = $arrlist['openid'];
                    $user->where($where)->update($arrlist);
                }

                return $html;
            }
        }else{
            return json_encode('code为空');
        }

总结
好了,总算完成数据解密了



作者:端木安玉
链接:https://www.jianshu.com/p/60c644975887
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(PHP微信小程序之获取并解密用户数据获取openId和unionId,,小程序登陆)