101 lines
2.2 KiB
PHP
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);
|
|
}
|
|
|
|
}
|