RequestFingerprinter.java
Bridget/payment_solutions/src/main/java/com/checkout/payment/gateway/security/RequestFingerprinter.java
package com.checkout.payment.gateway.security;
import com.checkout.payment.gateway.model.PostPaymentRequest;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HexFormat;
import java.util.TreeMap;
import org.springframework.stereotype.Component;
@Component
public class RequestFingerprinter {
private final ObjectMapper objectMapper;
public RequestFingerprinter(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
public String fingerprint(PostPaymentRequest request) {
try {
TreeMap<String, Object> canonical = new TreeMap<>();
putIfPresent(canonical, "amount", request.getAmount());
putIfPresent(canonical, "card_number", request.getCardNumber());
putIfPresent(canonical, "currency", request.getCurrency());
putIfPresent(canonical, "cvv", request.getCvv());
putIfPresent(canonical, "expiry_month", request.getExpiryMonth());
putIfPresent(canonical, "expiry_year", request.getExpiryYear());
String json = objectMapper.writeValueAsString(canonical);
return sha256Hex(json);
} catch (JsonProcessingException e) {
throw new IllegalStateException("Failed to fingerprint request", e);
}
}
private static void putIfPresent(TreeMap<String, Object> map, String key, Object value) {
if (value != null) {
if (value instanceof String s && s.isBlank()) {
return;
}
map.put(key, value);
}
}
private static String sha256Hex(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
return HexFormat.of().formatHex(hash);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("SHA-256 not available", e);
}
}
}
Articoli correlati
PaymentGatewayApplication.java
PaymentGatewayApplication.java — java source code from the Bridget learning materials (Bridget/payment-gateway-challenge-java/src/main/java/com/checkout/payment/gateway/PaymentGatewayApplication.java).
Leggi l'articolo →ApplicationConfiguration.java
ApplicationConfiguration.java — java source code from the Bridget learning materials (Bridget/payment-gateway-challenge-java/src/main/java/com/checkout/payment/gateway/configuration/ApplicationConfiguration.java).
Leggi l'articolo →RequestResponseLogger.java
RequestResponseLogger.java — java source code from the Bridget learning materials (Bridget/payment-gateway-challenge-java/src/main/java/com/checkout/payment/gateway/configuration/RequestResponseLogger.java).
Leggi l'articolo →PaymentGatewayController.java
PaymentGatewayController.java — java source code from the Bridget learning materials (Bridget/payment-gateway-challenge-java/src/main/java/com/checkout/payment/gateway/controller/PaymentGatewayController.java).
Leggi l'articolo →PaymentStatus.java
PaymentStatus.java — java source code from the Bridget learning materials (Bridget/payment-gateway-challenge-java/src/main/java/com/checkout/payment/gateway/enums/PaymentStatus.java).
Leggi l'articolo →BankErrorException.java
BankErrorException.java — java source code from the Bridget learning materials (Bridget/payment-gateway-challenge-java/src/main/java/com/checkout/payment/gateway/exception/BankErrorException.java).
Leggi l'articolo →