From ecc0bf329756c7c3fb4451e28df9d69f927d1e73 Mon Sep 17 00:00:00 2001 From: Ramon Ramirez Date: Fri, 16 Jan 2026 16:42:03 -0400 Subject: [PATCH] Update signature generation --- .../helper/SerializationHelper.java | 63 ++++++++++++++++++- .../client/PaymentFileClient.java | 11 ++-- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/banesco/common/application/helper/SerializationHelper.java b/src/main/java/com/banesco/common/application/helper/SerializationHelper.java index eee421a..bdb43f3 100644 --- a/src/main/java/com/banesco/common/application/helper/SerializationHelper.java +++ b/src/main/java/com/banesco/common/application/helper/SerializationHelper.java @@ -3,12 +3,14 @@ package com.banesco.common.application.helper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import io.netty.util.internal.StringUtil; import io.quarkus.runtime.annotations.RegisterForReflection; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; +import java.nio.charset.StandardCharsets; import java.util.*; @Slf4j @@ -36,6 +38,14 @@ public class SerializationHelper { } } + public String encodeStringToBase64(String text) { + if (StringUtil.isNullOrEmpty(text)) { + return null; + } + + return Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8)); + } + public T decodeBase64(String base64String, Class clazz) { try { byte[] decodedBytes = Base64.getDecoder().decode(base64String); @@ -79,7 +89,7 @@ public class SerializationHelper { try { Map map = objectMapper.convertValue( - element, new TypeReference<>() {} + element, new TypeReference<>() {} ); if (excludedFields != null && !excludedFields.isEmpty()) { @@ -93,4 +103,55 @@ public class SerializationHelper { return new HashMap<>(); } } + + public Map toTreeMap(T element) { + return toTreeMap(element, null); + } + + public Map toTreeMap( + T element, + List excludedFields + ) { + if (element == null) { + return new TreeMap<>(); + } + + try { + Map tempMap = objectMapper.convertValue( + element, new TypeReference<>() {} + ); + + Map treeMap = new TreeMap<>(tempMap); + + if (excludedFields != null && !excludedFields.isEmpty()) { + Set excludedSet = new HashSet<>(excludedFields); + excludedSet.forEach(treeMap::remove); + } + + return treeMap; + } catch (Exception e) { + log.error("Error al convertir objeto a TreeMap: {}", e.getMessage()); + return new TreeMap<>(); + } + } + + public String generateSignature( + Object operation, + String channelOrigin + ) { + Map operationSortedMap = toTreeMap(operation); + StringBuilder concatenatedValues = new StringBuilder(); + String channelBase64 = encodeStringToBase64(channelOrigin); + + for (Object value : operationSortedMap.values()) { + concatenatedValues.append(value.toString()); + } + + String finalString = concatenatedValues + channelBase64; + + log.info("1. Operation concatenando valores: {}", concatenatedValues); + log.info("2. Channel Origin codificado: {}", channelBase64); + + return encodeSha256(finalString); + } } diff --git a/src/main/java/com/banesco/module/payment_file/infrastructure/client/PaymentFileClient.java b/src/main/java/com/banesco/module/payment_file/infrastructure/client/PaymentFileClient.java index 518d836..0d7ed5c 100644 --- a/src/main/java/com/banesco/module/payment_file/infrastructure/client/PaymentFileClient.java +++ b/src/main/java/com/banesco/module/payment_file/infrastructure/client/PaymentFileClient.java @@ -114,9 +114,8 @@ public class PaymentFileClient implements PaymentFileUseCase { private Map getPayload(PaymentFileRequest params) { Map paymentStatusRequest = serializationHelper.toMap(params); Map operation = serializationHelper.toMap(params.getOperation()); - String signature = serializationHelper.encodeSha256( - serializationHelper.toJsonString(operation) + - serializationHelper.encodeBase64(params.getChannelOrigin()) + String signature = serializationHelper.generateSignature( + params.getOperation(), params.getChannelOrigin() ); paymentStatusRequest.put("signature", signature); @@ -124,9 +123,9 @@ public class PaymentFileClient implements PaymentFileUseCase { paymentStatusRequest.remove("fintechId"); - log.info("1. Firma generada: {}", signature); - log.info("2. Parametros de la solicitud: {}", paymentStatusRequest); - log.info("3. Solicitud final: {}", paymentStatusRequest); + log.info("3. Firma generada: {}", signature); + log.info("4. Parametros de la solicitud: {}", paymentStatusRequest); + log.info("5. Solicitud final: {}", paymentStatusRequest); return paymentStatusRequest; }