一. 前端
wx.login({
success: function(res) {
if (res.code) {
//获取用户信息
wx.getUserInfo({
success: function (msg){
//发起网络请求
wx.request({
url: 'https://test.com/onLogin.php',
method: 'POST',
header: {
// 'content-type': 'application/json'
'content-type': 'application/x-www-form-urlencoded'
},
data: {
code: res.code,
encryptedData: msg.encryptedData,
iv: msg.iv
},
success: function (data){
console.log(data);
}),
fail: function (res) {
console.log(res)
}
})
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
});
代码详解:
1. wx.login
返回的res如下图
code
为登录凭证,使用一次后失效
2. wx.getUserInfo
返回的msg
如下图
msg里的encryptedData
和iv
都非常重要的敏感信息,后面讲后台接口时会讲到
3. data
为我们后台登录接口返回的数据(业务数据)
二. 后端
1. 第一步,requier wxBizDataCrypt.php
文件,官方文件点我下载
2. 通过code
换取 session_key,openid,unionid
会话密钥,按照官方文档来即可,接口地址:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
返回的是包含openid和unionid的json字符串(多平台应该是取unionid,进行查找数据库的操作,获取用户在另外平台上的数据了,unionid机制见文末解析),转换成数组格式如下图
错误时返回的json包如下,
{"errcode": 40029,"errmsg": "invalid code"}
3. 获取用户详细信息
$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
encryptedData
和iv
为前台传过来的参数(密文)- 若
$errCode !=0
则验证失败,接口应该返回失败数据 $data
为解密后的用户基本信息,json格式,转换数组后如下图
- 通过后就获取到用户详细信息了
- 末尾返回的数据就是上面前端的代码详解里的data参数啦
openid与unionid
同一用户
对同一应用
(公众号、小程序等)的openid是相同的不同用户
对不同应用
的openid是不同的- 同一个微信开放平台帐号下的应用,用户的unionid是唯一的
- 不同应用若想获取同一用户在其他应用数据,应先根据unionid获取用户在该平台的openid,然后根据openid获取相应数据
- 更多详情参考官方文档