最新wx.getUserProfile 踩坑,正确的使用方法!

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


下一篇:一文了解web无状态会话token技术JWT