API 签名调试
从参数到字节,一步一步定位签名不一致。
本地处理
输入 JSON 或参数表格,按规则生成待签名原文,再计算签名。
01
本地处理输入参数
支持字符串、数字、布尔值与 null;重复名称、嵌套对象和数组会被拒绝。大整数请用字符串。
02
原文规则
字符集
UTF-8 固定
前后缀与附加秘密 进阶规则
不自动适配支付平台,不执行用户脚本,也不发起业务接口请求。
03
Web Crypto签名配置
HMAC 签名与验证使用相同的秘密密钥。
按所选编码解读真实密钥字节,不会保存或上传。
让每一步都可核对
执行后依次查看筛选、排序、拼接、原文和真实字节,定位签名不一致的位置。
跨语言对照示例
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×tamp=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
如何使用
- 通过 JSON、键值表或原始字符串输入。JSON 模式仅接受扁平对象,重复键会明确报错。
- 明确排序、空值、Null、分隔符、转义、前后缀和换行规则。
- 逐步检查筛选、排序、拼接、最终原文、UTF-8 Hex 和签名或验签结果。
了解使用边界
这是通用可配置调试工具,不宣称自动兼容支付平台。不执行自定义 JavaScript,不请求真实业务接口,不保存 Secret。
常见问题
同一个 JSON 为什么可能生成不同签名?
字段顺序、空值处理、URL 转义和换行都可能改变原文。先对齐最终 UTF-8 字节,再比较算法和密钥。
默认排序是否依赖语言区域设置?
不依赖。字典序明确定义为 UTF-8 字节升序,不使用可能随语言环境变化的 localeCompare。