laravel8 微信小程序解密获取手机号
·
首先根据code授权登录获取openid和session_key入库
public function login(Request $request)
{
$code = $request->input('code');
$url = sprintf(config('wechat.wx_url'),config('wechat.appid'),config('wechat.secret'),$code);
$res = (new Curl())->getUrl($url);
$bool = UserModel::where('openid',$res['openid'])->first();
if ($bool){
$jwt = (new Token())->createToken($bool['id']);
UserModel::where('id',$bool['id'])->update(['session_key'=>$res['session_key']]);
return $this->ok($bool,$jwt,'登录成功');
}
$arr = [
'openid'=>$res['openid'],
'session_key'=>$res['session_key'],
'img_url'=>$request['img_url'],
'nickname'=>$request['nickname']
];
$adds = UserModel::create($arr,true);
$jwt = (new Token())->createToken($adds['id']);
return $this->ok($adds,$jwt,'注册成功');
}
根据session_key 解密手机号
public function getPhoneNumber(Request $request)
{
$arr = UserModel::where('id',$request->uid)->first();
$session_key = $arr['session_key'];
$appid = config('wechat.appid');
$encryptedData = $request->input('encryptedData');
$iv = $request->input('iv');
$pc = new WxBizDataCrypt($appid,$session_key);
$errCode = $pc->decryptData($encryptedData, $iv, $data ); //调用封装解密手机号的方法
$data = json_decode($data,true);
if($errCode == 0){
UserModel::where('id',$request->uid)->update(['phone'=>$data['phoneNumber']]);
return ['code'=>200,'msg'=>'成功','data'=>$data['phoneNumber']];
}else{
return ['code'=>$errCode,'msg'=>'失败','data'=>''];
}
}
封装解密手机号类并继承报错信息
<?php
namespace App\Server;
class WxBizDataCrypt extends ErrorCode
{
private $appid;
private $sessionKey;
/**
* 构造函数
* @param $sessionKey string 用户在小程序登录后获取的会话密钥
* @param $appid string 小程序的appid
*/
public function __construct( $appid, $sessionKey)
{
$this->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;
}
}
报错信息
<?php
namespace App\Server;
class ErrorCode
{
public static $OK = 0;
public static $IllegalAesKey = -41001;
public static $IllegalIv = -41002;
public static $IllegalBuffer = -41003;
public static $DecodeBase64Error = -41004;
}
注意点:授权获取手机号可能为报 - 41003 只需重新授权登录就能解决报错!!!
更多推荐


所有评论(0)