TP框架集成微信小程序getPhoneNumber获取手机号功能

小程序中也有使用手机号作为验证手段的地方,今天又写了一个接入考拉信用查询个人信用分的项目,封装成为小程序,查询信用分需要手机号、姓名、身份证号,所以我直接使用微信官方给提供的API直接调用微信绑定的手机号, 也省得发送验证码的钱了~ 这个集成之前写小程序的时候就已经写好了,今天发出来。 

说明

获取微信用户绑定的手机号,需先调用login接口。

因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button> 组件的点击来触发。

注意:目前该接口针对非个人开发者,且完成了认证的小程序开放。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。

使用方法

需要将 <button> 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>

TP框架集成

返回的参数是加密的,需要进行解密,同样微信官方也提供了加密数据解密算法,demo在文末的相关文档中进行下载。

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

demo下载后将wxBizDataCrypt.php和errorCode.php放到自定义目录吧,我是放在Public下面了,控制器里写方法,引入文件

/**
 *
 * TP框架集成微信小程序getPhoneNumber获取手机号功能 | 沈唁志
 * 博客地址:https://qq52o.me/1855.html
 */
	    public function Number()
	    {
	      include_once ("./Public/Home/Number/wxBizDataCrypt.php"); //引入wxBizDataCrypt.php文件
	      $appid = '你的小程序appid';
	      $sessionKey = I('get.sessionKey');
	      $encryptedData= I('get.encryptedData');
	      $iv = I('get.iv');
	      
	      $pc = new \WXBizDataCrypt($appid, $sessionKey); //注意使用\进行转义
	      $errCode = $pc->decryptData($encryptedData, $iv, $data );
	      
	      if ($errCode == 0) {
	          print($data . "\n");
	      } else {
	          print($errCode . "\n");
	      }
	    }

小程序请求

小程序请求部分中需要json字符串转对象,可查看这篇文章。小程序getPhoneNumber获取手机号中json字符串转对象

  getPhoneNumber: function (e) {
    var that = this;
    wx.request({
      url: 'https://www.yoursite.com/index.php/Home/Api/Number', //换成你的域名
      data: {
        sessionKey: app.globalData.session_key, //全局变量中的sessionKey
        encryptedData: e.detail.encryptedData,  //包括敏感数据在内的完整用户信息的加密数据
        iv: e.detail.iv
      },
      header: {
        'content-type': 'application/json'
      },
      success: function (res) {
/**
 * 小程序getPhoneNumber获取手机号中json字符串转对象 | 沈唁志
 * 博客地址:https://qq52o.me/1638.html
 */
        var jsonStr = res.data;
        jsonStr = jsonStr.replace(" ", "");
        if (typeof jsonStr != 'object') {
          jsonStr = jsonStr.replace(/\ufeff/g, "");
          var sy = JSON.parse(jsonStr);
          res.data = sy;
        }
        that.setData({
          numbers: res.data,
        })
        // console.log(res.data.purePhoneNumber);
      }
    })
  },

这样就可以省去小程序中获取验证码的步骤了,简单快捷,毕竟微信绑定手机是每个正常人都会去做的。我只能说我白写一下午小程序了 好气 没办法 老板任性,过两天分享wx.login登陆接口。


2018年3月21日补充:

公司通知我获取不到手机号了,上来看看,发现线上接口API文件是好的,去找解码文件没了,传上去以后还是报错,仔细看了一下是函数报错。删除以后解决问题,so,用不上以下代码啦

        var jsonStr = res.data;
        jsonStr = jsonStr.replace(" ", "");
        if (typeof jsonStr != 'object') {
          jsonStr = jsonStr.replace(/\ufeff/g, "");
          var sy = JSON.parse(jsonStr);
          res.data = sy;

调用接口直接就可以拿到手机号,特此补充。

相关文档

6 条评论

发表评论

*