[팀 프로젝트]리사이쿨 결제 에러

jjade·2025년 12월 24일

미결제 후 창 닫기 시 결제 완료가 되는 에러


결제 취소 시 결제가 완료되는 문제 트러블슈팅

1. 문제 상황

주차/장소 예약 후 결제 페이지에서
결제창(NICEPAY / PortOne)에서 X 버튼 또는 종료 버튼을 눌러 결제를 취소했음에도 불구하고,
프론트 화면에서는 '결제가 완료되었습니다.' 라는 메시지가 출력되며
서버에는 결제 완료로 저장되는 문제가 발생했다.

예약 테이블을 초기화한 상태에서도 동일한 현상이 재현되었다.


2. 원인 분석

프론트엔드 관점

  • PortOne.requestPayment 호출 후
  • 결제창을 닫아도 response 객체가 반환되는 경우가 있음
  • response 존재 여부만으로 결제 성공으로 판단
  • 그대로 결제 완료 API 호출

백엔드 관점

  • 결제 완료 API는 요청이 오면 무조건 결제 완료 처리
  • 실제 결제 성공 여부에 대한 검증 로직 부재

3. 핵심 원인 요약

서버는 결제창에서 사용자가 어떤 버튼(X, 종료, 완료)을 눌렀는지 알 수 없는데
프론트에서 결제 완료 API를 무조건 호출하고 있었다.


4. 해결 전략

구조는 유지하되, 프론트와 백엔드에서 최소한의 검증 로직을 추가했다.


5. 프론트엔드 해결

결제 결과 상태가 PAID인 경우에만 서버 API를 호출하도록 수정했다.

  • 결제창 종료 또는 취소 시 서버 호출 차단
  • 결제 완료 상태만 서버에 전달

6. 백엔드 해결

서버 기준 상태 검증

결제 완료 API에서 예약 상태가 결제 가능한 상태인지 검증했다.

  • 예약 상태가 PENDING이 아닐 경우 결제 거부
  • impUid 기준 중복 결제 차단

이를 통해 프론트 조작이나 중복 호출에도 안전하게 방어할 수 있도록 했다.


7. 최종 결론

  • 결제 완료 여부는 프론트 이벤트가 아닌 서버 기준으로 판단해야 한다
  • 프론트에서는 결제 성공 상태만 전달
  • 서버에서는 예약 상태와 중복 여부로 최종 검증

이 구조를 통해 결제 취소 시 결제가 완료되는 문제를 안정적으로 해결했다.


8. 교훈

  • 결제 시스템에서 프론트는 신뢰 대상이 아니다
  • 결제 완료의 진실은 서버 한 곳에서만 판단해야 한다
  • 요청이 왔다와 결제가 완료됐다는 완전히 다른 개념이다
profile
끊임없는 에너지를 공유하는 핫스팟 같은 개발자 최준서입니다!

0개의 댓글