小程序中也有使用手机号作为验证手段的地方,今天又写了一个接入考拉信用查询个人信用分的项目,封装成为小程序,查询信用分需要手机号、姓名、身份证号,所以我直接使用微信官方给提供的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 )进行对称解密。 解密算法如下:
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
- 对称解密的目标密文为 Base64_Decode(encryptedData)。
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
- 对称解密算法初始向量 为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;
调用接口直接就可以拿到手机号,特此补充。
用得tp3吧
@中国好码农 嗯
用得tp5还是tp3啊
session_Key放在全局变量中不会过期吗
@陈崇强 请求会重新请求
@沈唁 登陆请求成功后,在关闭该小程序之前session_key是不会过期的是嘛?还是说
@陈崇强 我并没有测试会不会过期。这个只是获取手机号,需要一直获取?点一次就获取到了呀
日常支持一下~小程序玩的越来越溜了~
@西枫里博客 上班决定权不在自己 只能学咯
个人开发怎么用呢
@蒙牛慢燃奶昔 个人开发无法使用该API接口
目前该接口针对非个人开发者… 😈
@龙笑天 龙大佬第一次评论!!! 我是给公司开发的,肯定是企业的小程序啦 哈哈哈