wxml页面
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
js处理事件
getPhoneNumber(e){
console.log(e)
let errMsg=e.detail.errMsg
let encryptedData=e.detail.encryptedData
let iv=e.detail.iv
wx.request({
url: 'http://www.tp.com/api/phone',
method:"POST",
header: {
'token':wx.getStorageSync('token')
},
data:{
errMsg,
encryptedData,
iv
},
success:(res)=>({
data:res.detail
})
})
}
后台处理
public function phone(Request $request){
$res=request()->uid;
$appid = config('phone.AppId');
$sessionKey = Cache::get('session_key');
$encryptedData=input('encryptedData');
$iv = input('iv');
$pc= new WxBui($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
$data = json_decode($data,true);
$id =request()->uid;
if ($errCode == 0) {
User::update(['mobile'=>$data['phoneNumber']],['id'=>$id]);
return json(['code'=>200,'msg'=>'成功','phone'=>$data['phoneNumber']]);
} else {
return ['code'=>200,'msg'=>'失败','data'=>null];
}
}
创建一个common文件夹,跟模块同级别
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 ErrorCodes::$IllegalAesKey;
}
$aesKey = base64_decode($this->sessionKey);
if (strlen($iv) != 24) {
return ErrorCodes::$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 ErrorCodes::$IllegalBuffer;
}
if ($dataObj->watermark->appid != $this->appid) {
return ErrorCodes::$IllegalBuffer;
}
$data = $result;
return ErrorCodes::$OK;
}
错误码封装
public static $OK = 0;
public static $IllegalAesKey = -41001;
public static $IllegalIv = -41002;
public static $IllegalBuffer = -41003;
public static $DecodeBase64Error = -41004;