前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小程序中wx.login与获取用户信息调用的时机

小程序中wx.login与获取用户信息调用的时机

原创
作者头像
挥刀北上
修改2020-11-10 14:30:16
2.8K0
修改2020-11-10 14:30:16
举报
文章被收录于专栏:Node.js开发Node.js开发

笔者最近在开发小程序,笔者直接嵌套的方式结合wx.login和getPhoneNumber,打算这样获取用户手机号:

代码语言:javascript
复制
getPhoneNumber(e){
        console.log(this)
        if(e.detail.errMsg.includes('ok')){
            wx.login({
            success:function(res){
            let { encryptedData, iv } = e.detail;
            console.log('code:', res.code);
            console.log('encryptedData:', encryptedData);
            console.log('iv:', iv);

            // return
            Req({
                url: apiList.getPhone,
                type: 'POST',
                data: {
                    encryptedData,
                    iv,
                    js_code: this.data.code,
                    appIdCode: '1003'
                },
                success:  (res) =>{
                    console.log(res);
                    let { openid, purePhoneNumber } = res;
                    console.log(openid, purePhoneNumber);
                    if (!openid) {

                    }
                    wx.setStorageSync("openid", openid);
                    wx.setStorageSync("phone", purePhoneNumber);
                    
                    if(this.data.back){
                        wx.redirectTo({
                            url: this.data.back
                        })
                    }else{
                        wx.navigateBack({
                            delta: 1
                        })
                    }
                    
                }
            })
            }
            })
        }else{
            console.log("用户不同意")
        }
    }

阅读上面源码,在getPhoneNumber函数中,我们先调用了wx.login,从而获取code,然后再getPhoneNumber的参数中回去iv和加密信息,将其发送给后端解密,此时有时会报错,这里微信文档已经解释的很清楚了。

注意

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

所有后面改正,提前调用login,也就是页面onload时进行login,改进代码如下:

代码语言:javascript
复制
import { apiList,Req } from "../../utils/request";
Page({
    data:{
        code:null,
        back:null
    },
    onLoad: function (options) {
        console.log("onload:", options);
        if (options.back){
            this.setData({
                back: options.back
            })
        }
        wx.login({
            success: (res) =>{
                let { code } = res;
                this.setData({code})
            }
        })
       
    },
    getPhoneNumber(e){
        console.log(this)
        if(e.detail.errMsg.includes('ok')){
            let { encryptedData, iv } = e.detail;
            console.log('code:', this.data.code);
            console.log('encryptedData:', encryptedData);
            console.log('iv:', iv);

            // return
            Req({
                url: apiList.getPhone,
                type: 'POST',
                data: {
                    encryptedData,
                    iv,
                    js_code: this.data.code,
                    appIdCode: '1003'
                },
                success:  (res) =>{
                    console.log(res);
                    let { openid, purePhoneNumber } = res;
                    console.log(openid, purePhoneNumber);
                    if (!openid) {

                    }
                    wx.setStorageSync("openid", openid);
                    wx.setStorageSync("phone", purePhoneNumber);
                    
                    if(this.data.back){
                        wx.redirectTo({
                            url: this.data.back
                        })
                    }else{
                        wx.navigateBack({
                            delta: 1
                        })
                    }
                    
                }
            })
        }else{
            console.log("用户不同意")
        }
    }

})

此时code的获取时机是早于获取电话号码的,当用加密信息去解密时,code所对应的解密信息和加密信息是配套的。

如果是第一种方式,先获取了加密信息,在去login的,此时解密信息已经更新了,拿着加密信息去解密就会报错。

每次login都会更新解密信息,并且解密信息会在微信服务器保存一段时间,我们要确保得到的加密信息是在登录之后获得的,或者这样说,我们获得的加密信息,一应要用上次login时对应的解密信息解密才能成功。

以上便是笔者在获取用户电话号码时出现的错误以及解决方法,希望对你有所帮助。

参看信息:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档