빌링 개발 연동
게임 개발 스튜디오에서 빌링 결제 기능을 구현하는 과정에서 실수할 수 있는 부분에 대한 체크리스트입니다.
1. 기본 설명
빌링을 게임에 연동하는 과정에서 놓칠 수 있는 부분에 대한 간단한 체크리스트입니다.
개발을 위한 모든 내용이 포함되어 있지는 않습니다. 상세 내용은 SDK 및 서버 API 상세 가이드 등을 참고하세요.
2. 체크리스트
전체 공통
구매 복구 기능이 준비되어 있는지?
시퀀스 중 구글 또는 애플 장애 발생 등을 대응하기 위한 준비
API 등 외부 호출 과정에서 네트워크 오류 등이 발생하면 Jitter 기반의 Backoff를 이용해서 재시도 구현(참고 링크)
인게임 상점 진입시 트랜잭션 재 시도 또는 복구 기능 버튼을 설정 등의 메뉴에 위치
클라이언트(with SDK)
GetProduct()로 상품 조회 후 등록되지 않은 상품에 대해서 QueryProductDetails 호출하는지?
QueryProductDetails은 스토어에 상품정보를 요청하는 것으로 네트워크 트래픽 사용
GetProduct은 QueryProductDetails으로 조회한 상품 정보 캐시
재 로그인 후에 빌링플랫폼 PreInit을 변경된 계정 정보와 함께 호출하는지?
다른 계정으로 로그인 대비
빌링플랫폼 PreInit 후 게임 플레이 가능한 상태로 진행한 경우 구매복구 요청하는지?
결제 후 수신한 영수증 정보를 게임서버에 구매 완료 요청한 후 수신한 결과 SDK에 알려주는지?
OnCompletedPurchase(true or false)
결제 어뷰징 건으로 자동제재된 경우 로그인 시 서비스 이용 제재 팝업이 정상 노출하는지?
결제 어뷰징 자동 제재 기능을 사용하는 경우에만 해당
스팀 결제(게임서버)
API 호출 타임아웃은 최소 30초로 설정 하였는지?
스팀 API는 매우 느린 경우가 종종 발생하여 랩핑해서 기능을 제공하는 빌링 API도 느린 경우가 발생할 수 있음
애플 결제(게임서버)
영수증 검증 API의 타임아웃은 최소 15초로 설정하였는지?
애플 API가 느리기 때문에 발생하는 타임아웃 대비
애플 결제(클라이언트)
구매 복구 과정에서 수신한 영수증으로 게임서버에게 구매 완료를 요청할 때, 게임서버로부터 이미 지급한 구매건으로 결과를 수신한 경우 OnCompletedPurchase(true)로 호출하여 미처리 구매건을 완료처리하는지?
2-2. 구매 복구 체크리스트 관련 추가 설명
Android, Google Play Games
시나리오1 : 결제 완료 후 게임 서버에 결제 영수증 전송 실패
결제 완료 ➔ 앱: 결제 영수증 수신(X)
결제 완료 ➔ 앱: 결제 영수증 수신 ➔ 게임서버 전달(X)
앱 : 게임서버 로그인 ➔ BillingPlatform.Restore() 호출 ➔ 결제 영수증 수신 ➔ 게임서버 전달
게임서버 : 앱: 결제 영수증 수신 ➔ 결제 백엔드 연동 결제 프로세스 진행
시나리오2 : 결제 완료 후 게임 서버에 결제 영수증 전송 성공
결제 완료 ➔ 앱: 게임 이벤트 수신(O)
결제 완료 ➔ 앱: 게임 이벤트 수신 ➔ 게임서버 전달(O)
앱 : 게임서버 로그인
게임서버 : 로그인 한 계정에 미 완료된 결제 있는지 체크 후 프로세스 완료
게임에서 Restore() 호출로 구매 복구를 시도하기 전에, 게임 서버 로그인 후 미 완료된 결제 건이 있는지 체크하여 미처리 결제 프로세스를 완료되어야 합니다.
PlayStore 결제는 서버로 결제 영수증이 전달 된 후에는 클라이언트 개입 없이 서버에서 결제가 완료되어야 한다.
서버로 결제 영수증이 전달되지 않은 결제 건에 대해서 Restore()를 호출하여 결제 영수증을 구해야합니다.
iOS
시나리오1 : 결제 완료 후 게임 서버에 결제 영수증 전송 실패
결제 완료 ➔ 앱: 결제 영수증 수신(X)
결제 완료 ➔ 앱: 결제 영수증 수신 ➔ 게임서버 전달(X)
앱 : BillingPlatform.Restore() 호출 ➔ 결제 영수증 수신 ➔ 게임서버 전달
게임서버 : 결제 영수증 수신 ➔ 결제 백엔드 연동 결제 프로세스 진행
앱 : 결제 프로세스 완료 후 결제 결과 수신
BillingPlatform.OnPurchaseCompleted(true) 호출 ➔ 중요 반드시 호출되어야 한다.
true을 호출하지 않으면 미처리 상품으로 계속 남게 되어 Restore() 호출할 때 마다 결제 영수증을 서버에 전달하게 된다.
이미 아이템 지급까지 완료된 결제 건에 대해서도 Restore() 호출로 결제 영수증이 수신되어 게임서버에 전달될 수 있음
시나리오2 : 결제 완료 후 게임 서버에 결제 영수증 전송 성공
결제 완료 ➔ 앱: 결제 영수증 수신(O)
결제 완료 ➔ 앱: 결제 영수증 수신(O) ➔ 게임서버 전달(O)-> 결제 프로세스 완료(X)
결제 완료 ➔ 앱: 결제 영수증 수신(O) ➔ 게임서버 전달(O) -> 결제 프로세스 완료(O) ➔ 아이템 지급(O) ➔ BillingPlatform.OnPurchaseCompleted(true)를 호출 (X)
앱 : BillingPlatform.Restore() 호출 ➔ 결제 영수증 수신 ➔ 게임서버 전달
게임서버 :
(1) 로그인 한 계정에 미처리 결제 건이있는지 체크 후 프로세스 완료
(2) BillingPlatform.Restore() 호출로 결제 영수증 수신
(1)에서 이미 완료한 결제 건 인 경우 ➔ 앱에 결과 전달
결제 프로세스 완료되지 않은 경우 ➔ 결제 백엔드 연동 결제 프로세스 진행 ➔ 앱에 결과 전달
앱 : 결제 프로세스 완료 후 결제 결과 수신
BillingPlatform.OnPurchaseCompleted(true) 호출
이미 아이템 지급까지 완료된 결제 건에 대해서도 BillingPlatform.Restore() 호출로 결제 영수증이 수신되어 게임 서버에 전달될 수 있음
서버에서 완료 결과를 앱 이 수신 실패 하여 OnPurchaseCompleted(true) 호출이 안되는 경우
이미 지급된 결제 건에 대해서도 반드시 OnPurchaseCompleted(true)를 호출하여 결제를 완료해야 한다. ((2) - (1) 경우 해당)
iOS는 앱에서 결제 프로세스가 완료되기 때문에, Restore() 호출로 수신 된 결제 영수증이 게임 서버에 전달된 후에는 반드시 OnPurchaseCompleted(true)를 호출하여 결제를 완료해야 한다.
OnPurchaseCompleted(true) 호출로 결제를 완료하지 않으면 AppStore에 미처리 결제 건으로 계속해서 남아있게 됩니다.
정리하면, 결제 영수증 소비 처리는
안드로이드 : 서버에서 결제 프로세스 과정에서 소비 처리
iOS : 앱에서 OnPurchaseCompleted(true) 호출로 결제 프로세스 과정에서 소비처리 즉, 게임에서 결제 영수증 소비 처리
true로 호출하지 않으면 Restore() 호출할 때 마다 미처리 결제 건으로 결제 영수증이 게임으로 전달됩니다.
이미 지급된 결제 건에 대해서 중복 요청한 경우 게임 서버에서 게임으로 '이미 지급한 결제' 건으로 정보를 전달하고 이 경우에 게임은 OnPurchaseCompleted(true) 호출하여 이미 지급된 결제 건을 소비처리 해야 합니다.
Last updated