评论

[拆弹时刻]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

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

最后一次编辑于  星期四 18:47  
点赞 6
收藏
评论

12 个评论

  • Geefib
    Geefib
    星期四 20:09

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

    星期四 20:09
    赞同 1
    回复 3
    • 圣殿骑士
      圣殿骑士
      星期五 17:31
      会,所以必须写兼容,老方法会返回密文
      星期五 17:31
      1
      回复
    • Geefib
      Geefib
      14小时前回复圣殿骑士
      但是还是要绑定在按钮上授权先,才可以调用成功,如果是直接调api是fail的。但是getuserprofile也是要点击的。不能一个按钮绑两个事件,试了opentype是getuserinfo的,里面再调用getuserprofile掉不起来
      14小时前
      回复
    • 圣殿骑士
      圣殿骑士
      8小时前回复Geefib
      其实可以判断,不过现在线上是支持的,那就直接用 getuserprofile把
      8小时前
      回复
  • BenJaMin🌪
    BenJaMin🌪
    星期五 19:00

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

    星期五 19:00
    赞同
    回复 1
    • 圣殿骑士
      圣殿骑士
      星期五 23:08
      文章中有说,把获取的信息存到数据库中,不用每次都调用,避免骚扰用户
      星期五 23:08
      回复
  • AnDrew
    AnDrew
    星期四 14:18

    写的很详细啊 老哥 举报了

    星期四 14:18
    赞同
    回复
  • WANGHANMING
    WANGHANMING
    星期四 11:35

    我们现在的生产环境已经出现了灰色头像+微信用户的记录了,是在3月低上线的版本,怎么会这样的

    星期四 11:35
    赞同
    回复 2
    • 圣殿骑士
      圣殿骑士
      星期四 15:11
      线上环境目前还是支持老方法的,只有可能是版本过低,你先排查下 是100%不行吗? 还是部分机型部分基础库?
      星期四 15:11
      回复
    • 圣殿骑士
      圣殿骑士
      星期四 17:17
      截至4月8日。。。2.16.0以下版本似乎全部失效,不支持了(官方可能提前上了)。。。尽快切换吧
      星期四 17:17
      回复
  • 我是太阳
    我是太阳
    星期三 17:43

    请问getUserProfile api 不使用按钮掉起也没问题吧 官网好像没有写必须按钮掉起对吧

    星期三 17:43
    赞同
    回复 1
    • 圣殿骑士
      圣殿骑士
      星期四 11:07
      没有写,但是!官方文档里的demo 是按照button上的,同时判断也没用wx.canIuse,所以建议按照官方文档的写法,因为你不知道最后官方会不会有其他的改动
      星期四 11:07
      回复
  • 苑博林
    苑博林
    星期三 17:37

    请问那我可以理解为wx.login可以无条件进入就调用么

    星期三 17:37
    赞同
    回复 1
    • 圣殿骑士
      圣殿骑士
      星期四 11:08
      是,wx.login 是用来额外兑换获取 unionId的,但是不能获取nickName等用户信息
      星期四 11:08
      回复
  • 蓝雨
    蓝雨
    星期三 15:02

    大概就是现在不依赖getsetting的返回值,而通过后端接口来判断用户之前是否有过授权行为咯?

    星期三 15:02
    赞同
    回复 2
    • 圣殿骑士
      圣殿骑士
      星期三 17:06
      星期三 17:06
      回复
    • 圣殿骑士
      圣殿骑士
      星期三 17:09回复圣殿骑士
      而且发布上线的时候,要写兼容性方案
      星期三 17:09
      回复
  • veteran
    veteran
    04-06

    但是低于2.16.0的sdk用getuserinfo已经获取不到正常用户信息了,返回的是匿名信息

    04-06
    赞同
    回复 7
    • 圣殿骑士
      圣殿骑士
      04-06
      线上吗? 目前我们(4月6日早上11点)发布的小程序未收到反馈。 刚刚看了下8.0.0未更新的微信打开没有问题~
      04-06
      回复
    • Zoe
      Zoe
      04-06
      开发工具上就已经获取不到正常信息了
      04-06
      回复
    • 我是太阳
      我是太阳
      星期三 10:43
      我也获取不到了getuserinfo  包括按钮点击的也获取不到了  要修改代码吗
      星期三 10:43
      回复
    • 圣殿骑士
      圣殿骑士
      星期三 17:07回复Zoe
      文章里有写,工具上已经不支持了,但是线上是可以的
      星期三 17:07
      回复
    • 圣殿骑士
      圣殿骑士
      星期三 17:07回复我是太阳
      线上吗?
      星期三 17:07
      回复
    查看更多(2)
  • brave
    brave
    04-06

    点赞,评论,举报

    04-06
    赞同
    回复
  • 青寒
    青寒
    04-06

    干货,点赞,收藏。

    04-06
    赞同
    回复

正在加载...

登录 后发表内容