微信官方团队发布了一个调整通知:《小程序登录、用户信息相关接口调整说明》,公告明确从4月13日起,新发布的小程序不能使用wx.getUserInfo,要用wx.getUserProfile替代
容易踩到的坑:
不能在调用 wx.login 等过程的回调函数中,自动调用 wx.getUserProfile 来触发授权行为,因为 wx.getUserProfile 只能由用户手动触发。否则,系统会抛出异常:error msg: getUserProfile:fail can only be invoked by user TAP gesture
wx.login和wx.getUserProfile正确使用代码:
//wxml
<button bindtap="getUserProfile"> 获取头像昵称 </button>
//getUserProfile 回调里面嵌套wx.login
wx.getUserProfile({
desc: '用于完善会员资料',
success: function (userInfoRes) {
//...
//调用 wx.login 登录接口
wx.login({
success: function (res) {
//换取openid & session_key
wx.request({
url: wx.getStorageSync('domainName') + '/WxOpen/OnLogin',
method: 'POST',
header: { 'content-type': 'application/x-www-form-urlencoded' },
data: {
code: res.code
},
success:function(json){
var result = json.data;
if(result.success)
{
wx.setStorageSync('sessionId', result.sessionId);
//校验
wx.request({
url: wx.getStorageSync('domainName') + '/WxOpen/CheckWxOpenSignature',
method: 'POST',
header: { 'content-type': 'application/x-www-form-urlencoded' },
data: {
sessionId: result.sessionId,//wx.getStorageSync('sessionId'),
rawData:userInfoRes.rawData,
signature:userInfoRes.signature
},
success:function(json){
console.log(json.data);
}
});
//解密数据(建议放到校验success回调函数中,此处仅为演示)
wx.request({
url: wx.getStorageSync('domainName') + '/WxOpen/DecodeEncryptedData',
method: 'POST',
header: { 'content-type': 'application/x-www-form-urlencoded' },
data: {
'type':"userInfo",
sessionId: result.sessionId,//wx.getStorageSync('sessionId'),
encryptedData: userInfoRes.encryptedData,
iv: userInfoRes.iv
},
success:function(json){
console.log('数据解密:', json.data);
}
});
}else{
console.log('储存session失败!',json);
}
}
})
}
})
}
});