Apple 유저의 구매 완료 요청에 대한 검증
기본 정보
Apple App Store에서 유저가 구매한 결제 건을 검증합니다.
영수증 검증 및 기본적인 어뷰징 체크가 진행됩니다.
빌링 API가 애플서버와 영수증 검증 과정에서, 첫 번째 요청은 프로덕션 애플 서버로 검사하며 에러코드를 판별하여 샌드박스 영수증이라면 두 번째 요청을 샌드박스 환경의 애플 서버로 검사합니다.
앱 리뷰 중 애플 직원의 구매 테스트 검수를 통과할 수 있습니다.
앱이 검수 통과되었을 때 실제 사용자는 프로덕션 애플 서버로 구매가 진행되기 때문에 설정 변경이 필요 없습니다.
애플 영수증 검증 API는 느리기 때문에 타임아웃은 최소 15초 이상을 추천합니다.
타임아웃 등으로 빌링쪽에만 검증 성공으로 남을 수 있습니다. 빌링 구매 리스트 조회 API를 이용해서 상태 체크가 가능합니다.
호출주체
게임서버(s2s API)
HTTP 메소드
POST
Content-Type
application/json
사전 필요사항
pjid 및 svcId 발급
빌링 시스템에 bundle_id 설정
Request
HTTP Request end point
HTTP Request Header
아래의 HTTP Header들을 API 요청에 포함시켜야합니다.
X-Req-Pjid
프로젝트ID
기술 PM 등에게 전달받은 프로젝트ID
X-Auth-Access-Key
인증용 키
기술 PM 등에게 전달받은 해당 게임용 인증 키
HTTP Request Parameter
아래의 공통 파라미터 외에 하단의 각 결제 스토어 특화 파라미터들도 같이 요청해야 합니다.
Content-Type: application/json 으로 요청되어야 합니다.
영수증 관련 정보들의 길이 및 escape 등의 문제 때문
reqId
String(100)
Y
중복 요청을 막거나 요청 추적을 위한 값
userId_UUID 등과 같은 방식으로 생성
pjid
String(20)
Y
프로젝트ID
동일 게임이라면 서비스ID가 여러개일 수 있지만 프로젝트ID는 같음
1004
boid
String(20)
Y
빌링 시스템 구매 예약 API를 통해서 생성된 ID
1234
productId
String(200)
N
구매 진행하는 상품ID(SKU와 같은 값) - 옵션 값으로 전달되는 경우에만 boid의 예약 시점의 상품과 동일한지 추가 검사 진행
playerId
String(50)
Y
주문 완료를 진행하는 유저ID
microPrice
long
Y
구매 금액 micro단위
사용측의 부동 소수점 오차등을 방지하기 위해서 micro단위 사용
구매 금액 micro단위(예. $0.99는 990,000 µ$. 100만을 곱함)
스토어 특화 파라미터
transactionId
String
Y
구매 단건의 transaction_id
애플 → SDK → 클라이언트 → 게임서버 → 빌링으로 전달 필요
멀티 디바이스 사용할 경우 소모성 상품이더라도 동일 영수증내 in_app이 N건이 존재 가능하기 때문에 특정 지을 정보가 빌링 서버에서 필요
2000000574982560
receiptData
String
Y
구매 영수증
요청 json 샘플
하단 curl을 참고하셔도 됩니다.
Response
응답은 JSON형태로 전달됩니다.
Success sample
검증 결과 문제가 없어서 성공이라면 게임 서버는 유저에게 아이템 및 재화를 지급하고, 이후 빌링 API에 완료 API를 호출해서 최종 완료 보고를 해주시면 됩니다.
게임 서버에서는 필요 로그를 게임DB 또는 로그 DB에 저장해주시는게 좋습니다.
Error sample
다른 boid의 데이터를 검증 시도(동일 영수증 중복 사용 요청)
에러코드 ALREADY_EXIST_DATA로 응답하며 existPurchaseInfo가 추가로 응답됩니다.
게임 서버에서 추가로 기능 구현할 때 사용 가능합니다.
boid
String(20)
빌링 시스템의 주문ID
4
purchaseStatus
String(30)
빌링시스템에 구매 상태
imid
String(40)
IMID
하이브IM의 IMID로 로그인 후 얻을 수 있음
PJID 내 사용자를 식별하는 고유 Key
aaaabbbb-ccccddd-fffccc-tttggg
playerId
String(50)
구매를 진행하는 유저의 ID
게임에서 결제 스콥을 관리하고 싶은 id값으로 사용
하이브 IM의 imid값이 될 수도 있음
paymentOrderId
String(100)
결제가 진행된 payment의 주문ID
스토어/마켓에서 발급한 주문ID
productId
String(200)
구매 진행하는 상품ID
SKU와 같은 값
변조된 영수증으로 완료 요청
영수증내 inApp이 N건인데 transactionId도 전달이 안되어 찾을 수 없는 경우
게임쪽에서 transactionId 를 필수로 전달해주도록 변경된 후에는 에러 메시지가 틀려질 예정
에러 코드 정의
아래와 같은 에러코드가 resultCode에 응답될 수 있습니다. (참고 링크)
아래의 에러코드들은 모든 빌링 API에서 발생 가능한 에러 코드들입니다.
해당 에러코드 외에 각 API에서만 발생가능한 에러코드들도 있습니다.
각 에러 코드를 바탕으로 필요시 비즈니스 로직을 작성하시면 됩니다.
SYSTEM_ERROR
빌링 API에서 발생한 시스템 에러
HTTP 상태코드 500 리턴
NOT_ALLOW_AUTH
API 인증 헤더 누락이거나 기타 권한이 없는 요청에서 발생
아래 에러 코드들은 해당 API에서 발생 가능한 추가 에러 코드들입니다.
INVALID_PARAMETER
ALREADY_EXIST_DATA
이미 데이터가 존재
동일 영수증 정보로 이미 데이터가 존재와 같은 케이스
NOT_ALLOW_PURCHASE
구매 기능을 사용할 수 없는 상황
빌링 시스템에 스토어 관련 설정 누락
다른 유저의 결제 예약건을 완료 처리 시도
NOT_VALID_RECEIPT
구매 영수증 검증결과 유효하지 않음
애플 영수증 검증결과 유효하지 않음
어뷰징 구매건
EXTERNAL_API_ERROR
빌링 API가 호출하는 외부 API가 에러인 경우
예) 애플 API 장애로 영수증 검증 수행 실패
게임 서버는 지수 백오프 알고리즘으로 재 시도하거나 클라이언트의 미 처리 영수증 처리 기능으로 처리할 수 있음
요청 curl 샘플
도메인 및 인증 헤더 등은 변경 필요
Last updated