微信小程序更新授权接口wx.getUserProfile后,个别用户出现无法登录的问题

最新微信更新了授权的接口 wx.getUserProfile, 并且会在2021年4月28日回收原来的接口 wx.getUserInfo. 详情见微信官方文档

由于我们是社区类小程序,必须要拿到用户的昵称和头像。所以及时更新了接口,以下是开发过程中遇到的问题和解决方案:

  1. 基础库2.10.4版本以下的设备无法通过getUserProfile登陆

    解决方案是按照官方给的demo, 在页面加载时判断wx.getUserProfile是否可用。如果不可用,暂时用旧的接口替代。

<view class="container">
  <view class="userinfo">
    <block wx:if="{
     {!hasUserInfo}}">
      <button wx:if="{
     {canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
      <button wx:else open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
    </block>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{
     {userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{
     {
     userInfo.nickName}}</text>
    </block>
  </view>
</view>
Page({
     
  data: {
     
    userInfo: {
     },
    hasUserInfo: false,
    canIUseGetUserProfile: false,
  },
  onLoad() {
     
    if (wx.getUserProfile) {
     
      this.setData({
     
        canIUseGetUserProfile: true
      })
    }
  },
  getUserProfile(e) {
     
    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
    // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
    wx.getUserProfile({
     
      desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
      success: (res) => {
     
        this.setData({
     
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    })
  },
  getUserInfo(e) {
     
    // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
    this.setData({
     
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  },
})
  1. 部分2.10.4版本以上的设备会出现登录失败的情况,而且一直失败

    这个问题就把我和后端小伙伴坑惨了,正式版上线后总会有个别用户登录失败。调试了一天,前端代码和后端代码流程均无问题,让我们一度怀疑自己的职业生涯规划。

    最后在开发工具切换调试基础库的时候发现了问题的原因:

    微信给的说法是2.10.4版本以上支持,但在实际开发中 2.10.4 - 2.16.0 之间版本(含2.10.4,不含2.16.0)的基础库,用户通过wx.getUserProfile获取到的iv 和 encryptedData 在传入后端时一直解密失败,然后后端会显示没有执行对应的接口。

    2.10.4基础库对应的微信版本为:
    ios: 7.0.9
    Android: 7.0.9

    2.16.0基础库对应的微信版本为:
    ios: 8.0.2
    Android: 8.0.1

    也就是说 用户的微信版本在以上区间之内的, 都会出现解密失败无法登陆的问题。

    最终解决方案是: 更新微信

    最好在授权页面中判断一下用户的微信版本,给予相应的提示。

    获取用户微信版本方式如下:

wx.getSystemInfoSync().version

最后附上神图:

你可能感兴趣的:(小程序)