手机号授权提示失败?
发布于 5 年前 作者 minshi 885 次浏览 来自 官方Issues

手机号授权提示失败,网上的大部分解决办法是,在回调里先`wx.checkSession`,如果还在登录态就不`wx.login`,以下是网上的解决代码

  getPhoneNumber (e) {
      //授权手机号,用户点击确认
    if ('getPhoneNumber:ok' === e.detail.errMsg) {
        wx.checkSession({
            success (res) {
                //session_key 未过期,并且在本生命周期一直有效
                const code = wx.getStorageSync('code')
                //将之前登录code传给后端,getPhoneNo是后端接口
        		getPhoneNo(code, e)
                   },
                fail () {
                  // session_key 已经失效,需要重新执行登录流程
                wx.login({
                    success: function(res) {
                    //将新获取的code传给后端,getPhoneNo是后端接口
                    getPhoneNo(res.code, e)
                    }
                })
            }
	})
    } else {
    ...
    }
  }

官方文档中给出

在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。

我对此的理解:

获取手机号授权,用户点击确定之后,有两种结果:

  1. 在登录态:这种情况下,如果在回调中调用`wx.login`,此时可能刷新了登录态(code变成了新的code),但传给后端的加密信息,还是原来的sessionkey进行的加密信息(因为先获取的加密信息,在回调中调用的wx.login)。后端用新code去微信换取sessionKey,解老code对应的sessionkey加密的信息,导致解密失败。(个人理解,不知道对不对,有大神给孩子看一下吧~)

 正确的做法是,在登录态,不进行`wx.login`

  1. 不在登录态,还是会存在 新code去微信换取sessionKey, 解老code对应的sessionkey加密的信息 这种情况啊?  哪理解错了?求指点!
回到顶部