这几天是疫情期间,老板为了配合我们公司的线上产品,让我们技术人员开发了一个简单的小程序,在开发过程中,就提到了获取用户手机号码的需求,然后我查阅了微信小程序开发文档,由此,我想记录一下,方便我以后查阅
首先,思路要明确,要想获取手机号码,那我们就得微信授权,微信授权的话,那我们就得获取微信的登录,所以第一步,调用微信登录的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)
}
}
})
}
})
别的好像没什么可记录的了,后期遇到问题,我会慢慢补充的