Update signature generation

This commit is contained in:
Ramon Ramirez 2026-01-16 16:42:03 -04:00
parent 41012f0503
commit ecc0bf3297
2 changed files with 67 additions and 7 deletions

View File

@ -3,12 +3,14 @@ package com.banesco.common.application.helper;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.util.internal.StringUtil;
import io.quarkus.runtime.annotations.RegisterForReflection; import io.quarkus.runtime.annotations.RegisterForReflection;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
@Slf4j @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> T decodeBase64(String base64String, Class<T> clazz) { public <T> T decodeBase64(String base64String, Class<T> clazz) {
try { try {
byte[] decodedBytes = Base64.getDecoder().decode(base64String); byte[] decodedBytes = Base64.getDecoder().decode(base64String);
@ -79,7 +89,7 @@ public class SerializationHelper {
try { try {
Map<String, Object> map = objectMapper.convertValue( Map<String, Object> map = objectMapper.convertValue(
element, new TypeReference<>() {} element, new TypeReference<>() {}
); );
if (excludedFields != null && !excludedFields.isEmpty()) { if (excludedFields != null && !excludedFields.isEmpty()) {
@ -93,4 +103,55 @@ public class SerializationHelper {
return new HashMap<>(); return new HashMap<>();
} }
} }
public <T> Map<String, Object> toTreeMap(T element) {
return toTreeMap(element, null);
}
public <T> Map<String, Object> toTreeMap(
T element,
List<String> excludedFields
) {
if (element == null) {
return new TreeMap<>();
}
try {
Map<String, Object> tempMap = objectMapper.convertValue(
element, new TypeReference<>() {}
);
Map<String, Object> treeMap = new TreeMap<>(tempMap);
if (excludedFields != null && !excludedFields.isEmpty()) {
Set<String> 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<String, Object> 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);
}
} }

View File

@ -114,9 +114,8 @@ public class PaymentFileClient implements PaymentFileUseCase {
private Map<String, Object> getPayload(PaymentFileRequest params) { private Map<String, Object> getPayload(PaymentFileRequest params) {
Map<String, Object> paymentStatusRequest = serializationHelper.toMap(params); Map<String, Object> paymentStatusRequest = serializationHelper.toMap(params);
Map<String, Object> operation = serializationHelper.toMap(params.getOperation()); Map<String, Object> operation = serializationHelper.toMap(params.getOperation());
String signature = serializationHelper.encodeSha256( String signature = serializationHelper.generateSignature(
serializationHelper.toJsonString(operation) + params.getOperation(), params.getChannelOrigin()
serializationHelper.encodeBase64(params.getChannelOrigin())
); );
paymentStatusRequest.put("signature", signature); paymentStatusRequest.put("signature", signature);
@ -124,9 +123,9 @@ public class PaymentFileClient implements PaymentFileUseCase {
paymentStatusRequest.remove("fintechId"); paymentStatusRequest.remove("fintechId");
log.info("1. Firma generada: {}", signature); log.info("3. Firma generada: {}", signature);
log.info("2. Parametros de la solicitud: {}", paymentStatusRequest); log.info("4. Parametros de la solicitud: {}", paymentStatusRequest);
log.info("3. Solicitud final: {}", paymentStatusRequest); log.info("5. Solicitud final: {}", paymentStatusRequest);
return paymentStatusRequest; return paymentStatusRequest;
} }