# Autentificación y cálculo de Signature

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

Para autenticarte, nuestra API de retiro utiliza API Keys en todos los requests. Las API Keys  se pueden obtener en Configuración -> API  -> Retiros.

{% hint style="info" %}

* Las API keys entre Staging y Produccion son distintas.
  {% endhint %}

Hay 3 credenciales que necesitara:

* Tu usuario: <mark style="color:blue;">**API KEY**</mark>
* Tu contraseña: <mark style="color:blue;">**API Passphrase**</mark>
* Tu clave secreta para generar la signature: <mark style="color:blue;">**API Signature**</mark>

<figure><img src="https://2298703647-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGjMKy3VezYlJlCCcjySW%2Fuploads%2FQ1LyArv67UWh917C5SMk%2Fimage.png?alt=media&#x26;token=5c0df9b8-9c17-453d-8ab4-37bd3cdb6311" alt=""><figcaption></figcaption></figure>

La autenticación a la API es realizado mediante [HTTP Basic Auth](http://en.wikipedia.org/wiki/Basic_access_authentication). Las API Keys deben estar en todos los  requests como el username and password.

Tu usuario y password son enviadas como <mark style="color:blue;">**API KEY**</mark>  y <mark style="color:blue;">**API Passphrase**</mark> respectivamente en el cuerpo del request.

Las API keys, como las IPs whitelisteadas, son formas de autenticarte, por ende, por favor no compartir las credenciales en ningún ámbito que sea público.

## <mark style="color:blue;">Encabezados</mark>

<table data-header-hidden><thead><tr><th width="195">Header</th><th width="101" align="center">Format</th><th width="119" align="center">Mandatory</th><th>Description</th></tr></thead><tbody><tr><td>Encabezado</td><td align="center">Formato</td><td align="center">Obligatorio</td><td>Descripción</td></tr><tr><td>Payload-Signature</td><td align="center">String</td><td align="center">Si</td><td>HMAC256 del archivo  JSON entero, utilizando su API signature</td></tr><tr><td>Content-Type</td><td align="center">String</td><td align="center">Si</td><td><code>application/json</code></td></tr><tr><td>User-Agent</td><td align="center">String</td><td align="center">Si</td><td>Server client user agent</td></tr></tbody></table>

## <mark style="color:blue;">Cálculo de Signature</mark>

Todos los requests a nuestra API de retiros deben tener el field `Payload-Signature` para asegurar la integridad y autenticarse, ya que estarán utilizando su propia API signature (secret key) para generar y encriptar un hash.&#x20;

Debe ser creado utilizando el encoding **HMAC-SHA-256 (RFC 2104)** y el payload se basa en toda la JSON Payload enviada en el body del request y notificaciones.

{% hint style="success" %}
Utilize su API Signature para generar el Hash
{% endhint %}

El campo `Payload-Signature`  en el header del request contendrá el hash generado, que incluye todo el payload del JSON

> Payload-Signature: HMAC256(jsonPayload)

Ejemplo:

> Payload-Signature: 223a9dd4784726f1536c926da7dc69155a57612c5c3c1e1b429c367a5eee67cf

<details>

<summary>Notas</summary>

* La`Payload-Signature` distingue mayúsculas y minúsculas (case sensitive)
* En caso de que el `jsonPayload` este vacío, utilice un string vacío en vez del jsonPayload
* El `jsonPayload` debe ser convertido a UTF-8 antes de convertirlo a hash, para evitar el error `Invalid Signature`

</details>

## Ejemplo <a href="#examples" id="examples"></a>

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

```java
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.net.util.Base64;

String json_payload = "{ \"login\": \"cashout_API_Key\", \"pass\": \"cashout_API_Passphrase\",   \"external_id\": \"123456789\",  \"document_id\": \"1234567899\",  \"document_type\": \"\",   \"cashout_type\": \"BANK\", \"beneficiary_name\": \"Test User\", \"beneficiary_lastname\": \"Test User\",  \"country\": \"MX\",  \"amount\": 2000,  \"currency\": \"MXN\",  \"email\": \"test@test.com\", \"notification_url\": \"http:\\/\\/tupaypagos.com\\/notification\",  \"bank_code\": \"072\",\"bank_branch\": \"\",  \"bank_account\": \"1234567890\", \"account_type\": \"C\", \"address\": \"\"}";
String secretKey = "cashout_secret_key";
Mac hasher = Mac.getInstance("HmacSHA256");
hasher.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"));
String payload_signature = Base64.encodeBase64String(hasher.doFina
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
$json_payload = '{
"login": "cashout_API_Key",
"pass": "cashout_API_Passphrase",
"external_id": "123456789",
"document_id": "1234567899",
"document_type": "", 
"cashout_type": "BANK",
"beneficiary_name": "Test User",
"beneficiary_lastname": "Test User",
"country": "MX",
"amount": 2000,
"currency": "MXN",
"email": "test@test.com",
"notification_url": "http://www.tupayonline.com/notification",
"bank_code": "072",
"bank_branch": "",
"bank_account": "1234567890",
"account_type": "C",
"address": ""
}';
$secretKey = "cashout_secret_key";
$payload_signature = strtolower(hash_hmac('sha256', pack('A*', $json_payload), pack('A*', $secretKey)));
?>
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Text;
using System.Security.Cryptography;

string jsonPayload = "{ \"login\": \"cashout_API_Key\", \"pass\": \"cashout_API_Passphrase\",   \"external_id\": \"123456789\",  \"document_id\": \"1234567899\",  \"document_type\": \"\",   \"cashout_type\": \"BANK\", \"beneficiary_name\": \"Test User\", \"beneficiary_lastname\": \"Test User\",  \"country\": \"MX\",  \"amount\": 2000,  \"currency\": \"MXN\",  \"email\": \"test@test.com\", \"notification_url\": \"http:\\/\\/www.tupayonline.com\\/notification\",  \"bank_code\": \"072\",\"bank_branch\": \"\",  \"bank_account\": \"1234567890\", \"account_type\": \"C\", \"address\": \"\"}";
string secretKey = "cashout_secret_key";        
byte[] keyByte = new ASCIIEncoding().GetBytes(secretKey);
byte[] jsonPayloadBytes = new ASCIIEncoding().GetBytes(jsonPayload);
byte[] hashmessage = new HMACSHA256(keyByte).ComputeHash(jsonPayloadBytes);
string payloadSignature = BitConverter.ToString(hashmessage).Replace("-", "").ToLower();
```

{% endtab %}
{% endtabs %}

<br>
