首页|接入文档
API v1

签名算法

签名用于验证请求合法性,防止参数被篡改。

签名步骤

  1. 收集所有请求参数(不含 sign 字段本身),包括 Body 参数或 Query 参数
  2. 按参数名字典升序排列,拼接为 k1=v1&k2=v2&...kn=vn
  3. 拼接签名原文:HTTP方法 + Host + 接口路径 + 参数字符串 + App Secret
  4. 对原文计算 MD5(32位小写十六进制)

签名公式

// 伪代码
params = 所有参数(不含sign),按key升序排列
paramStr = params.map(k => k+"="+v).join("&")
raw = METHOD + host + path + paramStr + app_secret
sign = MD5(raw).toLowerCase()

C# 示例

using System.Security.Cryptography;
using System.Text;

string CalcSign(string method, string host, string path,
    Dictionary<string, string> prms, string secret) {
    var sorted = prms
        .Where(kv => kv.Key != "sign")
        .OrderBy(kv => kv.Key)
        .Select(kv => $"{kv.Key}={kv.Value}");
    string paramStr = string.Join("&", sorted);
    string raw = method.ToUpper() + host + path + paramStr + secret;
    using var md5 = MD5.Create();
    byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(raw));
    return Convert.ToHexString(hash).ToLower();
}

Python 示例

import hashlib, time, random, string

def calc_sign(method, host, path, params, secret):
    items = sorted(
        [(k, v) for k, v in params.items() if k != "sign"],
        key=lambda x: x[0]
    )
    param_str = "&".join(f"{k}={v}" for k, v in items)
    raw = method.upper() + host + path + param_str + secret
    return hashlib.md5(raw.encode()).hexdigest()

# 示例
params = {
    "app_key": "your_app_key",
    "card": "XXXX-XXXX-XXXX",
    "device_id": "device_001",
    "nonce": "".join(random.choices(string.ascii_lowercase, k=16)),
    "timestamp": int(time.time()),
}
params["sign"] = calc_sign("POST", "your.domain.com",
    "/api/v1/card/login", params, "your_app_secret")

注意事项

  • GET 请求的参数在 Query String 中;POST 请求的参数在 JSON Body 中
  • Host 为请求的域名(含端口,如有),例如 verify.example.com
  • App Secret 在开发者控制台获取,请勿泄露给最终用户