8장 결제와 웹훅을 안전하게 흉내 낸다
결제는 기본 실습에서 절대 라이브로 연결하지 않는다. 먼저 PaymentPort라는 작은 인터페이스를 만들고 성공, 거절, 지연, 중복 웹훅을 fixture로 재생한다.
웹훅은 네트워크가 응답을 잃으면 같은 이벤트를 다시 보낸다. 이벤트 ID를 저장하고 이미 처리한 ID는 같은 성공 응답을 돌려준다. 서명 검증은 원본 바이트로 수행하며 파싱 후 다시 만든 JSON을 사용하지 않는다.
결제 승인과 예약 확정이 한 트랜잭션이 될 수 없다면 상태를 분리한다. payment_pending, paid, confirmation_pending, confirmed, refund_required처럼 복구 가능한 중간 상태가 필요하다. “에러면 처음부터 다시”는 돈이 움직인 뒤에는 안전하지 않다.