# 签名验证

{% 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`的方法生成签名（可参考[签名生成](/chinese/shuo-ming/qian-ming-sheng-cheng.md#jia-mi-qian-ming-chuan)）。生成后的签名跟应答签名做对比。不一致则表示数据遭到篡改。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://apidoc.tokenpay.me/chinese/shuo-ming/qian-ming-yan-zheng.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
