评论

【面向公告编程】带你深入分析适配 wx.getUserProfile 以及如何兼容 wx.getUserInfo

【面向公告编程】带你深入分析适配新 API「wx.getUserProfile」以及兼容原有API「wx.getUserInfo」

前言

由于一些开发者的滥用,为了优化用户体验,微信官方在获取用户信息上,提供了新的API「wx.getUserProfile」,接下来作者将带你解读官方公告(传送门:
小程序登录、用户信息相关接口调整说明),进一步提升“面向公告编程”能力。

常见问题

  • 1、线上版本是不是一定要接入新的 API 才能正常使用?

并不是哦,如果你的小程序是在 2021 年 4 月 13 日后发布的才需要接入,此前发布的线上版本仍不受影响。

  • 2、wx.getUserProfile 从 2.10.4 基础库开始支持,那么 2.10.4 以下基础库不就使用不了这个 API 了吗?

并不是哦,2.10.4 以下基础库仍然可以通过调用原有 API「wx.getUserInfo」获取用户信息及进行解密。

  • 3、为什么开发版和体验版调用 wx.getUserInfo 都不返回用户信息了?

wx.getUserInfo 开发版和体验版已对齐匿名表现(返回如下图结果),因此开发者可在 2021 年 4 月 13 日前在开发版或者体验版中,适配新的登录授权流程。

  • 4、wx.getSetting 无法获取用户信息的授权(即 scope.userInfo )?

从 2021 年 4 月 13 日开始,无论是通过 wx.authorize 请求授权还是 wx.getSetting 获取授权状态,都将直接返回 true。【PS:由于 wx.getUserProfile 每次调用时都需要用户弹窗授权,因此将无法获取用户授权状态】

  • 5、wx.getUserProfile 为什么只能获取到 userInfo 信息,却获取不到 rawData、signature、encryptedData、iv 等信息呢?

据悉,这几天会灰度 2.10.4 ~ 2.16.0 之间支持获取 rawData、signature、encryptedData、iv 等加密信息,具体以官方通知 / 文档为准

新的 API 对基础库有一定的要求,除了参数 userInfo 的值需要 2.10.4 及以上基础库支持获取之外,其它参数也需要 2.16.0 及以上基础库才支持获取。【PS:目前基础库在 2.10.4 ~ 2.16.0 之间将无法获取 rawData、signature、encryptedData、iv 等信息,具体以官方通知为准】

  • 6、PC 端微信暂不支持新的 API「wx.getUserProfile」应该怎么处理?

可以通过以下方式兼容。【PS:暂不推荐使用 wx.canIUse(“getUserProfile”) 做兼容判断,后续可使用该方式进行判断】

if (wx.getUserProfile) {
    console.log("支持 wx.getUserProfile")
} else {
    console.log("不支持 wx.getUserProfile")
}
  • 7、开发者工具或真机提示 wx.getUserProfile is not a function 错误信息,应该怎么处理?

① 确认开发者工具为 1.05.2103022 及以上版本,并且调试基础库为 2.10.4 及以上。
② 确认手机微信为 7.0.9 以上版本,且基础库为 2.10.4 及以上。
③ 如果工具内基础库已设置为 2.10.4 及以上,仍报同样的错误信息,可尝试调高工具基础库直至支持此 API 【PS:一切以真机为准!】

  • 8、wx.getUserProfile 获取 encryptedData 及 iv 参数后进行解密,无法获取到 openid 等信息?

原来调用 wx.getUserInfo 后进行解密可以获取到 openId 等信息如图 1 所示,但是新的 wx.getUserProfile 将无法直接获取到此类用户标识,返回的信息如图 2 所示。

  • 9、解密用户信息将不会返回 openId 及 unionId 这类信息,应该怎么解决处理?

新的登录流程有变化!开发者通过 wx.login 获取到用户登录凭证 (code),调用微信登录接口(auth.code2Session)将直接返回 openId、unionId(请先确认已在开放平台绑定该小程序,绑定流程:登录 微信开放平台 — 管理中心 — 小程序 — 绑定小程序)

  • 10、wx.getUserProfile 跟 wx.login 无法同时调用,报 getUserProfile:fail can only be invoked by user TAP gesture 错误信息?

请勿在 wx.login 的 success 回调中调用 wx.getUserProfile。
解决方式: 先使用 checkSession 进行登录态检查;提前调用 wx.login 再调用 wx.getUserProfile,完成授权登录流程。

先拖更

  • 据悉:wx.getUserProfile 计划从基础库版本 2.6.6 开始支持

  • 有疑问欢迎在下方留言或者发社区私信

最后一次编辑于  2022-02-15  
点赞 14
收藏
评论

9 个评论

  • brave
    brave
    2021-04-14

    文档已更新:第5条更正。

    2021-04-14
    赞同 1
    回复 2
    • 噜啦噜啦嘞
      噜啦噜啦嘞
      2021-04-15
      第5条是只有正式版才能获取到吗?开发版真机中获取不到,真机基础库是2.15.0
      2021-04-15
      回复
    • 冰咖啡
      冰咖啡
      2021-04-18回复噜啦噜啦嘞
      同问,有解决了吗?
      2021-04-18
      回复
  • 大
会
波
波
    大 会 波 波
    2021-09-22

    那请问这个解密流程要了干啥?验证数据?用户基础信息和openid、unionID都可以获取到

    2021-09-22
    赞同 1
    回复
  • 走天涯
    走天涯
    2021-08-06

    先调用 wx.getUserProfile 之后在 success 回调中调用 wx.login 完成授权登录流程。 得到的code老是解密不对,第二次授权下就又好了

    2021-08-06
    赞同 1
    回复 4
    • 我想问一下
      我想问一下
      2021-09-13
      你咋解决的?我现在也是遇到这情况,第一次就解密不成功,然后点第二此就解密成功了
      2021-09-13
      回复
    • 落拓
      落拓
      2021-10-22
      同上,代码没问题,但是第一次授权就是一直失败;第二次之后就一直成功,什么毛病
      2021-10-22
      回复
    • 小陆
      小陆
      2021-10-29
      这个鬼问题我发现一直存在,腾讯的技术真的比阿里的差的不是一星半点
      2021-10-29
      2
      回复
    • Mr.Wang
      Mr.Wang
      2022-12-07
      这个问题从登录流程来说是没毛病的,调用wx.getUserProfile时会拿到用户信息签名,而这个签名是通过sessionKey计算的,但每次调用wx.login获取code时这个sessionKey会重新生成,也就导致签名计算肯定不一样;所以正确的流程是先调用wx.login,再调用wx.getUserProfile获取最新sessionKey计算的签名内容,这样才能完成正确的签名匹配
      2022-12-07
      回复
  • 黎小军
    黎小军
    2021-04-12
    getUserProfile(e) {
        wx.getSetting({
          success(res) {
            if (res.authSetting['scope.userInfo']) {
              // 已经授权,可以直接调用 getUserInfo 获取头像昵称
              wx.getUserProfile({
                desc'用于获取用户个人信息'// 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
                success: function (detail) {
                  wx.login({
                    success: ress => {
                      var code = ress.code; //登录凭证
                      console.log(">>>>>>>>>>code:", code)
                      console.log("encryptedData:", detail.encryptedData)
                      console.log("iv:", detail.iv)
                      wx.request({
                        url: api.getUnionId, //自己的服务接口地址
                        method'post',
                        header: {
                          'content-type''application/x-www-form-urlencoded'
                        },
                        data: {
                          encryptedData: detail.encryptedData,
                          iv: detail.iv,
                          code: code,
                        },
                        success: (res) => {
                          console.log("res:", res.data)
                          if (res.data.code == 'C00000') {
                            util.setToken(res.data.msg);
                            util.setStorageSync("userInfo", res.data.obj);
                            wx.redirectTo({
                              url'/pages/breakpage/breakpage',
                            })
                          }
                        },
                        fail: function () {
                          console.log('系统错误')
                        }
                      })
                    }
                  });
                }
              });
            }
          }
        })
      },
    

    请问wx.getSetting不能用,要用什么替代?我这点击没反应,去掉wx.getSetting后会提示unionid为空

    2021-04-12
    赞同 1
    回复 4
    • brave
      brave
      2021-04-12
      如第8条所说的,wx.getUserProfile 获取到的加密信息经过解密后,将不会解密出 openid 或者 unionid 这类用户标识。
      如第9条所说的,wx.login(code) + auth.code2Session 将直接返回 openId、unionId(已在开放平台绑定的小程序)
      因为wx.getUserProfile需要每次弹框要求授权才能获取用户信息,所以将无法真正意义上去获取到用户授权状态。
      wx.getSetting去获取用户授权状态是不准确的,均会返回true。
      2021-04-12
      2
      回复
    • Keep Moving
      Keep Moving
      2022-02-17
      兄弟  你这个问题解决了吗?wx.getUserProfile能获获取到用户头像,昵称等信息,调用wx.request请求自己服务接口返回解密失败是什么情况
      2022-02-17
      回复
    • Keep Moving
      Keep Moving
      2022-02-17回复brave
      现在是先调用getUserProfile,success回调调用wx.Login提示fail can only be invoked by user TAP gesture;先调用wx.Login,再调用getUserProfile可以给用户弹出框验证,调用我们服务器后台提示解密失败,之前调用getUserInfo是没有问题的,这是什么原因呢
      2022-02-17
      回复
    • brave
      brave
      2022-02-17回复Keep Moving
      先使用 checkSession 进行登录态检查;如果登录态失效。提前调用 wx.login,后端更新 sessionKey 为新的,再调用 wx.getUserProfile
      2022-02-17
      回复
  • 不在言
    不在言
    2022-05-15

    老是改来改去,真的麻了

    2022-05-15
    赞同
    回复
  • 社区技术运营专员-Jahozheng
    社区技术运营专员-Jahozheng
    2021-12-24

    2021-12-24
    赞同
    回复
  • 🌻豆豆天尊🌻
    🌻豆豆天尊🌻
    2021-04-16

    先拖更

    据悉:wx.getUserProfile 计划从基础库版本 2.6.6 开始支持

    意思是正式版本的还没有支持,现在还是得使用getuserInfo?

    2021-04-16
    赞同
    回复 1
    • brave
      brave
      2021-04-22
      意思是后续会支持在2.6.6开始支持调用此API。目前是2.10.4开始支持。
      2021-04-22
      1
      回复
  • 夏日回音
    夏日回音
    2021-04-13

    请问不支持wx.getUserProfile的话, pc微信要怎么完成授权呢?

    2021-04-13
    赞同
    回复 1
    • brave
      brave
      2021-04-13
      PC端还是支持getUserInfo的调用,后续请关注PC端微信更新公告。
      2021-04-13
      回复
  • 考拉
    考拉
    2021-04-12

    您好,请问,用户主动触发wx.getUserProFile,返回的却是匿名信息,要怎么处理

    2021-04-12
    赞同
    回复 7
    • brave
      brave
      2021-04-12
      代码怎么写的?贴一下截图
      2021-04-12
      回复
    • .
      .
      2021-04-19
      2021-04-19
      回复
    • 抖森先森
      抖森先森
      2021-04-27回复.
      基础库有设置对?
      2021-04-27
      回复
    • 子非鱼
      子非鱼
      2021-04-28
      重新运行开发者工具
      2021-04-28
      回复
    • 南风草木香
      南风草木香
      2022-08-11
      我使用getUserProfile,在开发者运行是正确的 可以获取到头像昵称,但是真机测试获取到的就是灰色头像和微信用户,开发者上传后体验版也是灰色头像  我都要疯了
      2022-08-11
      回复
    查看更多(2)
登录 后发表内容