Skip to main content

Autenticación HMAC

La API de PAGO46 utiliza autenticación HMAC como protocolo de seguridad entre la comunicación de clientes y la API. El protocolo HMAC consiste en crear un hash basado en cierta información y debe ser generado para cada request y enviado con el mismo. Cada request a la API P46 debe enviar los parámetros provider-key, message-hash y message-date como cabecera. Estos parámetros se generan basado en la información del request, por ende, cada hash es único por request y no debe ser reutilizado por otros request futuros porque no será válido.

Generación de Hash#

Pasos para generaración de hash :

  • Tener credenciales para comunicación con API (Provider Key y Provider Secret). Si no tiene esta información, favor contacte a su ejecutivo comercial.
  • Generar timestamp (datetime) el cual se debe mandar como cabecera y también es usado para generar el hash.
  • Generar un hash HMAC SHA256 con el Provider Secret como password y como contenido un texto con el siguiente formato providerKey + '&' + date + '&' + requestMethod + '&' + requestPath + concatenatedParams donde:
    • providerKey: Provider Key
    • date: Unix Timestamp en milisegundos generado previamente (13 dígitos). El mismo valor deberá adjuntarse posteriormente como cabecera message-date.
    • requestMethod: GET, POST, PUT o DELETE dependiendo del caso.
    • requestPath: Solo path de la URL, encodeada (URL Encoded) a la cual se hará el request. Ejemplo: Si la url es https://api.pago46.io/payments/provider/check/1234567890/ solo se debe utilizar %2Fpayments%2Fprovider%2Fcheck%2F1234567890%2F.
    • concatenatedParams: Todos los parámetros necesarios a enviar (no cabeceras) concatenados en formato URL alfabéticamente por key y el valor con URL Encoded.
  • Adjuntar hash resultando como cabecera message-hash también el Unix timestamp utilizado para el hash como message-date y el Provider Key como provider-key. Adicionalmente mandar toda los parámetros necesarios en el body o url del request dependiendo del caso.

Ejemplo Javascript / NodeJS#

A continuación se presenta un ejemplo en lenguaje Javascript donde se genera una hash HMAC para el endpoint que permite crear órdenes. En este caso múltiples parámetros son necesarios en body que deben ser considerados en la generación del hash por request.

createOrder.js
const { createHmac } = require('crypto');
// Credentials
const providerKey = '<YOUR_PROVIDER_KEY>';
const providerSecret = '<YOUR_PROVIDER_SECRET>';
// Request Config
const pago46APIHost = 'sandbox.pago46.io'
const pago46APIPath = '/payments/provider/notify/<code>/'
const requestMethod = 'POST';
const requestURL = 'https://' + pago46APIHost + pago46APIPath
// Parámetros ordenados alfabéticamente
let requestData = {
status: 'complete', // estado del movimiento.
}
// Unix timestamp para firma y cabecera.
let date = + new Date();
// Output: 1618261228597
console.log('' + date);
// Parámetros concatenados y URI encoding.
var concatenatedParams = '';
for (var key in requestData) {
concatenatedParams += '&'+ key + '=' + encodeURIComponent(requestData[key]);
}
// Encoded path
const requestPath = encodeURIComponent(pago46APIPath);
// form the string to be encrypted, all parameters must joined with an &
let encrypt_base = providerKey + '&' + date + '&' + requestMethod + '&' + requestPath + concatenatedParams;
//get the hmac result
let hmac = createHmac('sha256', providerSecret).update(encrypt_base).digest('hex');
// set the hmac result on the header
console.log('Header provider-key: ', providerKey);
console.log('Header message-hash: ', hmac);
console.log('Header message-date: ', date);