Files
pingan_new/packages/unionpay/src/Action/Init.php
2020-09-29 14:17:56 +08:00

101 lines
2.2 KiB
PHP

<?php
namespace XuanChen\UnionPay\Action;
use Illuminate\Http\Request;
class Init
{
public $params;
public $sign;
/**
* RSA验签
* @param $params 待签名数据
* @param $public_key 公钥字符串
* @param $sign 要校对的的签名结果
* return 验证结果
*/
public function checkSign($self = false)
{
$sign = $this->sign;
$sign = base64_decode($sign);
$public_key = $this->getPublic($self);
$pub_key_id = openssl_get_publickey($public_key);
$signStr = $this->getSignString($this->params);
if ($pub_key_id) {
$result = (bool)openssl_verify($signStr, $sign, $pub_key_id);
openssl_free_key($pub_key_id);
} else {
return '公钥格式有误!';
}
return $result;
}
/**
* Notes: 签名
* @Author: 玄尘
* @Date: 2020/9/29 9:56
* @return string
*/
public function getSign()
{
$signStr = $this->getSignString();
$private_key = $this->getPrivate();
$privKeyId = openssl_pkey_get_private($private_key);
if (!$privKeyId) {
return '私钥格式有误';
}
openssl_sign($signStr, $signature, $privKeyId);
openssl_free_key($privKeyId);
return base64_encode($signature);
}
/**
* 获取待签名字符串
* @param array $params 参数数组
* @return string
*/
public function getSignString()
{
$params = array_filter($this->params);
ksort($params);
$signStr = http_build_query($params);
return $signStr;
}
//获取私钥
public function getPrivate()
{
$private = config('unionpay.check.self.private');
if (!file_exists($private)) {
throw new \Exception('缺少私钥文件');
}
return file_get_contents($private);
}
//获取公钥
public function getPublic($self = false)
{
$public = config('unionpay.check.unionpay.public');
if ($self) {
$public = config('unionpay.check.self.public');
}
return file_get_contents($public);
}
}