微信小程序获取微信绑定受权手机号

方法:

一、使用<button>组件,并将该组件的open-type的属性值设置为getPhoneNumber,绑定bindgetphonenumber事件
二、当用户点击容许时,能够经过绑定事件的回调获取到微信服务返回的加密数据
三、调用login接口,获取到用户的code
四、将获取手机号事件返回的加密数据结合sessionkey、appid以及login接口返回的code传给后端提供的接口进行解密获取手机号。web

示例:

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> </button>
Page({ 
    getPhoneNumber: function(e) { 
        console.log(e.detail.errMsg) 
        console.log(e.detail.iv) 
        console.log(e.detail.encryptedData) 
    } 
})

返回参数说明:

encryptedData(String):包括敏感数据在内的完整用户信息的加密数据
iv(String):加密算法的初始向量
errMsg(String):信息

敏感数据的获取大多都是将以上返回的除errMsg以外参数以及code传给后端提供的接口,由后端进行解密后返回解密后的数据,获取到的解密数据以下:算法

{
	"code":200,
    "phoneNumber": "xxxxx",  
    "purePhoneNumber": "xxxxx", 
    "countryCode": "86",
    "msg": "请求成功",
    "time": "1590486884",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":"1590486884"
    }
}

具体示例:

getPhoneNumber: function (e) {
    console.log(e.detail.iv);
    console.log(e.detail.encryptedData);
    wx.login({
        success: res => {
            console.log(res.code);
            if(res.code){
              wx.request({
                 url: '解密地址',
                 data: {
                     'encryptedData': encodeURIComponent(e.detail.encryptedData),
                     'iv': e.detail.iv,
                     'code': res.code
                 },
                 method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
                 header: {
                     'content-type':'application/json'
                 }, // 设置请求的 header
                 success: function (res) {
                     if (res.status == 200 ) {//我后台设置的返回值为200时为成功
                     	//do something
                     }
                 },
                 fail: function (err) {
                     //do something
                 }
             })
            }
        }
    })
}

在用户容许获取手机号以后,有时还会调用checkSession接口来判断用户是不是在登陆状态下容许获取手机号。json