关于小程序获取手机号第一次失败,第二次成功的解决方案 | 您所在的位置:网站首页 › 手机一直提示登录成功 › 关于小程序获取手机号第一次失败,第二次成功的解决方案 |
获取手机号的官方文档 其中有这样一句话(划重点) 注意在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。 解密失败一般是由于你的 sessionKey 失效导致的,而sessionKey 由 wx.login 这个api先获取code, 再由我们的后台拿这个code向微信服务器请求获得。code有效期五分钟。 这句话怎么理解呢,打个比方,假设你第一次调用wx.login获取的为 sessionKey_1,在它的有效期内,你再去获取一个加密数据 encryptedData_1,这时候你用sessionKey_1去解密encryptedData_1就可以正常解密。 但是在获取encryptedData_1的时候会有个回调函数,如果你在这个回调函数里又调了一次wx.login,获取了 sessionKey_2,这时候登录态可能会被刷新,加密encryptedData_1时使用的sessionKey_1就会失效,再去解密encryptedData_1就会有很高的几率解密失败。至于为什么不会百分百刷新登录态,鬼知道这逻辑是怎么写的。 贴上我的部分代码(只贴获取手机号的部分,其他逻辑请根据自己产品业务酌情参考) const app = getApp(); Page({ data: { code: "", }, // 获取手机号 getPhoneAndLogin: function(e){ let that = this; // console.log(e); if (e.detail.errMsg !== "getPhoneNumber:ok"){ return; } wx.showLoading({ mask: true, }) // 检查登录态是否过期 wx.checkSession({ success(res) { // session_key 未过期,并且在本生命周期一直有效 // console.log(res); wx.request({ url: app.globalData.apiUrl + '**********', data: { code: that.data.code, encryptedData: e.detail.encryptedData, iv: e.detail.iv, }, method: "POST", success: res => { // console.log(res); }, fail: res => { wx.showToast({ icon: "none", title: '服务器繁忙', }) }, complete: res => { wx.hideLoading(); } }) }, fail(err) { // session_key 已经失效,需要重新执行登录流程 wx.login({ success: res => { that.data.code = res.code } }) } }) }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { let that = this; // console.log(options); wx.login({ success: res =>{ that.data.code = res.code } }) }, }) |
CopyRight 2018-2019 实验室设备网 版权所有 |