> 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/ja-jp/yue-ming/shu-ming-jian-zheng.md).

# 署名検証

{% hint style="info" %}
Tヒント (TIP)

加盟店は以下の手順に従って、レスポンスまたはコールバックの署名を検証できます。

検証された加盟店のリクエスト署名が正しい場合、tokenpayはレスポンスのHTTPヘッダーに返信署名を含めます。加盟店にはレスポンス署名を検証することをお勧めします。

同様に、tokenpayはコールバックのHTTPヘッダーにコールバックパケットの署名を含めます。加盟店は、コールバックがtokenpayから送信されたことを確認するために、コールバックの署名を必ず検証する必要があります。
{% endhint %}

### 連結 (Concatenate)

まず、加盟店はレスポンスから以下の情報を取得します。

* HTTPヘッダー `TTPay-Timestamp` 内の返信タイムスタンプ。
* HTTPヘッダー `TTPay-Nonce` 内の返信ランダム文字列。
* レスポンス本文 (Response Body)。インターフェースから返された順序に従って確認します。順序が正しくないと検証に失敗します。

署名文字列は3行で構成され、1行につき1つのパラメーターが含まれます。行の末尾は `\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` を通じて送信されます。（注：組版の都合上、改行が含まれる場合がありますが、実際のデータは1行にする必要があります）

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

### 判定 (Judgment)

`AES-256-ECB` メソッドを使用して署名を生成します（[署名生成](/ja-jp/yue-ming/shu-ming-sheng-cheng.md) を参照できます）。生成された署名を返信署名と比較します。一致しない場合、データは改ざんされています。
