最近公司小程序有个获取用户手机号功能,废话不多说直接上代码。
1.login方法获取code,用code调用后端接口获取sessionKey(即code2sessionAPI)
function getSessionKey() {
return new Promise((resolve, reject) => {
uni.login({
provider: 'weixin',
success: res => {
ajax({
url: `后端获取session_key接口`,
loading: false,
data: {
js_code: res.code
},
}).then(resp => {
if(resp.respCode=='T'&&resp.result.session_key){
resolve(resp.result.session_key);
}else{
console.log('接口error:',resp)
reject(resp.errorData)
}
})
},fail:res=>{
console.log('login方法error:',res)
reject(res)
}
});
})
}
2.拿到sessionKey,结合用户授权成功后得到的iv,encryptedData发送给后端做解密
getPhoneNumber(e) {
getSessionKey().then(sessionKey => {
let encryptedData = e.detail.encryptedData;
let iv = e.detail.iv;
return new Promise((resolve, reject) => {
if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
//用户取消授权
reject(e.detail.errMsg)
} else {
//同意授权
ajax({
url: `后端解密接口`,
loading: false,
data: {
sessionKey,
encryptedData,
iv
},
}).then(resp => {
if (resp.respCode == 'T') {
resolve(resp.result.phoneNumber);
} else {
reject(resp.errorData)
}
})
}
})
}).then(phone => {
//此处是绑定用户手机号和id的关联
ajax({
url: `绑定手机号接口`,
loading: false,
data: {
user_id: this.userInfo.userid,
phone
},
}).then(resp => {
if (resp.respCode == 'T') {
//绑定手机号成功
uni.showToast({
title:'授权成功',
duration:1500
})
} else {
console.log(resp.errorData)
}
})
}).catch(err => {
console.log(err)
reject(err)
})
}
注意
调用wx.login登录,可能会刷新登录态。此时服务器使用code换取的sessionKey不是加密时使用的sessionKey,导致解密失败。所以要提前进行login。此处不建议checkSession,因为checkSession不准确,在我使用时每次都返回success,但是给到后端同学的sessionKey都提示过期,所以我建议每次获取手机号都拿到最新code来保证sessionKey不会过期。
还有在和后端调试的时候,java后端说每次传给他的encyptedData和iv中的‘+’号会转化为空格,导致解密失败,希望给大家提个醒。解决方案有很多,encode或者replace都可以解决。
附上一张小程序登录状态图示:
版权声明:本文为FrontEndJin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。