SIGNATURE
04
RSA 签名算法
V2 接口统一使用 SHA256WithRSA 签名算法。V2
签名步骤
- 第一步:排序参数 —— 将所有参数按照参数名 ASCII 码从小到大排序(a-z)。
- 第二步:过滤参数 ——
sign、sign_type和空值不参与签名。 - 第三步:拼接字符串 —— 拼接成 URL 键值对格式
a=b&c=d&e=f,参数值不进行 URL 编码。 - 第四步:商户私钥签名 —— 使用商户私钥对拼接字符串进行 SHA256WithRSA 签名,结果 Base64 编码作为
sign。
验签步骤(返回数据 / 回调)
- 同样按上述规则生成待签名字符串。
- 使用平台公钥验证签名。
- 校验
timestamp时间差不超过 300 秒。
PHP 签名示例
// 生成签名
function getSign($params, $privateKey) {
ksort($params);
$str = '';
foreach ($params as $k => $v) {
if ($k == 'sign' || $k == 'sign_type' || $v === '' || $v === null) continue;
$str .= '&' . $k . '=' . $v;
}
$str = substr($str, 1);
$key = "-----BEGIN PRIVATE KEY-----\n" .
wordwrap($privateKey, 64, "\n", true) .
"\n-----END PRIVATE KEY-----";
openssl_sign($str, $sign, $key, OPENSSL_ALGO_SHA256);
return base64_encode($sign);
}
// 验签
function verifySign($params, $sign, $publicKey) {
ksort($params);
$str = '';
foreach ($params as $k => $v) {
if ($k == 'sign' || $k == 'sign_type' || $v === '' || $v === null) continue;
$str .= '&' . $k . '=' . $v;
}
$str = substr($str, 1);
$key = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($publicKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
$result = openssl_verify($str, base64_decode($sign), $key, OPENSSL_ALGO_SHA256);
return $result === 1;
}