一、原理步骤
- 第一步:调用微信小程序login接口,得到一个code值
- 第二步:拿到code值,将其发送给服务端。
- 获取openid(用户唯一标识)和sessionkey(会话密钥)。
- 第三步:利用得到的sessionKey调用getPhoneNumber接口
- 通过参数【encryptedData】 、【iv】 、【sessionKey】 请求后台解密获取用户手机号
二、getPhoneNumber返回参数说明
- encryptedData:包括敏感数据在内的完整用户信息的加密数据
- encryptedData 解密后为以下 json 结构
{
"phoneNumber": "13580006666", //用户绑定的手机号(国外手机号会有区号)
"purePhoneNumber": "13580006666", //没有区号的手机号
"countryCode": "86",//区号
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}
三、实践代码
<button
open-type="getPhoneNumber"
bindgetphonenumber="getPhoneNumber"
>
</button>
Page({
/**
* 页面的初始数据
*/
data: {
sessionkey:"",
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
wx.login({
success: res => {
var that = this
// 获取session接口
wx.request({
url: '',
data: {
'code': res.code
},
method: 'POST',
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function (res) {
that.setData({
sessionkey: res.data
});
},
fail: function (err) {
console.log(err);
}
})
}
})
},
getPhoneNumber: function(e) { //点击获取手机号码按钮
var that = this;
wx.checkSession({
success: function() {
var ency = e.detail.encryptedData;
var iv = e.detail.iv;
var sessionk = that.data.sessionKey;
if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
that.setData({
modalstatus: true
});
} else { //同意授权
wx.request({
method: "GET",
url: '',
data: {
encrypdata: ency,
ivdata: iv,
sessionkey: sessionk
},
header: {
'content-type': 'application/json' // 默认值
},
success: (res) => {
console.log("解密成功")
console.log(res)
let phone = res.data.phoneNumber
console.log(phone);
},
fail: function(res) {
console.log("解密失败~~~~~~~~~~~~~");
console.log(res);
}
});
}
},
fail: function() {
console.log("session_key 已经失效,需要重新执行登录流程");
that.wxlogin(); //重新登录
}
});
}
})