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

3 篇文章 0 订阅
3 篇文章 0 订阅

获取手机号的官方文档

其中有这样一句话(划重点)

注意

在回调中调用 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
            }
        })
    },
 
})
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值