---
description: >-
  IPN (Instant Payment Notification) é uma notificação enviada de um servidor
  para outro através de um pedido POST HTTP informando suas transações.
---

# Notificação

Para receber notificações sobre os eventos em sua plataforma, você tem que configurar previamente a notificação ao fazer o POST do pagamento, indicando a URL no campo notify\_url.

## Notificação

<mark style="color:green;">`POST`</mark> `$notify_url  que é definido ao submeter a transação de payin.`

Parâmetros de Notificação

#### Headers

| Name                                                 | Type   | Description                                             |
| ---------------------------------------------------- | ------ | ------------------------------------------------------- |
| Content-Type<mark style="color:red;">\*</mark>       | String | application/json                                        |
| Pagsmile-Signature<mark style="color:red;">\*</mark> | String | t=_$timestamp,v2=HMAC SHA256($_&#x52;equestBod&#x79;_)_ |

#### Request Body

| Name                                             | Type   | Description                                                             |
| ------------------------------------------------ | ------ | ----------------------------------------------------------------------- |
| trade\_no<mark style="color:red;">\*</mark>      | String | ID da transação Pagsmile                                                |
| out\_trade\_no<mark style="color:red;">\*</mark> | String | merchant out\__trade\__&#x6E;o                                          |
| out\_request\_no                                 | String | ID da transação de reembolso Pagsmile. Somente para pedido de reembolso |
| app\_id<mark style="color:red;">\*</mark>        | String |                                                                         |
| trade\_status<mark style="color:red;">\*</mark>  | String | trade status.                                                           |
| amount<mark style="color:red;">\*</mark>         | String |                                                                         |
| method<mark style="color:red;">\*</mark>         | String |                                                                         |
| currency<mark style="color:red;">\*</mark>       | String |                                                                         |
| timestamp<mark style="color:red;">\*</mark>      | String |                                                                         |

{% tabs %}
{% tab title="200: OK Merchant process the callback, and response "success"" %}
```javascript
success
```
{% endtab %}
{% endtabs %}

### Eventos <a href="#events" id="events"></a>

Sempre que um evento ocorrer, nós enviaremos uma notificação em formato json usando o HTTP POST para a URL que você especificou.

Iremos notificar os seguintes eventos:

| Ação                 | Descrição                                                                          |
| -------------------- | ---------------------------------------------------------------------------------- |
| PROCESSING           | O usuário enviou as informações de pagamento                                       |
| SUCCESS              | Transação bem sucedida                                                             |
| CANCEL               | Transação cancelada                                                                |
| RISK\_CONTROLLING    | Transação é considerada de alto risco ou não há informações claras para a cobrança |
| DISPUTE              | Transação está em disputa                                                          |
| REFUSED              | Transação foi recusada                                                             |
| REFUNDED             | transação foi reembolsada                                                          |
| CHARGEBACK           | Ocorreu o estorno                                                                  |
| CHARGEBACK\_REVERSED | Estorno revertido                                                                  |

A Pagsmile enviará notificações com o seguinte cronograma de novas tentativas e confirmação aguardando os horários. Você deve retornar um HTTP STATUS 200 (OK) com dados de resposta "sucesso" antes que o tempo correspondente expire. Caso contrário, será assumido que você não recebeu os dados corretamente e será notificado novamente.

Recomenda-se que você responda à notificação antes de executar a regra de negocio ou antes de acessar recursos externos, para não exceder os tempos de resposta estimados.

Esta comunicação é exclusivamente entre os servidores da Pagsmile e seu servidor, de modo que não haverá um usuário físico vendo qualquer tipo de resultado.

| Evento       | Tempo após o primeiro envio |
| ------------ | --------------------------- |
| Envio        | -                           |
| 1ª tentativa | 10 minutos                  |
| 2ª tentativa | 30 minutos                  |
| 3ª tentativa | 60 minutos                  |
| 4ª tentativa | 120 minutos                 |
| 5ª tentativa | 360 minutos                 |
| 6ª tentativa | 840 minutos                 |

## Verificação de assinaturas (opcional) <a href="#verifying-signatures-manually" id="verifying-signatures-manually"></a>

O conteúdo aproximado do cabeçalho Pagsmile-Signature é o seguinte (aqui com quebras de linha para fácil visualização, o conteúdo real está todo em uma linha):

```
Pagsmile-Signature:
t=1577808000,
v2=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
```

O cabeçalho Pagsmile-Signature contém um timestamp e uma assinatura. O timestamp é prefixado por t=, seguido por um timestamp UNIX; a assinatura é prefixada por v2=, seguido pelo conteúdo da assinatura.

#### Etapa 1 : Extrair o timestamp e as assinaturas do cabeçalho <a href="#step-1-extract-the-timestamp-and-signatures-from-the-header" id="step-1-extract-the-timestamp-and-signatures-from-the-header"></a>

Divida o cabeçalho usando o caracter \[,] como separador, para obter uma lista de elementos. Em seguida, dividir cada elemento usando o caractere \[=] como separador, para obter um prefixo e um par de valores.

O valor para o prefixo \[t] corresponde ao timestamp, e \[v2] corresponde à assinatura. Você pode descartar todos os outros elementos.

#### Etapa 2 : Preparar a string RequestBody original <a href="#step-2-prepare-the-original-requestbody-string" id="step-2-prepare-the-original-requestbody-string"></a>

Obtenha todo o conteúdo no RequestBody. <mark style="background-color:orange;">**Por favor, não utilize a estrutura autoconstruída do programa para formatar e/ou seriar o conteúdo do RequestBody.**</mark>. Se você tiver requisitos semelhantes, por favor, faça após obter os dados originais para verificação para evitar a ordenação desnecessária de campos e a adição de caracteres afeta a assinatura.

#### Etapa 3 : Determinar a assinatura esperada <a href="#step-3-determine-the-expected-signature" id="step-3-determine-the-expected-signature"></a>

Calcule um HMAC com a função hash SHA256. Use o SecretKey get do dashboard do comerciante como a chave (salt), e use a string RequestBody original como a mensagem.

#### Etapa 4 : Compare as assinaturas <a href="#step-4-compare-the-signatures" id="step-4-compare-the-signatures"></a>

Compare a assinatura no cabeçalho com a assinatura esperada. Para uma correspondência de igualdade, calcule a diferença entre o timestamp atual e o timestamp recebido, depois decida se a diferença está dentro de sua tolerância.

### Exemplo de Notificação

{% hint style="warning" %}
A seguinte notificação é apenas um exemplo. Métodos diferentes podem ter mais ou menos parâmetros na notificação real. Por favor, consulte o que você recebeu ao testar.
{% endhint %}

```
Content-Type: application/json
Method: POST
Header: t=1645516741, v2=f6e345eca80d74c470ba456b7b559046f22b49fcaad9b81938ff1488b0f497ac
Body:
  {
    "amount":"12.01",
    "out_trade_no":"202201010354002",
    "method":"Boleto",
    "trade_status":"SUCCESS",
    "trade_no":"2022022201111100011",
    "currency":"BRL",
    "out_request_no":"",
    "app_id":"162************38",
    "timestamp":"1645516741",
    "user":{
      "buyer_id":"",
      "identify":{
        "type":"CPF",
        "number":"50284414727"
      },
      "name":"test user name",
      "phone":"75991435892",
      "email":"test@pagsmile.com"
    },
    "card":{
      "card_no":""
    }
  }
```

## Lista de IPs de Notificação

* 13.56.110.186

{% hint style="danger" %}
Nossas notificações serão enviadas a partir destes endereços IP, favor adicioná-los à sua lista branca.
{% endhint %}
