Firma
En el caso del API de pagos a terceros (payout) 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.
Ejemplo PHP
Sección titulada «Ejemplo PHP»Endpoint de la API:
$request_path = urlencode('/api/suclient');Ordenando los parámetros:
$data = [ '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');Ejemplo JavaScript
Sección titulada «Ejemplo JavaScript»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"