签名规则

本文档详细说明了如何生成和验证接口请求的签名,确保接口调用的安全性。

签名算法说明

接口采用RSA2(SHA256WithRSA)签名算法,商户使用商户私钥对请求参数进行签名,平台使用商户公钥验证签名。

签名生成步骤

签名生成流程

  1. 获取所有请求参数(除sign参数外)
  2. 将参数按照参数名ASCII码从小到大排序
  3. 将排序后的参数名和参数值使用=连接,并使用&连接多个参数
  4. 使用商户私钥对待签名字符串进行签名,并进行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

签名验证步骤

验证流程

  1. 获取接口返回的所有参数(除sign参数外)
  2. 将参数按照参数名ASCII码从小到大排序
  3. 将排序后的参数名和参数值使用=连接,并使用&连接多个参数
  4. 使用平台公钥验证签名

验证示例代码(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;
}

注意事项