多读多写多记录,多学多练多思考。----------- Banana • Banuit Gang(BUG香柚帮)
我们都知道,同一个微信用户的公众号和小程序等的unionid是相同的,openid是不同的,有时候我们如果想要实现例如利用小程序往公众号推送消息,就得先获取unionid,然后找到公众号的openid,才可以实现这个功能,而获取unionid的前提条件就是你必须在微信开放平台绑定了公众账号和小程序,仅仅在公众平台关联小程序是不行的。而且这两个东西,用户必须都用过才行。比如说,用户只用过小程序,而没有用过小程序关联的公众号,这样也是不行的。
微信解密官方demo:
https://github.com/kun19911227/weChatAppDecryption.git
1. 需要向自己的服务器api传递3个参数:
- code:用户登录凭证
- iv:加密算法的初始向量
- 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,但是思路就是这样的。