Ir al contenido

Firma

En el caso del API de suscripciones, anulación y mall se agregó una capa más de seguridad a través de una firma que se envía en el header del request, para obtener dicha firma es necesario lo siguiente:

Se debe concatenar en formato para url el Request Path junto a todos los parámetros del request, los cuales deben ser ordenados alfabéticamente por key, tal que key=value. Por lo tanto, si el valor de email cliente es “[email protected]” el formato correcto sería “example%40domain.com” y luego concatenados con el carácter ‘&’.

Una vez que los sets de caracteres son ordenados y concatenados, el hash es calculado usando la función HMAC con cifrado tipo sha256, y el token privado.

Nota: Si un elemento de la data, tiene como valor un objeto o arreglo, se excluye de la data. Esta función esta en el ejemplo de PHP y de Javascript.

Endpoint de la API:

$request_path = urlencode('/api/suclient');

Ordenando los parámetros:

$data = [
'email' => '[email protected]',
'name' => 'John Doe',
'phone' => '923122312',
'address' => 'Moneda 101',
'country' => 'Chile',
'region' => 'Metropolitana',
'city' => 'Santiago',
'postal_code' => '850000',
'additional_parameters' => [
'parameter_1' => 'example',
'parameter_2' => 'example 2',
]
];
ksort($data);

Transformación de los parámetros a formato url:

$contador = 0;
$concatenar = null;
if (!empty($data) && !is_null($data)) {
foreach ($data as $key => $val) {
if(gettype($val)!='array' && gettype($val)!='object'){
if ($contador>0) {
$concatenar .= '&';
}
$concatenar .= $key . '=' . urlencode($val);
$contador++;
}
}
};

Concatenación de los parámetros en formato url con el endpoint de la API:

$concat = $request_path.'&'.$concatenar;

Firma:

$sign = hash_hmac('sha256', $concat, 'fe551abcef62fcf002dc598922e68f0a');

Importar dependencia CryptoJS:

const CryptoJS = require("crypto-js");

Endpoint de la API:

const requestPath = encodeURIComponent('/api/suclient');

Ordenando los parámetros:

const data = {
name: "John Doe",
phone: "923122312",
address: "Moneda 101",
country: "Chile",
region: "Metropolitana",
city: "Santiago",
postal_code: "850000"
};
const orderedData = {};
Object.keys(data).sort().forEach(function(key) {
orderedData[key] = data[key];
if (typeof orderedData[key] === 'object') {
delete orderedData[key];
}
});

Transformación de los parámetros a formato url:

const arrayConcat = new URLSearchParams(orderedData).toString();

Concatenación de los parámetros en formato url con el endpoint de la API:

const concat = requestPath + "&" + arrayConcat;

Firma:

const sign = CryptoJS.HmacSHA256(concat, "fe551abcef62fcf002dc598922e68f0a").toString();

El resultado de la firma obtenida para ambos ejemplos es:

"c9c86202b1246f6ebeb080d08b3b99a22d36d0e8cffb7fd4e65af0fea4dd12bb"