# 在线验签

> 贴上请求体或回调体,这里按 Cryptomus 的规则一步步算签名,并和你自己算出的结果对比、标出第一处不同。全部在你的浏览器里算:这个页面禁止了一切网络请求,API key 不会离开你的电脑。
>
> HTML: https://blockwallets.io/docs/sign · English: https://blockwallets.io/docs/sign.md?lang=en

## 请求签名(你调我们的接口)

1. 签名原文 = 你实际发出去的请求体,一字不差(空格、换行、转义都算)。
2. base64(原文的 UTF-8 字节)。
3. sign = md5(第 2 步 + API key),放进 `sign` 请求头;`merchant` 请求头放商户 UUID。

签名不对时接口回 401,应答里的 `debug.body_base64` 是我们按收到的请求体算出的第 2 步,可以直接和你的对比。

## 回调签名(我们调你的回调地址)

1. 去掉回调体里的 `sign` 字段,其余按 PHP `json_encode` 的方式重新编码:紧凑、`/` 转义成 `\/`、中文不转义。
2. base64(第 1 步的 UTF-8 字节)。
3. md5(第 2 步 + API key) 必须等于 `sign`。用和 merchant 同一个 mode(Live / Test)的 API key。

## 常见原因

- 用了另一个 mode 或已经轮换掉的 API key。
- 框架把请求体重新序列化了(格式化、调换字段顺序、数字变格式);验签要用收到的原始请求体。
- 回调验签时没有把 `/` 转成 `\/`。

在线工具全部在浏览器里算,页面禁止一切网络请求,API key 不会离开你的电脑。各语言的验签示例代码:https://blockwallets.io/docs/cryptomus#verify
