阅读 2410

微信小程序如何获取用户手机号

一、原理步骤

  • 第一步:调用微信小程序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
    }
}
复制代码
  • iv:加密算法的初始向量

三、实践代码

<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(); //重新登录
        }
      });
    }
})
复制代码
评论