API 签名调试

从参数到字节,一步一步定位签名不一致。

本地处理

输入 JSON 或参数表格,按规则生成待签名原文,再计算签名。

01

输入参数

本地处理
输入方式

支持字符串、数字、布尔值与 null;重复名称、嵌套对象和数组会被拒绝。大整数请用字符串。

02

原文规则

字符集
UTF-8 固定
前后缀与附加秘密 进阶规则

不自动适配支付平台,不执行用户脚本,也不发起业务接口请求。

03

签名配置

Web Crypto

HMAC 签名与验证使用相同的秘密密钥。

按所选编码解读真实密钥字节,不会保存或上传。

UTF-8 字节字典序 · LF · UTF-8

修改任一输入或规则后,旧结果会自动失效。

让每一步都可核对

执行后依次查看筛选、排序、拼接、原文和真实字节,定位签名不一致的位置。

跨语言对照示例

固定测试数据

JDK 17+。固定非生产示例;原文为 UTF-8(51 字节),结果为小写 Hex。示例不会代入或导出你当前的密钥。

Java · HMAC-SHA256
import java.nio.charset.StandardCharsets;
import java.util.HexFormat;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class HmacExample {
  public static void main(String[] args) throws Exception {
    String canonical = "app_id=demo_app&nonce=test-001&timestamp=1700000000";
    byte[] message = canonical.getBytes(StandardCharsets.UTF_8);
    byte[] secret = "demo-secret-do-not-use".getBytes(StandardCharsets.UTF_8);
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(new SecretKeySpec(secret, "HmacSHA256"));
    System.out.println(HexFormat.of().formatHex(mac.doFinal(message)));
  }
}
预期输出
020f6c15465ad073c9d9fbf6ceb635b050115804aac3553f80159a0b5d075d54

如何使用

  1. 通过 JSON、键值表或原始字符串输入。JSON 模式仅接受扁平对象,重复键会明确报错。
  2. 明确排序、空值、Null、分隔符、转义、前后缀和换行规则。
  3. 逐步检查筛选、排序、拼接、最终原文、UTF-8 Hex 和签名或验签结果。

了解使用边界

这是通用可配置调试工具,不宣称自动兼容支付平台。不执行自定义 JavaScript,不请求真实业务接口,不保存 Secret。

常见问题

同一个 JSON 为什么可能生成不同签名?

字段顺序、空值处理、URL 转义和换行都可能改变原文。先对齐最终 UTF-8 字节,再比较算法和密钥。

默认排序是否依赖语言区域设置?

不依赖。字典序明确定义为 UTF-8 字节升序,不使用可能随语言环境变化的 localeCompare。