小程序中也有使用手机号作为验证手段的地方,今天又写了一个接入考拉信用查询个人信用分的项目,封装成为小程序,查询信用分需要手机号、姓名、身份证号,所以我直接使用微信官方给提供的 API 直接调用微信绑定的手机号, 也省得发送验证码的钱了~ 这个集成之前写小程序的时候就已经写好了,今天发出来。
获取微信用户绑定的手机号,需先调用login接口。
因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button>
组件的点击来触发。
注意:目前该接口针对非个人开发者,且完成了认证的小程序开放。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。
需要将 <button>
组件 open-type
的值设置为 getPhoneNumber
,当用户点击并同意之后,可以通过 bindgetphonenumber
事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key
以及 app_id
进行解密获取手机号。
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
返回的参数是加密的,需要进行解密,同样微信官方也提供了加密数据解密算法,demo 在文末的相关文档中进行下载。
接口如果涉及敏感数据(如
wx.getUserInfo
当中的 openId 和 unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:
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;
调用接口直接就可以拿到手机号,特此补充。
沈唁志|一个PHPer的成长之路!
原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:TP框架集成微信小程序getPhoneNumber获取手机号功能