PHP解密微信小程序手机号简单DEMO
//第一步 调用一遍wx.login获取Code
var that = this;
wx.login({
success: function (ret) {
//获取微信登陆后的code
that.data.code = ret.code;
wx.request({
url: app.config.apiUrl + "/api/wechatlogin?code=" + ret.code,
success: function (result) {
//获得服务端返回的session_key和openid
that.data.openid = result.data.openid;
that.data.session_key = result.data.session_key;
}
})
}
})
<?php
//第二步 调用微信API获取Session_key和OPENID openid在这里没啥用。
//我这里是TP5框架
public function wechatLogin(){
$appid = '';//小程序APPID
$appkey = '';//小程序的APPKEY
if(input("?code")){
$code = input("code");
$ret = curlGet("https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$appkey."&js_code=".$code."&grant_type=authorization_code");
try{
$ret = json_decode($ret);
if(property_exists($ret,'session_key')){
$session_key = $ret->session_key;
$openid = $ret->openid;
return json(["code"=>0,"session_key"=>$session_key,"openid"=>$openid]);
}else{
return json(["code"=>1,"msg"=>"获取session_key失败"]);
}
}catch(\Exception $e){
return json(["code"=>1,"msg"=>"微信返回数据异常"]);
}
}else{
return json(["code"=>1,"msg"=>"你应该传code给我。"]);
}
}
//第三步 获取微信加密后的手机号数据
//这里是微信button触发的事件 组件获取手机号的按钮
var that = this;
var postData = res.detail;
postData.code = that.data.code;
postData.session_key = that.data.session_key;
postData.openid = that.data.openid;
console.log(postData);
if (res.detail.errMsg != "getPhoneNumber:ok") {
wx.showModal({
title: '登录失败',
content: '请允许获取你的手机号,否则无法为你登录',
showCancel: false
});
} else {
wx.showLoading({
title: '微信登录中',
});
//先检查会话是否过期,如果过期,重走第一步
wx.checkSession({
success(ret) {
//会话有效 开始请求PHP解密手机号数据
wx.request({
url: app.config.apiUrl + "/api/getWechatPhone",
method: "POST",
data: postData,
success: function (result) {
wx.hideLoading()
switch (result.data.code) {
case 0:
//手机号解密成功 并且查到了相关的用户信息
wx.setStorageSync('userInfo', result.data.data);
wx.showToast({
title: "登录成功"
});
break;
default:
//登录失败
wx.showModal({
title: '登录失败',
content: result.data.msg,
showCancel: false,
})
}
}
});
},
fail: function () {
//会话过期 需要重新获得code 第一步
wx.showModal({
title: '登录失败',
content: '微信授权手机号登录失败,请重试!',
})
}
});
}
<?php
//第四步 解密第三步POST的数据 得到手机号 走自己的业务流程
//我这里是TP5框架
public function getWechatPhone(){
$appid = '';//小程序APPID
$appkey = '';//小程序的APPKEY
//判断POST的数据中是否包含code/iv(向量)/encryptedData(原始加密数据)/session_key(会话key)/openid
if(input("?code") && input("?iv") && input("?encryptedData") && input("?session_key") && input("?openid")){
$code = input("code");
$iv = input("iv");
$encryptedData = input("encryptedData");
$session_key = input("session_key");
$openid = input("openid");
try{
$isOk =true;
$aesKey=base64_decode($session_key);
if (strlen($iv) != 24) {
//非合法解密向量
$isOk =false;
}
$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 )
{
//解密数据异常
$isOk =false;
}
if( $dataObj->watermark->appid != $appid )
{
//这个就没啥用了 解密成功就行 管他是不是自己的 这是微信demo的 我没改。
$isOk =false;
}
if($isOk){
$phone = $dataObj->phoneNumber;//得到手机号
$user_info = ;//手机号查询用户是否注册
if (empty($user_info)) {
return json(["code"=>1,"msg"=>"你还没有注册,请先注册后登录"]);
}else{
$access_token=md5($User_Info['id'].mt_rand().microtime(true)).get_uuid().get_random().get_random();
//更新用户的身份令牌 生成access_token
return json(["code"=>0,"access_token"=>$access_token,"user_info"=>$user_info]);
}
}else{
return json(["code"=>1,"msg"=>"解密出了问题"]);
}
}catch(\Exception $e){
return json(["code"=>1,"msg"=>"解密出了问题"])
}
}else{
return json(["code"=>1,"msg"=>"是不是所有的参数都POST过来了?"])
}
}
完毕!
到此,解密手机号,用手机号登录就完成了