获取微信用户绑定的手机号,需先调用wx.login
接口。
因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。
注意:目前该接口针对非个人开发者
,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。
微信官方文档链接点这里
直接下载后端代码点这里
解压后有多种语言版本的:C++、Node、PHP、Python版本的
我这里使用的PHP版本的,整理之后后端代码如下(其中使用的默认也是官方提供的)
我这里是为了阅读方便一些,将分模块整理的代码都放到了一起,需要的可以自行按照下载的demo进行整理
public function demo() {
$appid = isset( $_REQUEST[ 'appid' ] ) ? $_REQUEST[ 'appid' ] :'wx4f4bc4dec97d474b';
$sessionKey = isset( $_REQUEST[ 'sessionKey' ] ) ? $_REQUEST[ 'sessionKey' ] :'tiihtNczf5v6AKRyjwEUhQ==';
$encryptedData = isset( $_REQUEST[ 'encryptedData' ] ) ? $_REQUEST[ 'encryptedData' ] : "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
3hVbJSRgv+4lGOETKUQz6OYStslQ142d
NCuabNPGBzlooOmB231qMM85d2/fV6Ch
evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
/Hz7saL8xz+W//FRAUid1OksQaQx4CMs
8LOddcQhULW4ucetDf96JcR3g0gfRK4P
C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
20f0a04COwfneQAGGwd5oa+T8yO5hzuy
Db/XcxxmK01EpqOyuxINew==";
$iv = isset( $_REQUEST[ 'iv' ] ) ? $_REQUEST[ 'iv' ] :'r7BXXKkLb8qrSNn05n0qiA==';
$errCode = $this->decryptData($encryptedData, $iv, $data, $appid, $sessionKey);
if ($errCode == 0) {
print $data;
} else {
print($errCode . "\n");
}
}
public function decryptData( $encryptedData, $iv, &$data, $appid, $sessionKey) {
if (strlen(stripslashes($sessionKey)) != 24) {
return -41001;
}
$aesKey=base64_decode($sessionKey);
if (strlen($iv) != 24) {
return -41002;
}
$aesIV=base64_decode($iv);
$aesCipher=base64_decode($encryptedData);
$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$dataObj=json_decode( $result );
if( $dataObj == NULL )
{
return -41003;
}
if( $dataObj->watermark->appid != $appid )
{
return -41003;
}
$data = $result;
return 0;
}
对接口进行调用,如果获得了如下json字符串即为成功
进行json解码之后将是如下数据
{
"openId":"oGZUI0egBJY1zhBYw2KhdUfwVJJE",
"nickName":"Band",
"gender":1,
"language":"zh_CN",
"city":"Guangzhou",
"province":"Guangdong",
"country":"CN",
"avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0",
"unionId":"ocMvos6NjeKLIBqg5Mr9QjxrP1FA",
"watermark":{
"timestamp":1477314187,
"appid":"wx4f4bc4dec97d474b"
}
}
但是你会发现这里没有手机号,这个我也没深究原因,但是我用实际的数据是能够拿到手机号的
首先是组件必须要使用button
而且open-type
属性是getPhoneNumber
,并且使用@getphonenumber
事件
<template>
<view class="content">
<button @click="login">Loginbutton>
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">getPhoneNumberbutton>
view>
template>
当点击getPhoneNubmer
按钮的时候将会弹出一个授权信息的弹窗
当点击允许之后会执行如下代码
这里分为几个关键步骤
getPhoneCall
这个必须要
)js_code
session_key
getPhoneCall(e) {
// 改变this指向
let _this = this;
uni.getUserInfo({
async complete() {
await uni.login({
success: async (res) => {
let jsCode = res.code;
// 获取sessionKey
let sessionKeyRes = await _this.$http.api({
url: 'jscode2session',
params: {
// 小程序appid
appid: '你的appid',
// 小程序密钥
secret: '你的小程序密钥',
// 登录后获得的一个code
js_code: jsCode
},
host: 'https://api.weixin.qq.com/sns/'
});
// 获取手机号
let telRes = await _this.$http.api({
url: 'demoLan',
params: {
appid: '你的appid',
sessionKey: sessionKeyRes.data.session_key,
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
},
host: '你的接口host地址'
});
// 在这里能够获取到包括手机号在内的相关信息
console.log(telRes.data);
},
});
}
})
}
特别说明:_this.$http.api
方法是封装的一个request
请求方法,请自行更改即可
进行调用之后页面数据如下,在预览接口返回值出能够拿到相应的电话号码
数据json解码之后如下所示
这里有一个小问题,就是接口没处理好,将html文档也返回过来了,这个我就不在这里说了,自行处理即可