统一请求头

注:所有接口均使用统一的请求头参数,若接口单独注明了请求头参数,则使用接口注明的参数

请求参数:

Headers

参数名称是否必选说明/示例
 Content-Type 是 application/json;charset=UTF-8
 token 是 获取token接口返回的access_token
 secretId 是 接口服务提供方提供的厂商唯一编号ID 
 nonce 是 唯一随机码
 timestamp 是 当前时间戳(13位,单位:ms)
 sign 是 用户方签名(签名规则详见下方)


签名生成规则说明:

    1.参数要求

    • 所有参数必须为字符串类型(String)

    • 参数值为 null 时会被自动忽略

    • 必须包含以下固定参数:

      1. nonce

      2. secretId

      3. secretKey (厂商密钥,服务方提供)

      4. timestamp

      5. token

    2. 签名生成流程

    • 步骤1:参数排序

            按参数名的 ASCII 字典序升序排列

            示例排序后顺序(假设参数名包含 a, c, b):a=1 & b=2 & c=3

    • 步骤2:参数拼接 

                拼接格式:key=value&(最后一个 & 删除)

                示例: nonce=abc123&secretId=123456&secretKey=abcdef&timestamp=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);

                    }

                }

}


版本变更说明:

    无