개요
2022년 10월 15일, sk cnc 데이터센터 화재로 인해 일명 카카오 먹통 사태로 번졌을때 PG 기능중 하나였던 카카오페이에서 중복 결제가 발생했었다. 그래서 앞으로 또 PG사 서비스 장애가 발생했을때 똑같은 일이 발생하지 않도록 중복결제 방어가 필요했기에 이러한 서비스 장애 발생시 대처법에 대하여 알아보았다.
사용하고 있는 PG 는 총 3개로 나이스페이, 토스, 카카오페이 (정기결제) 이다.
그럼 각 PG 사마다 결제요청에 대해 알수없는 응답에 대해서 어떻게 처리하는지 알아보도록 하자.
PG사에 결제 요청을 했을때 받을수 있는 응답 값은 3가지로 나뉜다.
- 성공
- 실패
- 알 수 없음
성공 혹은 실패로 명확한 응답 값을 받은 경우는 문제가 없다. 문제는 알 수 없음 인 경우다. 결제 요청을 했는데 응답 값을 받지 못하고 네트워크 timeout 익셉션이 발생했다고 가정해보자.
어떠한 이유로 발생한 timeout
결제 결과에 대해 장담할수 없음
- 나이스페이: timeout 에 대한 나이스페이 가이드
- 토스 : timeout 에 대한 토스 가이드
- 카카오페이 : 카카오페이의 경우 문서에 timeout 에 대한 가이드가 따로 없고 결제상태는 파트너어드민을 통하여 확인하길 권고
카카오페이의 경우 정기결제 방식 을 사용하는 경우를 말한다. 단건결제의 경우 사용자가 지정한 유니크 값 으로 트랜잭션 관리가 가능하기 때문에 이와 같은 문제가 없다.
중복결제 시도 경우의 수와 그 결과
결제 요청때 마다 결제 상태 조회를 하는 경우와 안하는 경우의 예를 들어보겠다.
- 결제 요청 → 결제 상태 조회(미결제 상태) → 재결제 or
결제 요청 → 결제 상태 조회(이미 결제 완료 상태) → 결제 완료 처리
결제 요청시 사용자가 지정한 unique 값(ex) 주문번호, etc..)으로 결제 취소 및 결제 상태 조회가 가능해야함.- 나이스페이: 가능
nicepay-manual/cancel.md at main · nicepayments/nicepay-manual
nicepay-manual/status.md at main · nicepayments/nicepay-manual - 토스 : 가능
토스페이 API
토스페이 API - 카카오페이 : 불가능
카카오페이 정기결제 기능에선 사용자가 지정한 unique 값으로 트랜잭션 관리가 불가능 하다.
- 나이스페이: 가능
- 결제요청 → 어떠한 이유로 실패 -> 재결제 요청 → 중복 결제 에러 (이미 결제 완료 상태) or
결제요청 → 어떠한 이유로 실패 -> 재결제 요청 → 결제 완료 처리 (미결제 상태)
같은 결제 요청건에 대해선 PG 사에서 중복 결제 하지 않는다는 전제조건- 나이스페이: 가능
nicepay-manual/payment-subscribe.md at main · nicepayments/nicepay-manual
api 호출자가 orderId 라는 고유한 값을 지정해서 결제 트랜잭션 관리 가능.
같은 orderId 로 결제 요청시 중복 결제 에러. - 토스 : 가능
자주 묻는 질문
api 호출자가 ORDER_NO 라는 고유한 값을 지정해서 결제 트랜잭션 관리 가능.
같은 ORDER_NO 로 결제 요청시 중복 결제 에러. - 카카오페이 : 불가능
카카오페이 정기결제 기능에선 사용자가 지정한 unique 값으로 트랜잭션 관리가 불가능 하다.
- 나이스페이: 가능
나이스페이, 토스는 자체적으로 중복 결제를 막아버려서 중복 결제가 발생할수 없음.
결론적으로 카카오페이 정기결제의 경우 중복결제를 막을순 없고 중복결제 최소화 작업은 가능할 것 같다. (적절한 응답이 없는 경우(장애로 판단) 해당 결제건의 경우 카카오페이 결제를 막고 다른 결제 메소드로 유도하여 카카오페이로 2 ~ 3번씩 결제시도 하는 경우를 방지.)
가장 좋은건 카카오페이 정기결제도 다른 PG 사들 처럼 api 호출자가 지정한 유니크한 값으로 트랜잭션 관리를 하면 좋을거 같은데 문의 결과 안된다고 한다..
궁극적으론 정산 대사 시스템을 구축하여 관리해야 할 것 같다.
참고자료
https://tech.kakaopay.com/post/msa-transaction/
'IT > 이것저것' 카테고리의 다른 글
[ChatGPT] ChatGPT 더 잘 쓰는 법 prompt 패턴 (1) | 2023.11.13 |
---|---|
[캐시] 캐시에 대하여 (0) | 2023.02.14 |
[카카오 로그인 연동] 카카오 로그인 연동 에러 해결방법 Admin Settings Issue (KOE101) (0) | 2023.01.21 |
[jetbrains] phpstorm, intellij 개발시 유용한 단축키 (0) | 2023.01.02 |
[인증] OIDC (OpenID Connect) 에 대하여 Feat. OAuth2 (0) | 2022.11.15 |