158 lines
4.5 KiB
PHP
158 lines
4.5 KiB
PHP
<?php
|
|
namespace App\ServicePay;
|
|
trait ThirdPaySignTrait
|
|
{
|
|
/**
|
|
* md5 大写签名
|
|
* @param string $method
|
|
* @param array $requestData
|
|
* @param string $payKey
|
|
* @param array $filter
|
|
* @return string 签名MD5转大写
|
|
*/
|
|
public function md5Verify(string $method,array $requestData,string $payKey,array $filter=[]):string {
|
|
if ($method == 'create') {
|
|
$keyVal = self::keySortMd5Filter($requestData, $filter);
|
|
$keyVal = $keyVal . "key=" . $payKey;
|
|
$mysgin = strtoupper(md5($keyVal));
|
|
} else {
|
|
$keyVal = self::keySortMd5Filter($requestData, $filter);
|
|
$keyVal = $keyVal . "key=" . $payKey;
|
|
$mysgin = strtoupper(md5($keyVal));
|
|
}
|
|
return $mysgin;
|
|
}
|
|
|
|
/** key val 不用等号链接
|
|
* @param $requestData
|
|
* @param $payKey
|
|
* @param $filter
|
|
* @return string
|
|
*/
|
|
public function md5KeyLower(array $requestData,$payKey,array $filter=[]):string {
|
|
$tempArr = [];
|
|
foreach ($requestData as $key => $val) {
|
|
if (!in_array($key, $filter)) {
|
|
$tempArr[strtolower($key)] = strtolower($val);
|
|
}
|
|
}
|
|
ksort($tempArr);
|
|
$keyVal = '';
|
|
foreach ($tempArr as $key2 => $val2) {
|
|
$keyVal .= $key2 . $val2;
|
|
}
|
|
$keyVal = $keyVal . $payKey;
|
|
$mysgin = strtolower(md5($keyVal));
|
|
return $mysgin;
|
|
}
|
|
|
|
/**
|
|
* 只对key value 排序 不拼KEY 不 MD5
|
|
* @param array $requestData
|
|
* @param array $filter
|
|
* @return string
|
|
*/
|
|
private static function keySortMd5Filter(array $requestData,array $filter=[]):string {
|
|
$tempArr = [];
|
|
foreach ($requestData as $key => $val) {
|
|
if (!in_array($key, $filter)) {
|
|
$tempArr[$key] = $val;
|
|
}
|
|
}
|
|
ksort($tempArr);
|
|
$keyVal = '';
|
|
foreach ($tempArr as $k => $val) {
|
|
$keyVal .= $k . "=" . $val . "&";
|
|
}
|
|
return $keyVal;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param array $requestData
|
|
* @param string $split
|
|
* @param array $filter
|
|
* @return string
|
|
*/
|
|
public static function valueKeySortSplitFilter(array $requestData,string $split='|',array $filter=[]):string {
|
|
$tempArr = [];
|
|
foreach ($requestData as $key => $val) {
|
|
if (!in_array($key, $filter)) {
|
|
$tempArr[$key] = $val;
|
|
}
|
|
}
|
|
ksort($tempArr);
|
|
$keyVal = '';
|
|
foreach ($tempArr as $k => $val) {
|
|
$keyVal .= $val . $split;
|
|
}
|
|
return trim($keyVal,$split);
|
|
}
|
|
|
|
|
|
/**
|
|
* 根据用户指定的顺序排列 用value拼接
|
|
* @param array $requestData
|
|
* @param array $userSort
|
|
* @param string $split
|
|
* @return string
|
|
*/
|
|
public function userSortValueSplitFilter(array $requestData, array $userSort, string $split = '|'): string
|
|
{
|
|
$keyVal = '';
|
|
foreach ($userSort as $r) {
|
|
if (array_key_exists($r, $requestData)) {
|
|
$keyVal .= $requestData[$r] . $split;
|
|
}
|
|
}
|
|
return trim($keyVal, $split);
|
|
}
|
|
|
|
/**
|
|
* 使用指定的一些字段签名拼接
|
|
* @param array $requestData
|
|
* @param array $userParam
|
|
* @param string $split
|
|
* @return string
|
|
*/
|
|
public function userParamSplitKeyValue(array $requestData,array $userParam,string $split='|'):string {
|
|
$tempArr = array_filter($requestData, function ($k) use ($userParam) {
|
|
return in_array($k, $userParam);
|
|
}, ARRAY_FILTER_USE_KEY);
|
|
ksort($tempArr);
|
|
$keyVal = '';
|
|
foreach ($tempArr as $k => $val) {
|
|
$keyVal .= $k . "=" . $val . $split;
|
|
}
|
|
return trim($keyVal, $split);
|
|
}
|
|
|
|
/**
|
|
* @param $publicKey
|
|
* @return string
|
|
*/
|
|
public function formatPublicKey($publicKey){
|
|
$publicKey = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($publicKey, 64, "\n") . "-----END PUBLIC KEY-----";
|
|
return $publicKey;
|
|
}
|
|
|
|
/**
|
|
* 验证签名
|
|
* @param string $data 数据
|
|
* @param string $sign 签名
|
|
* @param string $publicKey 公钥
|
|
* @return bool
|
|
*/
|
|
public function verifySign($data = '', $sign = '', $publicKey = '')
|
|
{
|
|
if (!is_string($sign) || !is_string($sign)) {
|
|
return false;
|
|
}
|
|
return (bool)openssl_verify(
|
|
$data,
|
|
base64_decode($sign),
|
|
$publicKey,
|
|
OPENSSL_ALGO_SHA256
|
|
);
|
|
}
|
|
} |