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);