注:所有接口均使用统一的请求头参数,若接口单独注明了请求头参数,则使用接口注明的参数
请求参数:
Headers
| 参数名称 | 是否必选 | 说明/示例 |
|---|---|---|
| Content-Type | 是 | application/json;charset=UTF-8 |
| token | 是 | 获取token接口返回的access_token |
| secretId | 是 | 接口服务提供方提供的厂商唯一编号ID |
| nonce | 是 | 唯一随机码 |
| timestamp | 是 | 当前时间戳(13位,单位:ms) |
| sign | 是 | 用户方签名(签名规则详见下方) |
签名生成规则说明:
1.参数要求
所有参数必须为字符串类型(String)
参数值为 null 时会被自动忽略
必须包含以下固定参数:
nonce
secretId
secretKey (厂商密钥,服务方提供)
timestamp
token
2. 签名生成流程
步骤1:参数排序
按参数名的 ASCII 字典序升序排列
示例排序后顺序(假设参数名包含 a, c, b):a=1 & b=2 & c=3
步骤2:参数拼接
拼接格式:key=value&(最后一个 & 删除)
示例: nonce=abc123&secretId=123456&secretKey=abcdef×tamp=1717020800&token=xyz789
步骤3:MD5 加密
对拼接后的字符串使用 MD5 算法 生成摘要(32位小写 MD5 值)
编码方式:UTF-8
参考代码:
import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;
public class SignUtils {
/**
* 生成 MD5 签名
* @param params 需要签名的参数(key-value 形式)
* @return 32位小写 MD5 签名值
*/
public static String sign(Map<String, String> params) {
// 1. 参数排序(按 ASCII 字典序升序)
TreeMap<String, String> sortedParams = new TreeMap<>(params);
// 2. 构建待签名字符串
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
if (entry.getValue() != null) {
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
// 3. 移除末尾多余的 '&'
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
// 4. 生成 MD5 摘要
return md5(sb.toString());// 最终签名结果
}
/**
* 计算 MD5 哈希值
* @param input 待计算字符串
* @return 32位小写 MD5 值
*/
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes(java.nio.charset.StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException("MD5 计算失败", e);
}
}
}
版本变更说明:
无