1、原理步骤
- 第一步:调用微信小程序login接口,获得一个code值
- 第二步:拿到code值,将其发送给服务端。
- 获取openid(用户惟一标识)和sessionkey(会话密钥)。
- 第三步:利用获得的sessionKey调用getPhoneNumber接口
- 经过参数【encryptedData】 、【iv】 、【sessionKey】 请求后台解密获取用户手机号
2、getPhoneNumber返回参数说明
- encryptedData:包括敏感数据在内的完整用户信息的加密数据
- encryptedData 解密后为如下 json 结构
{
"phoneNumber": "13580006666", //用户绑定的手机号(国外手机号会有区号)
"purePhoneNumber": "13580006666", //没有区号的手机号
"countryCode": "86",//区号
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}
复制代码
3、实践代码
<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(); //从新登陆
}
});
}
})
复制代码