Apple 유저의 구매 완료 요청에 대한 검증

기본 정보

  1. Apple App Store에서 유저가 구매한 결제 건을 검증합니다.

  2. 영수증 검증 및 기본적인 어뷰징 체크가 진행됩니다.

    1. 빌링 API가 애플서버와 영수증 검증arrow-up-right 과정에서, 첫 번째 요청은 프로덕션 애플 서버로 검사하며 에러코드를 판별하여 샌드박스 영수증이라면 두 번째 요청을 샌드박스 환경의 애플 서버로 검사합니다.

      1. 앱 리뷰 중 애플 직원의 구매 테스트 검수를 통과할 수 있습니다.

      2. 앱이 검수 통과되었을 때 실제 사용자는 프로덕션 애플 서버로 구매가 진행되기 때문에 설정 변경이 필요 없습니다.

    2. 애플 영수증 검증 API는 느리기 때문에 타임아웃은 최소 15초 이상을 추천합니다.

      1. 타임아웃 등으로 빌링쪽에만 검증 성공으로 남을 수 있습니다. 빌링 구매 리스트 조회 API를 이용해서 상태 체크가 가능합니다.

항목
내용
비고

호출주체

게임서버(s2s API)

HTTP 메소드

POST

Content-Type

application/json

사전 필요사항

  1. pjid 및 svcId 발급

  2. 빌링 시스템에 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 등의 문제 때문

이름
데이터 타입
필수 Y/N
설명

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만을 곱함)

currency

String(10)

Y

구매 금액의 화폐 단위

USD

스토어 특화 파라미터

이름
데이터 타입
필수 Y/N
설명

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가 추가로 응답됩니다.

      • 게임 서버에서 추가로 기능 구현할 때 사용 가능합니다.

key
data type
description
example

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