> 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/pt-br/descricao/verificacao-de-assinatura.md).

# Verificação de assinatura

{% hint style="info" %}
DICA (TIP)

O comerciante pode verificar a assinatura da resposta ou do retorno de chamada (callback) seguindo as etapas abaixo.

Se a assinatura de requisição do comerciante verificado estiver correta, o tokenpay inclui a assinatura de resposta no cabeçalho HTTP da resposta. Recomendamos que os comerciantes verifiquem a assinatura da resposta.

Da mesma forma, o tokenpay inclui a assinatura do pacote de callback no cabeçalho HTTP do callback. O comerciante deve verificar a assinatura do callback para garantir que ele foi enviado pelo tokenpay.
{% endhint %}

#### Concatenar (Concatenate)

Primeiramente, o comerciante obtém as seguintes informações da resposta.

* Carimbo de data/hora de resposta no cabeçalho HTTP `TTPay-Timestamp`.
* String aleatória de resposta no cabeçalho HTTP `TTPay-Nonce`.
* Corpo da Resposta (Response Body). Verifique a interface de acordo com a ordem retornada pela interface. Uma ordem incorreta causará a falha na verificação.

A string de assinatura tem três linhas, um parâmetro por linha. A linha termina com `\n` (quebra de linha, o valor de codificação ASCII é 0x0A), e não adicione `\n` na última linha. Se o próprio parâmetro terminar em `\n`, você também precisará anexar um `\n`.

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

Por exemplo, uma mensagem de resposta HTTP é a seguinte:

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

Então, a string de assinatura é:

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

#### Resposta (Reply)

A assinatura de resposta do tokenpay é transmitida através do cabeçalho HTTP `TTPay-Signature`. (Nota: Exemplo, pois a formatação pode conter quebras de linha, os dados reais devem estar em uma única linha)

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

#### Julgamento (Judgment)

Use o método `AES-256-ECB` para gerar assinaturas (Você pode consultar a [geração de assinatura](/pt-br/descricao/geracao-de-assinatura.md)). A assinatura gerada é comparada com a assinatura de resposta. Se não corresponder, os dados foram adulterados.
