签名算法
签名用于验证请求合法性,防止参数被篡改。
签名步骤
- 收集所有请求参数(不含
sign字段本身),包括 Body 参数或 Query 参数 - 按参数名字典升序排列,拼接为
k1=v1&k2=v2&...kn=vn - 拼接签名原文:
HTTP方法 + Host + 接口路径 + 参数字符串 + App Secret - 对原文计算 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.comApp Secret在开发者控制台获取,请勿泄露给最终用户