微信小程序利用code获取会话密钥session_key,进而解密获取用户唯一标识openid和用户在开放平台的唯一标识符unionid

多读多写多记录,多学多练多思考。----------- Banana • Banuit Gang(BUG香柚帮)


  我们都知道,同一个微信用户的公众号和小程序等的unionid是相同的,openid是不同的,有时候我们如果想要实现例如利用小程序往公众号推送消息,就得先获取unionid,然后找到公众号的openid,才可以实现这个功能,而获取unionid的前提条件就是你必须在微信开放平台绑定了公众账号和小程序,仅仅在公众平台关联小程序是不行的。而且这两个东西,用户必须都用过才行。比如说,用户只用过小程序,而没有用过小程序关联的公众号,这样也是不行的。

  微信解密官方demo:

https://github.com/kun19911227/weChatAppDecryption.git

1. 需要向自己的服务器api传递3个参数:

  1. code:用户登录凭证
  2. iv:加密算法的初始向量
  3. encryptedData:包括敏感数据在内的完整用户信息的加密数据
//1、调用微信登录接口,获取code
wx.login({
    success: function (r) {
        var code = r.code;//用户登录凭证,有效期为5分钟
        if (code) {
            //2、调用获取用户信息接口
            wx.getUserInfo({
                success: function (res) {
                    console.log({encryptedData: res.encryptedData, iv: res.iv, code: code})
                    //3.请求自己的服务器,解密用户信息 获取unionId等加密信息
                    wx.request({
                        url: 'http://banana.com/index.php?g=api&m=user&a=register'',//自己的服务接口地址
                        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('登陆失败')
    }
})

2,在自己服务器的接口里边通过调用微信开发者服务器接口可以得到本次登录的会话密钥session_key,然后解密返回

微信开发者服务器请求地址:

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
    /**
	 * 会员注册api
	 */
	public function register() {
		include_once "wxBizDataCrypt.php";

		$data = array();

		$code          = I('post.code');
		$iv            = I('post.iv');
		$encryptedData = I('post.encryptedData');
		$appid      = '';//小程序唯一标识   (在微信小程序管理后台获取)
		$appsecret  = '';//小程序的 app secret (在微信小程序管理后台获取)
		$grant_type = "authorization_code"; //授权(必填)

		$params = "appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=".$grant_type;
		$url = "https://api.weixin.qq.com/sns/jscode2session?".$params;

		$res = json_decode($this->httpGet($url),true);

		$sessionKey = $res['session_key'];//取出json里对应的值

		$pc = new \WXBizDataCrypt($appid, $sessionKey);
		$errCode = $pc->decryptData($encryptedData, $iv, $data );

		if ($errCode == 0) {
			print($data . "\n");
		} else {
			print($errCode . "\n");
		}
		$data['errCode'] = $errCode;

		return $this->ajaxReturn($data);
	}


	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;
	}

由于我的也没有在开放平台绑定,所以获取不到用户在开放平台的唯一标识符unionid,但是思路就是这样的。 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值