> 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-hk/shuo-ming/qian-ming-yan-zheng.md).

# 簽名驗證

{% hint style="info" %}
提示 (TIP)

商戶可按照以下步驟驗證響應或回調的簽名。

如果驗證的商戶請求簽名正確，tokenpay 會將回覆簽名包含在回覆的 HTTP 標頭中。我們建議商戶驗證響應簽名。

同樣地，tokenpay 會將回調數據包的簽名包含在回調的 HTTP 標頭中。商戶必須驗證回調的簽名，以確保該回調是由 tokenpay 發送的。
{% endhint %}

### 拼接 (Concatenate)

首先，商戶從響應中獲取以下資訊。

* HTTP 標頭 `TTPay-Timestamp` 中的回覆時間戳。
* HTTP 標頭 `TTPay-Nonce` 中的回覆隨機字串。
* 響應消息體 (Response Body)，根據接口返回的順序進行校驗。順序不正確會導致校驗失敗。

簽名字串共有三行，每行一個參數。行尾以 `\n`（換行符，ASCII 編碼值為 0x0A）結束，最後一行不添加 `\n`。如果參數本身以 `\n` 結尾，您仍需額外附加一個 `\n`。

```
Reply timestamp\n
Reply random string\n
Reply message body
```

例如，HTTP 回覆消息如下：

```
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"}
```

那麼簽名字串為：

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

### 回覆 (Reply)

tokenpay 的回覆簽名透過 HTTP 標頭 `TTPay-Signature` 傳輸。（註：此為示例，因排版可能包含換行，實際數據應在同一行）

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

### 判斷 (Judgment)

使用 `AES-256-ECB` 方法生成簽名（您可以參考[簽名生成](/zh-hk/shuo-ming/qian-ming-sheng-cheng.md)）。將生成的簽名與回覆簽名進行對比。如果不一致，則說明數據被篡改過。
