微信小程序:获取用户手机号码的过程

这几天是疫情期间,老板为了配合我们公司的线上产品,让我们技术人员开发了一个简单的小程序,在开发过程中,就提到了获取用户手机号码的需求,然后我查阅了微信小程序开发文档,由此,我想记录一下,方便我以后查阅
首先,思路要明确,要想获取手机号码,那我们就得微信授权,微信授权的话,那我们就得获取微信的登录,所以第一步,调用微信登录的api:

wx.login({
  success (res) {
    if (res.code) {
      //发起网络请求
      wx.request({
        url: 'https://test.com/onLogin',
        data: {
          code: res.code
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

然后,我们将获取到的code,发送给后台,后台会返回一个oppenId给前端,然后我们开始调用获取手机号码的api
在这里插入图片描述
官方文档说的很详细

 getPhoneNumber (e) {
    console.log(e.detail.iv)
    console.log(e.detail.encryptedData)
    if(e.detail.iv)){//表示授权成功,自己可以测试一下,成功后就可以发送请求给后台,获取解密 后的手机号码
    }
  }

此处还有一个问题,就是授权成功的前提,需要登录,一开始,我是在获取手机号码的地方,先登录,登录成功后,我在手机号码进行授权的,但是这样会存在问题, 当时报了英文错误

The given payload is invalid

其实这个错误,官方文档给了注意,当时自己没有留意这些在重点突出一下

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

所以最好将登录放在周期函数onload()里面,然后就不会出现这个问题了,为了避免重复登录,我们可以将登录写在checkSesson里面

         wx.checkSession({
            success () {
                     //session_key 未过期,并且在本生命周期一直有效
                 },
            fail () {
                     // session_key 已经失效,需要重新执行登录流程
                    wx.login({
                        success (res) {
                            if (res.code) {
                            //发起网络请求-获取openId等参数,存储起来
                            wx.request({
                                url: 'https://hdxcx.cdamai.com/wechat/login',
                                method: 'POST',
                                data: {
                                        code: res.code,
                                        scene:decodeURIComponent(options.scene)
                                    },
                                header: {
                                    'content-type':'application/x-www-form-urlencoded',
                                    'Accept': 'application/json'
                                },
                                success (res) {
                                        let code = res.data.code;
                                        if(code == "0"){
                                                wx.setStorageSync('openId',res.data.data.openid);
                                        }else{
                                            wx.showToast({
                                                title:'登录失败',
                                                icon: 'none',
                                                duration: 2000
                                                });
                                        }
                                    }
                            },
                            )
                            } else {
                                    console.log('登录失败!' + res.errMsg)
                            }
                        }
                        })
            }
            })

别的好像没什么可记录的了,后期遇到问题,我会慢慢补充的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值