签名规则
本文档详细说明了如何生成和验证接口请求的签名,确保接口调用的安全性。
签名算法说明
接口采用RSA2(SHA256WithRSA)签名算法,商户使用商户私钥对请求参数进行签名,平台使用商户公钥验证签名。
签名生成步骤
签名生成流程
- 获取所有请求参数(除sign参数外)
- 将参数按照参数名ASCII码从小到大排序
- 将排序后的参数名和参数值使用=连接,并使用&连接多个参数
- 使用商户私钥对待签名字符串进行签名,并进行Base64编码
1. 示例代码(PHP)
function generateSign($params, $privateKey) {
//1. 去除sign参数
unset($params['sign']);
//2. 按照参数名ASCII码从小到大排序
ksort($params);
//3. 将参数名和参数值使用=连接,并使用&连接多个参数
$signStr = '';
foreach($params as $k => $v) {
if($v !== '' && $v !== null) {
$signStr .= $k . '=' . $v . '&';
}
}
$signStr = rtrim($signStr, '&');
//4. 使用商户私钥签名
$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($privateKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
$key = openssl_get_privatekey($privateKey);
openssl_sign($signStr, $sign, $key, OPENSSL_ALGO_SHA256);
openssl_free_key($key);
//5. Base64编码
return base64_encode($sign);
}
2. 签名示例
请求参数
{
"mch_id": "1000123",
"out_trade_no": "2023112309424200001",
"total_fee": "1.00",
"timestamp": "2023-11-23 09:42:42"
}
待签名字符串
mch_id=1000123&out_trade_no=2023112309424200001×tamp=2023-11-23 09:42:42&total_fee=1.00
签名验证步骤
验证流程
- 获取接口返回的所有参数(除sign参数外)
- 将参数按照参数名ASCII码从小到大排序
- 将排序后的参数名和参数值使用=连接,并使用&连接多个参数
- 使用平台公钥验证签名
验证示例代码(PHP)
function verifySign($params, $sign, $publicKey) {
//1. 去除sign参数
unset($params['sign']);
//2. 按照参数名ASCII码从小到大排序
ksort($params);
//3. 将参数名和参数值使用=连接,并使用&连接多个参数
$signStr = '';
foreach($params as $k => $v) {
if($v !== '' && $v !== null) {
$signStr .= $k . '=' . $v . '&';
}
}
$signStr = rtrim($signStr, '&');
//4. 使用平台公钥验证签名
$publicKey = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($publicKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
$key = openssl_get_publickey($publicKey);
$result = openssl_verify($signStr, base64_decode($sign), $key, OPENSSL_ALGO_SHA256);
openssl_free_key($key);
return $result === 1;
}
注意事项
- 签名时请确保使用UTF-8编码
- 参数值为空串或null时,不参与签名
- 参数值区分大小写
- 时间戳格式必须为:yyyy-MM-dd HH:mm:ss