1#微信小程序获取手机号

时间: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({
              ......
          });
        }
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。