/**
* 전화카드 결제 Webhook (토스페이 Non-ActiveX 안심키인 결제)
*/
@Transactional
public void handleAnsimKeyInWebhook(AnsimKeyInRequest req) {
boolean isSuccess = req.getLGD_RESPCODE().equals("0000");
String sb = req.getLGD_MID() +
req.getLGD_OID() +
req.getLGD_AMOUNT() +
req.getLGD_RESPCODE() +
req.getLGD_TIMESTAMP() +
MERT_KEY;
byte[] bNoti = sb.getBytes();
byte[] digest = DigestUtils.md5Digest(bNoti);
StringBuilder strBuf = new StringBuilder();
for (byte b : digest) {
int c = b & 0xff;
if (c <= 15) {
strBuf.append("0");
}
strBuf.append(Integer.toHexString(c));
}
String LGD_HASHDATA2 = strBuf.toString(); // 상점검증 해쉬값
/* 해쉬값 검증이 실패하면 throw */
if (!LGD_HASHDATA2.trim().equals(req.getLGD_HASHDATA()))
throw new BadRequestException(ErrorCode.PAYMENT_ERROR);
/* 웹훅 response 코드가 실패 시 throw */
if (!isSuccess)
throw new BadRequestException(ErrorCode.PAYMENT_ERROR);
OrderMaster orderMaster = orderMasterRepository.findById(req.getLGD_TID()).orElseThrow(() ->
new BadRequestException(ErrorCode.PAYMENT_ERROR));
orderMaster.setPaymentKey(req.getLGD_TID());
orderMaster.setLgdTid(req.getLGD_TID());
orderMaster.setOrderDepositYn(true);
orderMaster.setOrderDepositDt(LocalDateTime.now());
sb = req.getLGD_MID() +
req.getLGD_TID() +
MERT_KEY;
bNoti = sb.getBytes();
// <https://pgweb.tosspayments.com/pg/wmp/etc/jsp/Receipt_Link.jsp?mertid=kvp_abctire13&tid=kvp_a20230503144547keMz7&authdata=5e3c7ce39c301386855cf3a756d992c7>
String receiptUrl = String.format(
"<https://pgweb.tosspayments.com/pg/wmp/etc/jsp/Receipt_Link.jsp?mertid=%s&tid=%s&authdata=%s>",
req.getLGD_MID(), req.getLGD_TID(), DigestUtils.md5DigestAsHex(bNoti)
);
orderMaster.setReceiptUrl(receiptUrl);
/* 상세 주문의 상태를 '준비중'으로 변경 */
for (OrderDetail detail : orderMaster.getOrderDetailList()) {
detail.setOrderStatus(OrderStatusType.ORDER_PREPARE);
}
}