S SmartDocs
系列: Bridget java 56 行 · 更新于 2026-04-18

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

相关文章

Bridget java 更新于 2026-03-30

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

阅读文章 →
Bridget java 更新于 2026-03-20

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

阅读文章 →
Bridget java 更新于 2026-03-30

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

阅读文章 →
Bridget java 更新于 2026-04-14

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

阅读文章 →
Bridget java 更新于 2026-03-20

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

阅读文章 →
Bridget java 更新于 2026-03-29

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

阅读文章 →