Skip to content

签名认证

为了防止请求在传输过程中被篡改,所有接口调用都必须包含签名(sign)参数。

1. 提交防篡改

签名算法

签名生成规则如下: sha256(fieldname1=value&fieldname2=value2 + 提交防止篡改密钥)

步骤说明

  1. 筛选:获取所有请求参数,剔除 sign 字段,剔除值为空的参数。
  2. 排序:按照参数名的 ASCII 码从小到大排序(字典序)。如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推。
  3. 拼接:将排序后的参数以 key=value 的形式用 & 字符连接起来。
  4. 运算:在拼接后的字符串末尾直接拼接(注意不是用&连接)您的 secretKey,然后进行 SHA-256 运算。

示例

待签名参数

properties
amount=1
currency=USD
appKey=1755517027810275330
mcOrderId=qsCSDndIiU
notifyUrl=https://sample.com/api/gateway/test/notify
returnUrl=demo://sample.com
version=V167cd58e88b8875078b411fca65fafb66

拼接后的字符串(假设密钥为 secretKey): amount=1&appKey=1755517027810275330&currency=USD&mcOrderId=qsCSDndIiU&notifyUrl=https://sample.com/api/gateway/test/notify&returnUrl=demo://sample.com&version=V167cd58e88b8875078b411fca65fafb66secretKey

Java 代码示例

java
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SignUtils {

    public static String sign(String paramsUrlStr, String secretKey) {
        // paramsUrlStr 是已经按照key=value&key=value排序并拼接好的字符串
        return sha256(paramsUrlStr + secretKey);
    }

    public static String sha256(String input) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] encodedHash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder(2 * encodedHash.length);
            for (byte b : encodedHash) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString().toUpperCase(); // 通常转为大写,请根据实际情况调整
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
}

注意:生成的签名通常为 32 位或 64 位十六进制字符串,请参考具体接口要求(示例中为 3FC8F7C8E7E5DBAFC7208830372FC0AD)。

2. 响应防篡改

响应如果成功,data 字段不为空,且会有 sign 字段返回。商户系统应验证此签名以确保响应未被篡改。

验签规则

取响应 JSON 中的 data 字段内容,按照与请求签名相同的规则(筛选、排序、拼接)进行处理。

sha256(fieldname1=value&fieldname2=value2 + 响应防止篡改密钥)

  • 筛选并排序:同请求签名。
  • Java后端sign生成代码:同请求签名。

3. 响应数据结构

接口返回的数据格式统一为 JSON。

失败响应样例

json
{
    "code": 500,
    "msg": "Sign签名校验失败",
    "success": false
}

成功响应样例

json
{
    "code": 200,
    "msg": "操作成功",
    "data": {
        "orderId": "1763141618176012290",
        "mcOrderId": "n93N6XwKo3",
        "sign": "7C97A2EC600C4F714E3E00049090DE48"
    },
    "success": true
}

重要:务必注意仅当 code200 时,才表示业务接口成功返回。其他值均为失败,失败原因请查看 msg 字段。

Released under the MIT License.