Saltar al contenido principal

Validación de firma

El propósito de este valor es salvaguardar la integridad de la respuesta recibida. Se trata de una cadena codificada en formato base 64 y se encuentra en el campo "signature" de la respuesta generada por la librería. En la representación en formato JSON del objeto de respuesta, se puede observar este campo de la siguiente manera:

Importante

Es importante tener en cuenta este proceso de validación de firma únicamente cuando el valor del campo code no sea igual a 021 ni a COMMUNICATION_ERROR.

{
"code": "00",
"message": "OK",
"messageUser": "Operación exitosa",
"messageUserEng": "Successful",
"response": {
"payMethod": "CARD",
"order": [
{
"payMethodAuthorization": "CARD",
"codeAuth": "812643",
"currency": "PEN",
"amount": "1.25",
"installment": "00",
"deferred": "0",
"orderNumber": "ONTEST170542360",
"stateMessage": "Autorizado",
"dateTransaction": "20240116",
"timeTransaction": "114711",
"uniqueId": "0116164711812643",
"referenceNumber": "6178410"
}
],
"card": {
"brand": "DN",
"pan": "361006**5158",
"save": "false"
},
"billing": {
"firstName": "Juan",
"lastName": "Wick",
"email": "jwick@izi.com",
"phoneNumber": "989339999",
"street": "calle el demo",
"city": "lima",
"state": "lima",
"country": "PE",
"postalCode": "00001",
"documentType": "DNI",
"document": "10252022",
"companyName": ""
},
"merchant": {
"merchantCode": "5498631",
"facilitatorCode": ""
},
"token": {
"merchantBuyerId": "mc1991",
"cardToken": "",
"alias": ""
},
"authentication": {
"result": ""
},
"customFields": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
]
},
"payloadHttp": "{\"code\":\"00\",\"message\":\"OK\",\"messageUser\":\"Operación exitosa\",\"messageUserEng\":\"Successful\",\"transactionId\":\"170542360395800\",\"response\":{\"payMethod\":\"CARD\",\"order\":[{\"payMethodAuthorization\":\"CARD\",\"codeAuth\":\"812643\",\"currency\":\"PEN\",\"amount\":\"1.25\",\"installment\":\"00\",\"deferred\":\"0\",\"orderNumber\":\"ONTEST170542360\",\"stateMessage\":\"Autorizado\",\"dateTransaction\":\"20240116\",\"timeTransaction\":\"114711\",\"uniqueId\":\"0116164711812643\",\"referenceNumber\":\"6178410\"}],\"card\":{\"brand\":\"DN\",\"pan\":\"361006**5158\",\"save\":\"false\"},\"billing\":{\"firstName\":\"Test\",\"lastName\":\"Test\",\"email\":\"jwick@izi.com\",\"phoneNumber\":\"989339999\",\"street\":\"calle el demo\",\"city\":\"lima\",\"state\":\"lima\",\"country\":\"PE\",\"postalCode\":\"00001\",\"documentType\":\"DNI\",\"document\":\"10252022\",\"companyName\":\"\"},\"merchant\":{\"merchantCode\":\"5498631\",\"facilitatorCode\":\"\"},\"token\":{\"merchantBuyerId\":\"mc1991\",\"cardToken\":\"\",\"alias\":\"\"},\"authentication\":{\"result\":\"\"},\"customFields\":[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]}}",
"signature": "x9SIjZIy1XeRjPDjiblsjtjR1tUyKpY6BCxCJsXWO1k=",
"transactionId": "170542360395800"
}
}

Para validar la firma realizar los siguientes pasos:

  • Acceder al valor del payload mediante el atributo response.payloadHttp.
  • Utilizar HMAC-SHA256 para generar un Hash del valor del payload utilizando como secretKey la claveHash (en la sección Definición de parámetros).
  • Comparar el resultado con el signature, de resultar iguales se habrá garantizado la integridad del mensaje.

Aquí te mostramos un ejemplo de como realizar la validación de firma a través de JavaScript:

const { createHmac } = require('crypto');

/**

* Función para validar una firma HMAC-SHA-256.

*

* @param {string} payload - El mensaje original que se firmó.

* @param {string} keyHash - La clave secreta en forma de cadena.

* @param {string} signature - La firma a comparar con el resultado de la firma.

* @returns {boolean} - Devuelve true si la firma es válida, de lo contrario, false.

*/

function checkSignature(payload, keyHash, signature) {
if (!keyHash) {
return false;
}

const hmac = createHmac('sha256', Buffer.from(keyHash, 'utf-8'));

const messageBytes = Buffer.from(payload, 'utf-8');

const hash = hmac.update(messageBytes).digest('base64');

return signature === hash;
}

// Ejemplo de uso

const payload = "{\"code\":\"00\",\"message\":\"OK\",\"messageUser\":\"Operación exitosa\",\"messageUserEng\":\"Successful\",\"transactionId\":\"170542360395800\",\"response\":{\"payMethod\":\"CARD\",\"order\":[{\"payMethodAuthorization\":\"CARD\",\"codeAuth\":\"812643\",\"currency\":\"PEN\",\"amount\":\"1.25\",\"installment\":\"00\",\"deferred\":\"0\",\"orderNumber\":\"ONTEST170542360\",\"stateMessage\":\"Autorizado\",\"dateTransaction\":\"20240116\",\"timeTransaction\":\"114711\",\"uniqueId\":\"0116164711812643\",\"referenceNumber\":\"6178410\"}],\"card\":{\"brand\":\"DN\",\"pan\":\"361006**5158\",\"save\":\"false\"},\"billing\":{\"firstName\":\"Test\",\"lastName\":\"Test\",\"email\":\"jwick@izi.com\",\"phoneNumber\":\"989339999\",\"street\":\"calle el demo\",\"city\":\"lima\",\"state\":\"lima\",\"country\":\"PE\",\"postalCode\":\"00001\",\"documentType\":\"DNI\",\"document\":\"10252022\",\"companyName\":\"\"},\"merchant\":{\"merchantCode\":\"5498631\",\"facilitatorCode\":\"\"},\"token\":{\"merchantBuyerId\":\"mc1991\",\"cardToken\":\"\",\"alias\":\"\"},\"authentication\":{\"result\":\"\"},\"customFields\":[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]}}";

const keyHash = 'Xom5Hlt9eSWoylYuBrenIbOsTljEdefR';

const signature = 'x9SIjZIy1XeRjPDjiblsjtjR1tUyKpY6BCxCJsXWO1k=';

const isValid = checkSignature(payload, keyHash, signature);

console.log('La firma es válida:', isValid);