微信官方团队发布了一个调整通知:《小程序登录、用户信息相关接口调整说明》,公告明确从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
getUserProfile{
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);}}})}})}});}