工具:微信开发者工具、thinkphp3.2框架
- 调用接口wx.login()获取登录凭证(code)
- 通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等。
- 用户通过getPhoneNumber组件,引导用户确认授权。拿到encryptedData和iv。
- 将获取到的session_key、encryptedData、iv传给后台。后台通过解密算法将用户的手机号解析出来。
(1)(2) 调用接口获取code,进而获取登录态信息
微信js代码
onLoad: function (options) {
var that = this;
wx.login({
success(res) {
if (res.code) {
wx.request({
url: 'https://dove.io/userCode.html',
data: {
code: res.code,
},
header: {
'content-type': 'application/json' // 默认值
},
method: 'GET',
success: function (res) {
console.log("user", res.data);
that.setData(res.data.infos)//记录用户登录态信息
}
})
} else {
console.log("获取失败");
}
}
})
},
PHP端代码
public function userCode(){
$code = I("get.code");
$infos = get_openid($code);
echo json_encode(array('infos'=>$infos));die();
}
(3)用户通过getPhoneNumber组件,引导用户确认授权。拿到encryptedData和iv
微信wxml代码
微信js代码
getPhoneNumber(e) {
var that = this;
console.log(that.data);
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
if (e.detail.errMsg == "getPhoneNumber:ok") {
wx.request({
url: 'https://dove.io/decodePhone.html',
data: {
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
sessionKey: that.data.session_key,
uid: "",
},
method: "post",
header: {
"Content-Type": "application/x-www-form-urlencoded" //用于post
},
success: function (res) {
console.log('decodePhone',res);
}
})
}
},
(4)将获取到的session_key、encryptedData、iv传给后台。后台通过解密算法将用户的手机号解析出来
PHP端代码
public function decodePhone(){
$appid = 'wxdf639c624640153e';
$sessionKey = $_POST['sessionKey'];
$encryptedData= $_POST['encryptedData'];
$iv = $_POST['iv'];
require './php-sdk/TelApiData/wxBizDataCrypt.php';
$pc = new \WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
}
php端调用的几个公共函数
①get_openid($code) :用code获取openid和session_key
//获取openid和session_key
function get_openid($code){
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid=.$appid.&secret=.$secret.&js_code=' . $code . '&grant_type=authorization_code';
$userlist = json_decode(file_get_contents($url), ture);//获取到openid 和session_key
return $userlist;
}
② 解密手机号的接口文件 (文件以资源的方式在文章的顶部,如有需要可以下载来看看)
(微信官方提供了多种编程语言的示例代码官方接口)
项目结构图
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;
}
?>
温馨提示:不要被庞大的代码量吓着了~逻辑很简单,代码量看着多,其实只不过是解密那部分占得多,对解密有兴趣的可以深入学习一下,不深入学习的,就调用方法就好了。