评论

[拆弹时刻]4月13日前更新wx.getUserInfo和getUserProfile授权获取问题的解决方案

IDE工具和体验版已经不支持老的方法,如何在4月13日前做好兼容切换

论坛里有不少人疑惑新版的getUserProfile是不是已经上,同时发现开发环境中原有的老方法已经不支持了,这里我为大家集中解决下疑惑~

1、线上是否已经不支持wx.getUserInfo老方法了?

支持!目前,根据官方文档说明:在4月13日前发布的,线上环境2.16.0基础库以下已经不支持老版方法。(4月8日更新,怀疑官方已提前发布)

本人今天4月6日10点半线上支持老方法,但是4月8日发布2.16.0以下低版本已经去掉弹窗授权了。请大家尽快更新发布新版方法

2、哪些环境已经是新方法了?

开发环境(包括但不限于IDE工具,真机调试),微信后台提供的体验版环境,且已不支持老办法。

3、新老两种方法是否并行?

线上环境:目前并行(4月13日前),但getUserProfile新方法 只在2.10.4以上版本支持。

开发环境和体验版:不并行,不支持左右横跳哈。

4、如何解决兼容性适配?

上才艺啦,呸,上代码。

先来看下原本代码的授权逻辑

//老的逻辑
wx.getSetting({
    async success(res) {
        console.log(res.authSetting);
        //判断小程序用户是否授权
        if (res.authSetting['scope.userInfo']) {
            //已授权  
        } else {
            //未授权情况
        }
    }
})

之前主要通过wx.getSetting的方法来判断,而现在重大的改变是老方法getUserInfo不再弹窗,就算改成getUserProfile弹窗授权,新方法中getSetting中scope.userInfo 这个值并没有返回(这里跟文档有些出入,不知道官方后面会不会修正)

同时,这里需要做兼容判断,把获取到内容存在数据库中,避免反复弹窗骚扰用户。

//根据官方文档 做了一些修改
Page({
  data: {
    userInfo: {},
    hasUserInfo: false,
    canIUseGetUserProfile: false,
  },
  onLoad() {
    //先请求自定义接口,获取上次存的useInfo
    wx.request({
      url: 'test.api', //仅为示例,并非真实的接口地址
      data: {},
      success (res) {
        console.log(res.useInfo)
        //判断之前是否已获取并存储过用户信息
        if(res.useInfo){
            
        }else {
            //这里不要使用 wx.canIuse来判断,避免一些适配问题
            if (wx.getUserProfile) {  //直接使用官方推荐的方法
              this.setData({
                canIUseGetUserProfile: true
              })
            }
        }
      }
    })
  },
  getUserProfile(e) {
    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
    // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
    wx.getUserProfile({
      desc: '需要你的信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
      success: (res) => {
        //这里需要将获取的 res.userInfo 存起来,你可以存在数据库,也可以存在local storage里
        //wx.request...请求接口
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    })
  },
  getUserInfo(e) {
    // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  },
})
<!-- html部分 --->
<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>

5、如何更新用户信息?

首先,目前的规则如果不弹窗,肯定是无法每次拿到用户的最新信息,为了避免每次弹窗请求授权骚扰用户,所以最好根据产品规划,定期获取用户的信息(看心情)。

6、官方接口文档

https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801

觉得有用,请点个赞哦,让我继续分享更有动力~

最后一次编辑于  2021-04-08  
点赞 14
收藏
评论

19 个评论

  • AnDrew
    AnDrew
    2021-04-08

    写的很详细啊 老哥 举报了

    2021-04-08
    赞同 9
    回复
  • 一杯红茶、🍃
    一杯红茶、🍃
    2021-04-15

    我遇见的问题是, 部分用户调用 wx.getUserProfile, 报错, 提示 is not a function, 应该是版本库的问题

    if (wx.getUserProfile) {}, 你这样直接调用判断不报错吗?

    建议使用 canUse 前置做个判断能否使用

    2021-04-15
    赞同 1
    回复 3
    • 游戏人生
      游戏人生
      2021-04-15
      首先if (wx.getUserProfile) {} 这个判断是官方文档提供的(这种就看你信不信官方了),另外if判断报错,不影响代码执行啊,else里面兼容写好就可以了
      2021-04-15
      1
      回复
    • 游戏人生
      游戏人生
      2021-04-15
      另外,关于 is not a function,在一些版本库的确有这样的问题,貌似官方在修复,不过我们事先写了兼容,规避了
      2021-04-15
      回复
    • U
      U
      2022-05-14
      写了兼容了还是一样 is not a function怎么办
      2022-05-14
      1
      回复
  • Geefib
    Geefib
    2021-04-08

    踩累了,刚才我们完全按新的方式处理了,没有兼容。然后发现getuserinfoAPI不绑定在按钮上,直接调会报错,跟官方文档说的能拿到匿名信息不一样

    2021-04-08
    赞同 1
    回复 3
    • 游戏人生
      游戏人生
      2021-04-09
      会,所以必须写兼容,老方法会返回密文
      2021-04-09
      1
      回复
    • Geefib
      Geefib
      2021-04-12回复游戏人生
      但是还是要绑定在按钮上授权先,才可以调用成功,如果是直接调api是fail的。但是getuserprofile也是要点击的。不能一个按钮绑两个事件,试了opentype是getuserinfo的,里面再调用getuserprofile掉不起来
      2021-04-12
      回复
    • 游戏人生
      游戏人生
      2021-04-12回复Geefib
      其实可以判断,不过现在线上是支持的,那就直接用 getuserprofile把
      2021-04-12
      回复
  • 小九
    小九
    04-01

    现在wx.getUserProfile和wx.getUserInfo都不能获取头像和昵称了,怎么弄???

    04-01
    赞同
    回复 1
    • 游戏人生
      游戏人生
      04-07
      没办法,只能让用户主动上传,或者你引导用户上传
      04-07
      回复
  • 支少
    支少
    2022-07-14
    为什么解密之后没有unionId
    
    2022-07-14
    赞同
    回复
  • Sam
    Sam
    2021-11-24

    问个问题,当用户更改昵称时,getUserProfile 还是会和getUserInfo一样存在2个小时左右的数据缓存期吗?

    2021-11-24
    赞同
    回复 1
    • 游戏人生
      游戏人生
      2021-11-24
      肯定不是实时获取,但是具体多长,我没测试过,一般隔天再次获取肯定是有更新的
      2021-11-24
      回复
  • ChasingMoon
    ChasingMoon
    2021-05-10

    我们正在用原来的逻辑写的乐此不疲的时候,腾讯忽然就反手一个 "回手掏" ,博主此文就相当于说:啊,你腾讯不讲武德,随手甩出一个闪电五连鞭。

    2021-05-10
    赞同
    回复
  • 阿白
    阿白
    2021-04-20

    更新getUserProfile 了之后,大神求解,出现弹出两个授权弹窗的问题(点击完一次性弹两个)

    2021-04-20
    赞同
    回复 1
    • 阿白
      阿白
      2021-04-20
      目前还可以用旧接口
      2021-04-20
      回复
  • 安达
    安达
    2021-04-13

    https://developers.weixin.qq.com/community/develop/article/doc/00000cc422c12844b4fb644d056813

    2021-04-13
    赞同
    回复
  • BenJaMin🌪
    BenJaMin🌪
    2021-04-09

    使用getUserProfile 后每次登录都需要授权 这个问题应该怎么解决呀

    2021-04-09
    赞同
    回复 4
    • 游戏人生
      游戏人生
      2021-04-09
      文章中有说,把获取的信息存到数据库中,不用每次都调用,避免骚扰用户
      2021-04-09
      1
      回复
    • 向日葵
      向日葵
      2021-04-13回复游戏人生
      那么问题来了,不调用事使用wx.login,会返回错误,无法code,请问下怎么解决code的问题?
      2021-04-13
      回复
    • 游戏人生
      游戏人生
      2021-04-13回复向日葵
      首先是这样的 wx.login和getUserProfile 是2个接口2个功能,以前可能会用getuserInfo解密兑换openId,但现在这2个操作是分开的,wx.login负责每次进去拿 openId和unionId,而profile 保存过后,不需要每次都授权
      2021-04-13
      回复
    • 随遇而安
      随遇而安
      2022-04-14回复游戏人生
      用户取消授权和更换微信头像的话就监听不到,这个有办法解决吗?
      2022-04-14
      回复

正在加载...

登录 后发表内容