手机号授权提示失败?
手机号授权提示失败,网上的大部分解决办法是,在回调里先`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
刷新登录态。
我对此的理解:
获取手机号授权,用户点击确定之后,有两种结果:
- 在登录态:这种情况下,如果在回调中调用`wx.login`,此时可能刷新了登录态(code变成了新的code),但传给后端的加密信息,还是原来的sessionkey进行的加密信息(因为先获取的加密信息,在回调中调用的wx.login)。后端用新code去微信换取sessionKey,解老code对应的sessionkey加密的信息,导致解密失败。(个人理解,不知道对不对,有大神给孩子看一下吧~)
正确的做法是,在登录态,不进行`wx.login`
- 不在登录态,还是会存在 新code去微信换取sessionKey, 解老code对应的sessionkey加密的信息 这种情况啊? 哪理解错了?求指点!