记录开发中微信授权登录遇到的坑
发布于 4 年前 作者 nwang 3759 次浏览 来自 分享

登录流程图

1、wxml代码


注意:此处一定用 open-type="getUserInfo" button元素,因为用这个button元素,就算用户拒绝了授权,每次点击都会弹出授权窗口,而如果绑定事件,调用wx.getUserInfo()接口,如果用户未授权,不会弹出授权弹窗

接口调整说明 wx.getUserInfo()> 在用户未授权过的情况下调用此接口,将不再出现授权弹窗,会直接进入 fail 回调(详见《公告》)。在用户已授权的情况下调用此接口,可成功获取用户信息

2、js代码

/**
 * 微信授权登录
 * [@param](/user/param) e
 */
bindGetUserInfo: function (e) {
  let {detail} = e;
  if (detail.userInfo) {  //允许授权
    var that = this;
    wx.showLoading({
      title: '授权登录中'
    })
    // TODO 1、先调用微信登录接口获取到code
    wx.login({
      success(res) {
        // TODO 2、再次调用微信getUserInfo接口获取加密的敏感信息encryptedData和iv 
       // [为什么不用上面的detail中的encryptedData和iv,因为那是在获取code之前获取的,
       // 这样就导致后台拿到code换取的sessionkey是新的,而detail中的encryptedData和iv是用旧的加密的,导致解密时报错]
          wx.getUserInfo({
            success: function (userInfo) {
              // 后台拿到code、encryptedData、iv再加小程序的appId和秘钥appsecret(秘钥放在服务器,最好不要前端传给后台)去请求微信服务器,换取session_key和openid
             api.wxLogin({
                code: res.code,
                encryptedData: userInfo.encryptedData,
                iv: userInfo.iv,
            }).then(loginRes => {
                wx.hideLoading()
                wx.showToast({
                  title: '微信授权登录成功',
                  icon: 'none'
                })
             // 到此,后台就可以从微信服务器拿到用户的openid,如果小程序的主体在微信开放平台还有其他应用,如安卓、ios、web,就可以拿到unionId
            })
          }
        })
      },
      complete() {

      }
    })
  } else {
    //用户按了拒绝按钮
    wx.showModal({
      title: '警告',
      content: '您点击了拒绝授权,将无法使用微信快捷登录!',
      showCancel: false,
      confirmText: '返回',
      success: function (res) {
        if (res.confirm) {
          console.log('用户点击了“返回授权”')
        }
      }
    })
  }
},

注意:在bindGetUserInfo回调中,如果用户同意授权,调用wx.login拿到code后需再次调用微信getUserInfo接口获取加密的敏感信息encryptedData和iv

[为什么不用上面的detail中的encryptedData和iv,因为那是在获取code之前获取的,这样就导致后台拿到code换取的sessionkey是新的,而detail中的encryptedData和iv是用旧的加密的,导致解密时报错] (这个巨坑,我和后台都饱受折磨)

回到顶部