BankClient.java
Bridget/payment_solutions/src/main/java/com/checkout/payment/gateway/client/BankClient.java
package com.checkout.payment.gateway.client;
import com.checkout.payment.gateway.exception.BankServiceException;
import com.checkout.payment.gateway.model.BankRequest;
import com.checkout.payment.gateway.model.BankResponse;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import io.github.resilience4j.retry.annotation.Retry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
@Component
public class BankClient {
private static final Logger LOG = LoggerFactory.getLogger(BankClient.class);
private final RestTemplate restTemplate;
private final String bankUrl;
public BankClient(RestTemplate restTemplate,
@Value("${bank.simulator.url}") String bankUrl) {
this.restTemplate = restTemplate;
this.bankUrl = bankUrl;
}
@Retry(name = "bank")
@CircuitBreaker(name = "bank")
public BankResponse processPayment(BankRequest request) {
String url = bankUrl + "/payments";
LOG.info("Calling acquiring bank at {} (card and CVV not logged)", url);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<BankRequest> entity = new HttpEntity<>(request, headers);
try {
ResponseEntity<BankResponse> response =
restTemplate.postForEntity(url, entity, BankResponse.class);
LOG.info("Bank responded with HTTP {}", response.getStatusCode());
return response.getBody();
} catch (HttpServerErrorException e) {
LOG.error("Bank returned server error: {}", e.getStatusCode());
throw new BankServiceException(
"Bank returned error status: " + e.getStatusCode(), e);
} catch (RestClientException e) {
LOG.error("Failed to communicate with bank: {}", e.getClass().getSimpleName());
throw new BankServiceException("Failed to communicate with bank", e);
}
}
}
相关文章
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).
阅读文章 →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).
阅读文章 →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).
阅读文章 →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).
阅读文章 →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).
阅读文章 →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).
阅读文章 →