본문 바로가기

기록

iOS 인앱결제시 서버에서 오류가 발생한다면?

이번에 새롭게 iOS앱을 오픈 함에 따라 인앱결제를 넣는 작업을 진행 하였고, 서버에서 오류가 발생할 수 있는 상황에 대해서 대처한 방법을 적어보려고한다.

 

설명을 하기위해서 간단하게 만든 플로우차트이다.

 

로직 흐름을 크게 4가지로 나눠볼 수 있다.

 

1) 상품정보 및 중복 구매 검증

상품정보의 경우에는 현재 판매중인 상품의 이름 및 가격정보 상세내용을 내려주는 API이며, 해당 내용을 App 뷰에 뿌려지는 내용이다.중복구매 검증의 경우에는 현재 인앱결제로 진행하고자하는 상품은 구독 상품이며, 중복구매가 불가능하기 때문에, 중복구매검증을 체크한다.

 

2) 결제시도 

결제시도는 App에서 처리하는 부분으로써, 내가 구현한 부분이 아니라 어떤식으로 개발했는지는 잘모른다,,, 패쓰 하겠다. 

아무튼 결제를 완료하게 애플은 App에게 영수증을 건내준다.

 

3) 영수증 검증 

서버는 App 으로부터 영수증을 받아 애플측에 해당 영수증을 던져 유효한 영수증인지 체크한다. 유효한 영수증이면 애플은 우리 서버쪽에 구매관련 정보들을 주게 되고, 해당 구매관련 정보를 주문 테이블에 저장하도록 하였다.

 

4) 결제완료 

영수증검증이 완료되었다라는 값을 App에게 내려주고 App은 해당 응답값을 받으면 서버에 결제가 완료되었다고 알려주도록 하였다.

서버는 결제가 완료 되었다는 요청을 받으면 구독 권한을 주며 주문 데이터의 상태도 결제완료로 업데이트한다.

 

해당 로직으로 구현 하다보니 몇가지 포인트에서 장애가 발생할 수 있겠다 라는 생각이 들었다.

 

1) 서버에 오류가 날 경우( 3번 영수증 검증 단계 ) 성공이라는 응답값을 앱이 받지 못하니, 결국 결제 완료 라는 요청을 서버는 받지 못해 유저의 돈은 빠져나가고, 주문의 상태는 Ready 상태이고, 구독 권한을 받지못해 기능을 사용하지 못하는 상황

2) 1번 상황이 발생하여 유저는 구매가 안된줄 알고 재구매를 하는 상황

 

어떤식으로 해결하였는가?

1번 상황의 경우, 애플의 웹훅을 통해서 해당 문제를 해결하였다. 애플은 이번에 웹훅 V2를 지원하면서 구독상품의 다양한 상태에 대해서 등록한 서버에 요청을 쏴준다. 결국 애플은 결제가 완료되었으니 우리 서버쪽에 결제 완료라는 요청을 쏴주게 되는것이고, 해당 웹훅 내에 들어있는 주문 번호를 통해서 주문 건을 찾고, ready 상태의 주문번호가 존재하면 PAID 상태로 변경해주고, 구독권한을 주도록 로직을 추가하여 개발을 진행하였다.

2번 상황의 경우 다행히 구독상품이기에 중복구매를 못하도록 애플측에서 막아주었다. 혹시 나 하는 상황을 대비하여 서버에서는 요청이 들어온 주문번호를 토대로 주문 데이터를 찾아 존재할경우 예외를 터트리도록 하였다.