> For the complete documentation index, see [llms.txt](https://apidoc.tokenpay.me/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://apidoc.tokenpay.me/zh-cn/shuo-ming/qian-ming-yan-zheng.md).

# 签名验证

{% hint style="info" %}
说明

商户可以按照下述步骤验证应答或者回调的签名。

如果验证商户的请求签名正确，在应答的 HTTP 头部中包括应答签名。我们建议商户验证应答签名。

同样的，在回调的 HTTP 头部中包括回调报文的签名。商户必须 验证回调的签名，以确保回调是由 我们 发送。
{% endhint %}

### 构造验签名串 <a href="#gou-zao-yan-qian-ming-chuan" id="gou-zao-yan-qian-ming-chuan"></a>

首先，商户先从应答中获取以下信息。

* HTTP 头 Timestamp 中的应答时间戳。
* HTTP 头 Nonce 中的应答随机串。
* 应答主体（response Body），需要按照接口返回的顺序进行验签，错误的顺序将导致验签失败。

签名串一共有三行，每一行为一个参数。行尾以 `\n`（换行符，ASCII 编码值为 0x0A）结束，最后一行不用加`\n`。如果参数本身以 `\n`结束，也需要附加一个`\n`。

```
应答时间戳\n
应答随机串\n
应答报文主体
```

如某个应答的 HTTP 报文为：

{% code overflow="wrap" %}

```
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 02 Apr 2019 12:59:40 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2204
Connection: keep-alive
Keep-Alive: timeout=8
Content-Language: zh-CN
TTPay-Nonce: c5ac7061fccab6bf3e254dcf98995b8c
TTPay-Signature: CtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/OLYqFuzbjt3yOBzJSKQqJsvbXILffgAmX4pKql+Ln+6UPvSCeKwznvtPaEx+9nMBmKu7Wpbqm/+2ksc0XwjD+xlvlECkCxfD/OJ4gN3IurE0fpjxIkvHDiinQmk51BI7zQD8k1znU7r/spPqB+vZjc5ep6DC5wZUpFu5vJ8MoNKjCu8wnzyCFdA==
TTPay-Timestamp: 1554209980
Cache-Control: no-cache, must-revalidate

{"app_id":"xxxx"}
```

{% endcode %}

则验签名串为

```
1554209980
c5ac7061fccab6bf3e254dcf98995b8c
{"app_id":"xxxx"}
```

### 获取应答签名 <a href="#huo-qu-ying-da-qian-ming" id="huo-qu-ying-da-qian-ming"></a>

我们 的应答签名通过 HTTP 头 Signature 传递。（注意，示例因为排版可能存在换行，实际数据应在一行）

{% code overflow="wrap" %}

```
CtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/OLYqFuzbjt3yOBzJSKQqJsvbXILffgAmX4pKql+Ln+6UPvSCeKwznvtPaEx+9nMBmKu7Wpbqm/+2ksc0XwjD+xlvlECkCxfD/OJ4gN3IurE0fpjxIkvHDiinQmk51BI7zQD8k1znU7r/spPqB+vZjc5ep6DC5wZUpFu5vJ8MoNKjCu8wnzyCFdA==
```

{% endcode %}

### 判断签名 <a href="#pan-duan-qian-ming" id="pan-duan-qian-ming"></a>

使用`AES-256-ECB`的方法生成签名（可参考[签名生成](/zh-cn/shuo-ming/qian-ming-sheng-cheng.md#jia-mi-qian-ming-chuan)）。生成后的签名跟应答签名做对比。不一致则表示数据遭到篡改。
