(1)提供button按钮进行授权操作,设置open-type属性为getPhoneNumber,设置bindgetPhoneNumber绑定事件。
(2)编写授权绑定事件函数,先调用wx.login登录,然后调用第三方服务接口获取解析后的手机号。
//获取应用实例
const app = getApp()
Page({
data: {
},
//通过绑定手机号登录
getPhoneNumber: function (e) {
var ivObj = e.detail.iv //加密算法的初始向量
var telObj = e.detail.encryptedData //包括敏感数据在内的完整用户信息的加密数据
var codeObj = "";
var that = this;
//执行Login
wx.login({
success: res => {
//console.log('code转换', res.code);
//用code传给服务器调换session_key
wx.request({
url: 'https://www.demo.com/demo/getphone.php', //接口请求地址
data: {
appid: " ", //小程序appid,登录微信后台查看
secret: " ", //小程序secret,登录微信后台可查看
code: res.code,
encryptedData: telObj,
iv: ivObj
},
header: {
'content-type': 'application/json' // 默认值
},
//成功返回数据
success: function (res) {
let phoneObj = res.data.phoneNumber;
//console.log("手机号=", phoneObj)
//存储数据并准备发送给下一页使用
wx.setStorage({
key: "phoneObj",
data: res.data.phoneNumber,
})
}
})
}
})
}
})
(3)服务端构建,引用官方解密文件。
getphone.php
session_key;
$openid = json_decode($objSession)->openid;
$decodeData = new WXBizDataCrypt($appid, $session_key);
$errCode = $decodeData->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data. "\n");
} else {
print($errCode . "\n");
}
//模拟https
function http_curl($url){
$curl = curl_init();
//设置抓取的url
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,30);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
// https请求 不验证证书和hosts
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
//执行命令
$response=curl_exec($curl);
//关闭URL请求
curl_close($curl);
//返回数据
return $response;
}
?>
wxBizDataCrypt.php
sessionKey = $sessionKey;
$this->appid = $appid;
}
/**
* 检验数据的真实性,并且获取解密后的明文.
* @param $encryptedData string 加密的用户数据
* @param $iv string 与用户数据一同返回的初始向量
* @param $data string 解密后的原文
*
* @return int 成功0,失败返回对应的错误码
*/
public function decryptData( $encryptedData, $iv, &$data )
{
if (strlen($this->sessionKey) != 24) {
return ErrorCode::$IllegalAesKey;
}
$aesKey=base64_decode($this->sessionKey);
if (strlen($iv) != 24) {
return ErrorCode::$IllegalIv;
}
$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 ErrorCode::$IllegalBuffer;
}
if( $dataObj->watermark->appid != $this->appid )
{
return ErrorCode::$IllegalBuffer;
}
$data = $result;
return ErrorCode::$OK;
}
}
errorCode.php
* -41001: encodingAesKey 非法
* -41003: aes 解密失败
* -41004: 解密后得到的buffer非法
* -41005: base64加密失败
* -41016: base64解密失败
*
*/
class ErrorCode
{
public static $OK = 0;
public static $IllegalAesKey = -41001;
public static $IllegalIv = -41002;
public static $IllegalBuffer = -41003;
public static $DecodeBase64Error = -41004;
}
?>
demo.php
decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
参考:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html