# Proceso de Notificación

## <mark style="color:blue;">Notificación</mark>

Una notificación será enviada cada vez que cambie el status de un retiro.&#x20;

Por razones de seguridad no enviamos el estado del retiro en la notificación. Una vez que enviamos la notificación, puede ser sacada utilizando el Endpoint de Estado de Retiro.

&#x20;Las notificaciones serán enviadas a la `notification_url` en el request, o por de default en la "URL de Retiros" que está configurada en su panel vía **POST** protocolo en el formato **x-www-form-urlencoded.**

## <mark style="color:blue;">Testing en Staging</mark>

En el entorno STG, puede forzar que se envíe una notificación a su URL de notificación desde el Panel de Comerciantes de STG yendo a la página Transacciones -> Retiros, abriendo la transacción de retiro y haciendo clic en una de las opciones que aparecerán al hacer clic en el botón de tres puntos en la parte superior derecha de la pantalla. Esas opciones cambiarán el estado del retiro y enviarán la notificación respectiva después de unos minutos.

## &#x20;![](https://content.gitbook.com/content/GjMKy3VezYlJlCCcjySW/blobs/uSKTqNjUUjYLM3CDwDeL/image.png)

## <mark style="color:blue;">Respuesta de la notificación</mark> <a href="#notifications-fields" id="notifications-fields"></a>

```json
    date=2020-03-12%2020%3A26%3A11
    &bank_reference_id=
    &comments=
    &external_id=cashoutV35381
    &control=A4CFF64E78C4BD01F8BFCA4AFF04632EC4A33CC61BD6BBD156BA1289897892EB
    &cashout_id=60067
    &status_reason=
```

<table data-header-hidden><thead><tr><th width="186.33333333333331">Campo</th><th width="242">Formato</th><th>Descripcion</th></tr></thead><tbody><tr><td>Campo</td><td>Formato</td><td>Descripción</td></tr><tr><td>date</td><td>Fecha. Formato: YYYY-MM-DD HH:MM:SS (GMT)</td><td>Fecha que el retiro cambio su estado</td></tr><tr><td>bank_reference_id</td><td>string</td><td><p>(max length 50)</p><p>Id de referencia del banco (si aplica)</p></td></tr><tr><td>comments</td><td>string</td><td><p>(max length 200)</p><p>Comentarios (si aplica)</p></td></tr><tr><td>external_id</td><td>string</td><td><p>(max length 100)</p><p>ID del retiro que enviaron al crearlo</p></td></tr><tr><td>control</td><td>string</td><td>Control signature de la notificacion</td></tr><tr><td>cashout_id</td><td>number</td><td>ID del retiro de nuestro lado</td></tr><tr><td>status_reason</td><td>string</td><td>Razon del estado (si aplica)</td></tr></tbody></table>

El control string de las notificaciones está compuesto por caracteres aleatorios al principio y al fin del request, y la  `external_id` recibido en el medio.

{% hint style="info" %}
El control string debería ser generado utilizando su secret key (API Signature) y debe estar en mayúsculas.&#x20;

Asegurarse de convertir el mensaje a hash en formato UTF-8 para prevenir errores.
{% endhint %}

Ejemplos:

{% tabs %}
{% tab title="JAVA" %}

```java
public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
      String external_id = "cashoutID1234";
      String message = "Be4" + external_id + "Bo7";
      String apiSignature = "your_deposits_api_signature";

      Mac hasher = Mac.getInstance("HmacSHA256");
      hasher.init(new SecretKeySpec(apiSignature.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
      byte[] result = hasher.doFinal(message.getBytes(StandardCharsets.UTF_8));

      System.out.println(StringUtils.upperCase(DatatypeConverter.printHexBinary(result)));
}

```

{% endtab %}

{% tab title="PHP" %}

```php
$external_id = 'cashoutID1234';
$message = 'Be4' . $external_id . 'Bo7';
$api_signature = 'cashout_api_signature';

$hash = strtoupper(hash_hmac('sha256', pack('A*', $message), pack('A*', $api_signature)));

```

{% endtab %}

{% tab title="C#" %}

```csharp
 string external_id = "cashoutID1234";
 string message = "Be4" + external_id + "Bo7";
 string apiSignature = "your_cashouts_api_signature";
 
 byte[] keyByte = new System.Text.Encoding.UTF8.GetBytes(apiSignature);
 byte[] messageBytes = new System.Text.Encoding.UTF8.GetBytes(message);
 byte[] hashmessage = new HMACSHA256(keyByte).ComputeHash(messageBytes);

 string control = BitConverter.ToString(hashmessage).Replace("-", "").ToUpper();
```

{% endtab %}
{% endtabs %}

## <mark style="color:blue;">Lógica de Reintentos y Reenvió de Notificaciones</mark>

{% tabs %}
{% tab title="Logica de reintentos" %}
Cada vez que el estado del retiro cambie, enviaremos una notificación con este cambio.&#x20;

En caso de que su servidor no pueda recibir la notificación, y fue devuelto un código HTTP code diferente a 2XX, se reintentará enviar la notificación 5 veces o hasta que un código HTTP 2XX sea presente, lo que pase primero.&#x20;

{% hint style="success" %}
En caso de errores, asegúrense de que la notificación enviada sea distinta a una con código HTTP 2XX, así se reintenta automáticamente.
{% endhint %}
{% endtab %}

{% tab title="Reenviar notificaciones." %}
En caso de que su sistema no pudo recibir la notificación correcta luego de 5 intentos, se podrá realizar manualmente.&#x20;

Esto se puede realizar yendo al merchant panel, elegir el retiro (transacciones --> Retiros), y hacer click en los 3 puntos arriba a la derecha del estado de la notificación, y tocar "reenviar notificación".

{% hint style="success" %}
La notificación puede tardar hasta 2 minutos en ser reenviada.
{% endhint %}
{% endtab %}
{% endtabs %}
