微信小程序解析用户unionid等信息
- 调用wx.login获取 用户临时登录凭证code(有效期5分钟);
- 调用wx.getUserInfo获取加密过的数据encryptedData和解密参数iv;
- 将code、encryptedData、iv传给后台,并在后台调用微信auth.code2Session方法,然后将解析到的信息返回给前台。
前端代码示例如下:
注意:这里的wx.login和wx.getUserInfo调用顺序,先调用getUserInfo后调用wx.login会导致获取到的code和getUserInfo返回的加密数据不匹配,从而可能会导致解析unionid等用户信息失败!血的教训。
var app = getApp();
const utils = require('util.js');
/**
* 获取用户信息
*/
function getUserInfo(callback) {
let _this = this;
/**
*1.判断用户是否授权过(获取用户信息)
*/
wx.showLoading({
title: '加载中...',
mask: true
})
wx.getSetting({
success: function (setting) {
if (setting.authSetting['scope.userInfo']) {
wx.login({
success(loginRes){
wx.getUserInfo({
success: function (res) {
console.log('getUserInfo获取用户信息:', res);
let userInfo = res.userInfo;
wx.request({
url: utils.baseUrl + 'index',
data: {
code: loginRes.code,
iv: res.iv,
encryptedData: res.encryptedData,
},
method: 'GET',
header: {
'content-type': 'application/json'
}, // 设置请求的 header
success: function (data) {
console.log('解析unionId:', data);
if (data.data.resultCode == '1') {
userInfo.openId = data.data.data.openId;
userInfo.unionId = data.data.data.unionId;
wx.setStorageSync('userInfo', userInfo);
//执行回调函数
if (callback) {
callback();
}
wx.hideLoading();
} else {
wx.hideLoading();
utils.showToast(data.data.resultMsg);
}
},
fail(err) {
wx.hideLoading();
}
})
},
fail: function (err) {
_this.getUserInfo();
}
})
},
fail(loginErr){
wx.hideLoading();
}
})
}
else {
//没有授权的情况,跳转到welcome页面
_this.getUserInfo();
}
},
fail(){
wx.hideLoading();
}
})
}
module.exports = {
getUserInfo: getUserInfo
}
后台代码示例,官方在文档中提供了:php,python,node.c++的示例代码,java版本,在网上可以搜的到,很多开发者在博客中提供了java示例代码,详情见官方文档服务端获取开放数据
ok,搞定收工!