/**
 * 전화카드 결제 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);
    }
}