diff --git a/boot/modules/acquiring/src/main/java/com/klaro/acquirecore/acquiring/service/TxService.java b/boot/modules/acquiring/src/main/java/com/klaro/acquirecore/acquiring/service/TxService.java new file mode 100644 index 0000000..5a5011f --- /dev/null +++ b/boot/modules/acquiring/src/main/java/com/klaro/acquirecore/acquiring/service/TxService.java @@ -0,0 +1,88 @@ +package com.klaro.acquirecore.acquiring.service; + +import com.klaro.acquirecore.acquiring.codec.MessageCodec; +import com.klaro.acquirecore.acquiring.codec.UnpackedMessage; +import com.klaro.acquirecore.acquiring.dto.TxRequest; +import com.klaro.acquirecore.acquiring.dto.TxResponse; +import com.klaro.acquirecore.acquiring.repository.TxRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * TX_SERVICE: 전문수신 서비스 + * Legacy: mg_recv_svc.pgc + * Handles incoming acquiring transaction messages, unpacks, processes, and stores. + */ +@Service +public class TxService { + + private static final Logger log = LoggerFactory.getLogger(TxService.class); + + private final MessageCodec messageCodec; + private final TxRepository txRepository; + + public TxService(MessageCodec messageCodec, TxRepository txRepository) { + this.messageCodec = messageCodec; + this.txRepository = txRepository; + } + + /** + * 수신된 전문을 처리합니다. + * + * @param rawMessage 원본 바이트 전문 + * @return 처리 결과 응답 + */ + public TxResponse processMessage(byte[] rawMessage) { + log.info("Processing incoming message, length={}", rawMessage.length); + + try { + // 1. 전문 언팩 (디코딩) + UnpackedMessage unpacked = messageCodec.unpack(rawMessage); + log.debug("Message unpacked: txType={}, traceNo={}", + unpacked.getTxType(), unpacked.getTraceNo()); + + // 2. TX 요청 변환 + TxRequest request = toTxRequest(unpacked); + + // 3. 거래 처리 (DB 저장) + txRepository.save(request); + + // 4. 응답 생성 + return buildResponse(unpacked, "00", "Approved"); + + } catch (Exception e) { + log.error("Message processing failed", e); + return buildErrorResponse(e.getMessage()); + } + } + + private TxRequest toTxRequest(UnpackedMessage unpacked) { + TxRequest request = new TxRequest(); + request.setTraceNo(unpacked.getTraceNo()); + request.setTxType(unpacked.getTxType()); + request.setMerchantId(unpacked.getMerchantId()); + request.setAmount(unpacked.getAmount()); + request.setCardNo(unpacked.getCardNo()); + request.setExpiryDate(unpacked.getExpiryDate()); + request.setInstallments(unpacked.getInstallments()); + request.setMessageRaw(unpacked.getRawData()); + return request; + } + + private TxResponse buildResponse(UnpackedMessage unpacked, String respCode, String respMsg) { + TxResponse response = new TxResponse(); + response.setTraceNo(unpacked.getTraceNo()); + response.setRespCode(respCode); + response.setRespMsg(respMsg); + response.setTxType(unpacked.getTxType()); + return response; + } + + private TxResponse buildErrorResponse(String errorMessage) { + TxResponse response = new TxResponse(); + response.setRespCode("99"); + response.setRespMsg(errorMessage != null ? errorMessage : "Unknown error"); + return response; + } +}