[매입] mg_recv_svc → 전문수신 @Service (ACM-MG-004)
This commit is contained in:
parent
1dd183a6db
commit
3257739c88
1 changed files with 91 additions and 0 deletions
|
|
@ -0,0 +1,91 @@
|
|||
package com.klaro.acquirecore.acquiring.codec;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 전문 인코딩/디코딩 컴포넌트
|
||||
* Fixed-length 필드 기반 전문 파싱
|
||||
*/
|
||||
@Component
|
||||
public class MessageCodec {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(MessageCodec.class);
|
||||
|
||||
private static final int LEN_TX_TYPE = 4;
|
||||
private static final int LEN_TRACE_NO = 12;
|
||||
private static final int LEN_MERCHANT_ID = 15;
|
||||
private static final int LEN_AMOUNT = 12;
|
||||
private static final int LEN_CARD_NO = 20;
|
||||
private static final int LEN_EXPIRY = 4;
|
||||
private static final int LEN_INSTALLMENTS = 2;
|
||||
private static final int LEN_FILLER = 99;
|
||||
|
||||
public UnpackedMessage unpack(byte[] rawMessage) {
|
||||
if (rawMessage == null || rawMessage.length == 0) {
|
||||
throw new IllegalArgumentException("Empty message");
|
||||
}
|
||||
|
||||
String data = new String(rawMessage);
|
||||
int offset = 0;
|
||||
|
||||
UnpackedMessage unpacked = new UnpackedMessage();
|
||||
unpacked.setRawData(data);
|
||||
|
||||
unpacked.setTxType(extract(data, offset, LEN_TX_TYPE));
|
||||
offset += LEN_TX_TYPE;
|
||||
|
||||
unpacked.setTraceNo(extract(data, offset, LEN_TRACE_NO));
|
||||
offset += LEN_TRACE_NO;
|
||||
|
||||
unpacked.setMerchantId(extract(data, offset, LEN_MERCHANT_ID));
|
||||
offset += LEN_MERCHANT_ID;
|
||||
|
||||
unpacked.setAmount(extract(data, offset, LEN_AMOUNT));
|
||||
offset += LEN_AMOUNT;
|
||||
|
||||
unpacked.setCardNo(extract(data, offset, LEN_CARD_NO));
|
||||
offset += LEN_CARD_NO;
|
||||
|
||||
unpacked.setExpiryDate(extract(data, offset, LEN_EXPIRY));
|
||||
offset += LEN_EXPIRY;
|
||||
|
||||
unpacked.setInstallments(extract(data, offset, LEN_INSTALLMENTS));
|
||||
offset += LEN_INSTALLMENTS;
|
||||
|
||||
if (data.length() > offset) {
|
||||
unpacked.setFiller(extract(data, offset, Math.min(LEN_FILLER, data.length() - offset)));
|
||||
}
|
||||
|
||||
log.debug("Message unpacked: txType={}, traceNo={}", unpacked.getTxType(), unpacked.getTraceNo());
|
||||
return unpacked;
|
||||
}
|
||||
|
||||
public byte[] pack(UnpackedMessage unpacked) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(padRight(unpacked.getTxType(), LEN_TX_TYPE));
|
||||
sb.append(padRight(unpacked.getTraceNo(), LEN_TRACE_NO));
|
||||
sb.append(padRight(unpacked.getMerchantId(), LEN_MERCHANT_ID));
|
||||
sb.append(padRight(unpacked.getAmount(), LEN_AMOUNT));
|
||||
sb.append(padRight(unpacked.getCardNo(), LEN_CARD_NO));
|
||||
sb.append(padRight(unpacked.getExpiryDate(), LEN_EXPIRY));
|
||||
sb.append(padRight(unpacked.getInstallments(), LEN_INSTALLMENTS));
|
||||
sb.append(padRight(unpacked.getFiller(), LEN_FILLER));
|
||||
return sb.toString().getBytes();
|
||||
}
|
||||
|
||||
private String extract(String data, int offset, int length) {
|
||||
if (offset >= data.length()) return "";
|
||||
int end = Math.min(offset + length, data.length());
|
||||
return data.substring(offset, end).trim();
|
||||
}
|
||||
|
||||
private String padRight(String value, int length) {
|
||||
if (value == null) value = "";
|
||||
if (value.length() >= length) return value.substring(0, length);
|
||||
StringBuilder sb = new StringBuilder(value);
|
||||
while (sb.length() < length) sb.append(' ');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
Reference in a new issue