E企盈营销工具技术服务商 热线:4006-838-530

关于小程序获取手机号第一次失败,第二次成功的解决方案

E企盈直播平台营销卖货系统

获取手机号的官方文档其中有这样一句话(划重点)注意在回调中调用 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            }        })    }, })

赞(0) 打赏
未经允许不得转载:E企盈小程序开发-热线:4006-838-530 » 关于小程序获取手机号第一次失败,第二次成功的解决方案
分享到: 更多 (0)
E企盈小程序直播营销卖货系统
E企盈直播平台营销卖货系统

评论 抢沙发

E企盈小程序开发

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏