时间:2019-01-18
微信小程序获取手机号。
首先,来看看官方文档:
代码示例:
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
Page({
getPhoneNumber(e) {
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
}
})
返回参数说明:
encryptedData - String :包括敏感数据在内的完整用户信息的加密数据
iv - String:加密算法的初始向量
说明我们需要的手机号就被加密隐藏在encryptedData这个数据中,我们只需要根据微信官方的要求解密即可获得一个如下的对象:
{
"phoneNumber": "13580006666",
"purePhoneNumber": "13580006666",
"countryCode": "86",
"watermark": {
"appid": "APPID",
"timestamp": TIMESTAMP
}
}
那怎么解密呢?
首先要使用wx.login()方法登陆,获取登录凭证(code),然后再把code通过wx.request()发送给后台,后台通过code可以获取用户的会话密钥 session_key,微信openid之类的东西,wx.request()这个ajax请求成功后,再把刚才的加密信息e.detail.encryptedData/e.detail.iv再次wx.request()Ajax发送给后台解密。
这里有两个明显的请求后台服务器的Ajax过程,这是因为我们需要openid,所以显式的请求了第一次,因为要解密获取微信手机号,所以显式的Ajax请求了第二次。
注意,后台每次向腾讯微信服务器请求的sessionkey都是不一样的,千万不要以为请求一次保存下来就可以多次使用。
Page({
getPhoneNumber(e) {
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
wx.login({
success: function (res) {
// res.code
console.log('success:', res);
// 第一次Ajax,是封装好的wx.request()方法
api.getOpenId({
code: res.code,
grandType:"authorization_code"
}).then(res => {
console.log('getOpenId:',res);
// 第二次Ajax,是封装好的wx.request()方法
api.getPhoneNumber({
openId: res.openId,
iv: e.detail.iv,
encryptedData: e.detail.encryptedData
}).then(res => {
console.log('getPhoneNumber:', res);
app.globalData.phoneNumber = res.phoneNumber
});
})
},
fail: function (err) {
console.log('err:', err);
}
});
}
})
如果你只需要解密手机号,则可以将code,iv,encryptedData一次发送给后台,不管如何,过程肯定是不变的,后台通过code获取session_key,然后再解密返回给前端。
如果有必要,还需要checkSession判断,判断一下sessionkey是不是已过期。
wx.checkSession({
success() {
// session_key 未过期,并且在本生命周期一直有效
_this.getPhoneFn(dataObj);
},
fail() {
// session_key 已经失效,需要重新执行登录流程
// 重新登录
wx.login({
......
});
}
});