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 merchant-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 generar el hash:

  • Tener credenciales para comunicación con API (Merchant Key y Merchant Secret). Si no tiene esta información, favor contacte a su ejecutivo comercial.
  • Generar timestamp (date) el cual se debe mandar como cabecera y también es usado para generar el hash.
  • Generar un hash HMAC SHA256 con el Merchant Secret como password y como contenido un texto con el siguiente formato merchantKey + '&' + date + '&' + requestMethod + '&' + requestPath + concatenatedParams donde:
    • merchantKey: Merchant 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/merchant/orders/ solo se debe utilizar %2Fmerchant%2Forders%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 Merchant Key como merchant-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 merchantKey = '<YOUR_MERCHANT_KEY>';
const merchantSecret = '<YOUR_MERCHANT_SECRET>';
// Request Config
const pago46APIHost = 'api.pago46.io'
const pago46APIPath = '/merchant/orders/'
const requestMethod = 'POST';
const requestURL = 'https://' + pago46APIHost + pago46APIPath
// Parámetros ordenados alfabéticamente
let requestData = {
currency: 'CLP', // Moneda de la orden.
description: 'Some user description', // El usuario lo ve en el comprobante enviado a email.
email: 'user@mail.com', // Email del usuario.
merchant_order_id: 'merchant-000001', // ID interna del comercio para rastrear órdenes.
notify_url: 'https://api.sistema-comercio.com/notificaciones-pago46', // URL donde la API PAGO46 notifica cambios de la orden.
price: 1000, // Precio de cobrar.
return_url: 'https://comercio.com/compra-exitosa', // URL donde es re-direccionado al finalizar el flujo.
timeout: 1440 // Tiempo valido de la orden.
}
// 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 = merchantKey + '&' + date + '&' + requestMethod + '&' + requestPath + concatenatedParams;
// Output: <YOUR_MERCHANT_KEY>&1618261228597&POST&%2Fmerchant%2Forders%2F&currency=CLP&description=Some%20user%20description&email=user%40mail.com&merchant_order_id=merchant-000001&notify_url=https%3A%2F%2Fapi.sistema-comercio.com%2Fnotificaciones-pago46&price=1000&return_url=https%3A%2F%2Fcomercio.com%2Fcompra-exitosa&timeout=1440
console.log(encrypt_base);
//get the hmac result
let hmac = createHmac('sha256', merchantSecret).update(encrypt_base).digest('hex');
// set the hmac result on the header
console.log('Header merchant-key: ', merchantKey);
console.log('Header message-hash: ', hmac);
console.log('Header message-date: ', date);