收藏
回答

wx.getUserProfile不能和wx.login一起使用?

mac 模拟器1.05.2102010 基础库2.16.0

调用wx.login获取code后,再调用wx.getUserProfile,可能会失败,触发fail函数,error msg: ''getUserProfile:fail can only be invoked by user TAP gesture"。

如果不能同时使用,那如何校验用户信息的准确性或者解密encryptedData呢?

最后一次编辑于  04-08
回答关注问题邀请回答
收藏

18 个回答

  • 冫.bindy
    冫.bindy
    04-16

    用了promise.all(),平级调用

    04-16
    有用 3
    回复 10
    • starry
      starry
      04-16
      是的,一起触发就可以的
      04-16
      回复
    • tiger
      tiger
      04-22回复starry
      自定义token过期了,需要自动登录,怎么重新获取encryptedData和iv呢?
      04-22
      回复
    • starry
      starry
      04-22回复tiger
      所以要wx.login,确保code是最新的就可以了
      04-22
      回复
    • lemon
      lemon
      04-25回复starry
      有没有代码贴出来参考下
      04-25
      1
      回复
    • zhx
      zhx
      04-26
      请问是怎么写的呀,为什么总是报错签名验证失败
      04-26
      回复
    查看更多(5)
  • 张家界鼎尖网络 itzjj.com
    张家界鼎尖网络 itzjj.com
    04-17

    可以直接按顺序执行login和getUserProfile方法,因为getUserProfile方法需要用户点击确认后才能获取到用户信息,这时候login方法已经执行完毕了,所以不需要考虑异步回调的问题。代码如下

    // 执行登录操作
    let code = '';
    wx.login({
        success:(res) => {
            code = res.code;
        },
    });
    // 获取用户信息
    wx.getUserProfile({
        lang'zh_CN',
      desc'用户登录',
      success(res) => {
        let loginParams = {
                code: code,
                encryptedData: res.encryptedData,
           iv: res.iv,
           rawData: res.rawData,
          signature: res.signature
        };
        _this.postLogin(loginParams);
      },
      // 失败回调
      fail() => {
        // 弹出错误
        App.showError('已拒绝小程序获取信息');
      }
    });
    
    04-17
    有用 9
    回复 5
    • starry
      starry
      04-19
      嗯,这样做也没什么问题
      04-19
      回复
    • 后生
      后生
      04-23
      请问一下现在还可以实现绑定授权登录的功能吗?就第一次点击授权登录就获取了信息,下次不用登录了
      04-23
      回复
    • 是---否
      是---否
      05-11
      wx.getUserProfile 这个不是要写在 wx.login方法的里面吗?
      05-11
      回复
    • 浮生若梦
      浮生若梦
      05-21
      我也是这样写的,是可以的。不要忽略desc就不会报错的
      05-21
      回复
    • Fly
      Fly
      05-31
      如果用户手速快到一定极限,这样就会出问题,还是用promise的好
      05-31
      回复
  • 苏震巍
    苏震巍
    05-03

    error msg: ''getUserProfile:fail can only be invoked by user TAP gesture"

    这个问题根本不是 wx.login 和 wx.getUserProfile 的调用顺序问题,而是 wx.getUserProfile 不允许自动触发,必须通过用户点击触发(如何使用冒泡等让用户点击是另外一回事)。所以如果 wx.login 是在页面载入时候自动触发的,这时候就不能用 wx.getUserProfile,再加上现在新上线的小程序对于授权提示已经要求比较严了。

    这篇文章供参考:https://www.cnblogs.com/szw/p/14632314.html

    05-03
    有用 3
    回复 1
    • 韩文博
      韩文博
      05-10
      正解  楼主starry 说的同时执行是错误的  开发过的都知道 他估计是没开发就回答了
      05-10
      回复
  • |G.XIAO|
    |G.XIAO|
    04-08

    wx.getUserProfile 用户才能触发,wx.login 不需要用户触发

    如果让我们重新设计用户登陆模块,会怎么设计呢?

    如果是我的话,我会这样设计:

    1.用 wx.login 获取 openId(unionId),这个过程是静默的,不需要用户参与,这个能满足市场大多数应用的需求

    2.对于社交分享类的应用,可以进入首页后,用户点击首页可点击区域时,申请用户头像信息(申请成功后保存到后端)

    3.在我的页面在增加个用户头像更新能力即可

    4.对于分享无法获取实时头像的问题,可以在用户点击分享时,先申请获取用户最新头像,然后在进行分享

    这段时间社区很多人吐槽,其实我们还是要看这些改到背后的事情1.对用户隐私要求越来越严,权限细分越来越细,我觉得是好事

    2.我们要抛出历史包袱去想用户授权,别被历史包袱所束缚

    3.getUserInfo 的能力可以通过 wx.login 和 wx.getUserProfile 来实现,都是只需要用户操作一次,唯一的弊端是 wx.getUserProfile  每次都需要用户触发才能拿到最新头像

    4.我觉得没有几个应用对头像的更新频次比微信本身要高,所以也不用在纠结了头像是否为最新的了,只需要提供用户具有更新头像的能力即可

    04-08
    有用 2
    回复 6
    • starry
      starry
      04-08
      getUserProfile拿到的加密数据,需要把wx.login拿到的code传给后端,后端才能解密。为什么不直接用明文数据,因为不安全
      04-08
      1
      回复
    • 若水
      若水
      04-15回复starry
      你好,我这边session失效时,原先是通过调用重新获取加密数据,然后传到后台登录的,现在getUserProfile必须通过点击才能获取信息,所以session失效时,无法重新登录,请问这个你是怎么解决的
      04-15
      回复
    • starry
      starry
      04-15回复若水
      利用事件冒泡,父子元素的点击事件分别触发login和getUserProfile,把结果分别放到data上,再watch这两个值,都不为空的情况下,请求接口,把加密信息和code传给后端
      04-15
      1
      回复
    • 噜啦噜啦嘞
      噜啦噜啦嘞
      04-16
      getUserProfile在2.10.4-2.15.0之间的版本还在灰度,获取不到加密信息,getUserInfo返回的也是匿名的信息,这个怎么解决呢?
      04-16
      1
      回复
    • starry
      starry
      04-19回复噜啦噜啦嘞
      开发版和体验版拿不到加密信息,正式版是没有问题的
      04-19
      回复
    查看更多(1)
  • Elvin
    Elvin
    06-09

    用promise.all(),完整代码实现:https://viencoding.com/article/300

    代码片段:

    wxLogin: function (e) {
        let p1 = this.wxSilentLogin() // 把wx.login封装成promise对象
        let p2 = this.wxGetUserProfile() // 把wx.getUserProfile封装成promise对象
        Promise.all([p1, p2]).then((res) => {
          let code = res[0]
          let iv = res[1].iv
          let encryptedData = res[1].encryptedData
          // 请求服务器 登录
        }).catch((err) => {
          console.log(err)
        })
      }
    }
    


    06-09
    有用 1
    回复
  • 燕玖
    燕玖
    06-02

    我使用 uniapp 开发的,但可以借鉴下。初学者,如有错误请见谅!

    用wx.login获取code后在回调里发起一个弹窗用于触发wx.getUserProfile

    代码如下:

    wx.login({
      success(res) {
        if (res.code) {
          const code = rs.code;
          uni.request({//获取openID
            url: 'https://jiudaotian.cn', //仅为示例,并非真实接口地址。
            data: {code: code},
            success: (rs) => {//返回状态来判断是否授权过了
              uni.showModal({
                title: '提示',
                content: '检查到您是首次使用小程序,我们希望获得您的个人信息,以便为您提供更好的服务!',
                showCancel: false,
                success: function(res) {
                  if (res.confirm) {
                    wx.getUserProfile({
                      desc: '用于完善用户资料', 
                      success: (res) => {
                      }
                    });
                  }
                }
              });
          }
        });
        }
      }
    });
    


    06-02
    有用 1
    回复 4
    • .._
      .._
      06-02回复k
      并不会,这里用户已经做了手动触发
      06-02
      回复
    • .._
      .._
      06-02
      完美解决
      06-02
      回复
    • k
      k
      06-02回复.._
      嗯嗯 没问题,但是会有两个弹窗。还有就是如果需要用wx.login的code和wx.getUserProfile获取的加密信息,然后解密,这样写有些不妥。code有效期是5分钟。如果五分钟没有点击按钮。就会有问题啦。
      06-02
      回复
    • 叶耳朵😰
      叶耳朵😰
      2天前
      调用手机号也可以这么整。
      2天前
      回复
  • ffffff
    ffffff
    05-28

    后端如果有用Binary Wang的工具包的话,需要注意

    #我当前使用weixin-java-miniapp工具包版本为3.9.0
    # 用code换SessionKey
    WxMaJscode2SessionResult jsCode2SessionDTO = wxMaService.jsCode2SessionInfo(code);
    # 解析获取用户信息
    WxMaUserInfo maUserInfoDTO = wxMaService.getUserService().getUserInfo(jsCode2SessionDTO.getSessionKey(), encryptedData, iv);
    

    WxMaUserInfo对象中不存在openId了,要用WxMaJscode2SessionResult中的openid和unionId

    05-28
    有用
    回复
  • Josie🥽
    Josie🥽
    05-13

    可以先调用getUserProfile再调用wx.login

    05-13
    有用
    回复 1
    • 小白
      小白
      18小时前
      不能这么做,这样会偶发性解密失败
      18小时前
      回复
  • 小满鲤跃
    小满鲤跃
    05-11

    我遇到的问题是code和参数传过去啦就解析不成功

    05-11
    有用
    回复 1
    • 小满鲤跃
      小满鲤跃
      05-11
      wx.getUserProfile 加密信息解密不出来怎么回事? 哪位大佬帮忙解惑
      05-11
      回复
  • 沙隆巴斯
    沙隆巴斯
    04-22

    我发现反过来调用,先执行getUserProfile再login,也能顺利解码加密内容,是不是微信在这个新api(getUserProfile)上做了兼容???

    04-22
    有用
    回复 2
    • momo路人乙
      momo路人乙
      04-22
      会签名出错
      04-22
      回复
    • starry
      starry
      04-22
      只要不在回调里执行,先执行哪个都行
      04-22
      回复

正在加载...

登录 后发表内容
问题标签