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;
}