결제 기능 구현 5 : 웹훅 - jsp, 오라클, mybatis

2024. 4. 3. 00:35카테고리 없음

 @RequestMapping("/webhook")
    public ResponseEntity<String> method1(@RequestBody WebhookDTO webhookDTO) {

        // 웹훅이란?
        // 내가 파악하기로는 가상계좌발급이 되거나 발급된 가상계좌로 구매자가 돈을 입금하는 경우, 포트원이 자동으로 이곳으로 HTTP 메세지를 보내주는 것을 말한다.
        // 이외에도 결제가 승인되거나, 예약결제가 시도되었을 때, 관리자 콘솔에서 결제취소가 되었을 때 웹훅을 보내준다고 한다.
        // 원래는 폴링(polling) 이라고 해서, 주기적으로 내가 포트원한테 물어봤었어야 됬는데,
        // 웹훅을 사용함으로써 네트워크가 불안정해서 내가 보낸 HTTP요청이 포트원에게 전달되지 못하는 것도 예방할 수 있고,
        // 주기적으로 포트원에게 HTTP요청 안보내도 되니까, 내 프로젝트 입장에서는 리소스도 아낄 수 있겠지.

        // 그런데, 문제는 가상계좌 관련한 건, 이니시스 같은 PG사에게 사업자등록증을 제출하고 상점관리자가 되어야한다.
        // 그래서 당장에 내가 할 수 있는 것은, 결제가 승인되었다는 웹훅을 처리하는 것 밖에 없다.

        // 포트원이 준 웹훅을 파싱해봤더니 아래와 같은 데이터가 들어있었다.
        log.info("webhookDTO============================{}", webhookDTO);
        // WebhookDTO(imp_uid=imp_1234567890, merchant_uid=merchant_1234567890, status=paid, cancellation_id=null)

        // 이걸 가지고 어떤 걸 할 수 있을까?
        // 내 payments 테이블에 이 merchant_uid 를 가진 행의 status 가 이 웹훅의 status 와 동일한지 여부?
        //paid(결제완료), ready(브라우저 창 이탈, 가상계좌 발급완료 미결제 상태), failed(신용카드 한도초과, 체크카드 잔액부족, 브라우저 창 종료, 취소버튼 클릭 등 결제실패상태)
        // 일치한다면, 더 이상 해줄 건 없어.
        // 그러나, 일치하지 않는다면?
        // 다시 한번 결제단건조회를 진행. 이번에 한 결제단건조회에서의 status 컬럼값을 확인.
        // 웹훅이 옳은지, 내 db에 저장된 status 컬럼값이 옳은지 검증.
        // 내 db에 저장된 status 컬럼값이 옳은 경우, 더 이상 해줄 거 없음.
        // 웹훅이 옳은 경우, 내 db에 저장된 행을 지우고, 방금 조회한 결제단건조회의 결과를 다시 삽입해준다.

        // + 해줘야 할 게 있음.
        // 내 db / 웹훅
        // paid / ready : 포트원이 아닌 다른 곳(해커)에서 받은 결제단건조회결과를 바탕으로 사후검증을 진행했다고 판단하고 새롭게 사후검증을 진행.
        // paid / failed : 포트원이 아닌 다른 곳(해커)에서 받은 결제단건조회결과를 바탕으로 사후검증을 진행했다고 판단하고 새롭게 사후검증을 진행.
        // ready / failed
        // ready / paid
        // failed / paid,
        // failed / ready
        // 이렇게 6가지의 경우가 있을 수 있다.


        //포트원 서버에게 웹훅을 잘 받았다고 보냄.
        return ResponseEntity.ok().body("Webhook received successfully");
    }