IAP v4 실시간 구독 알림
실시간 구독 알림을 활용하면 게임 서버는 Hive IAP 서버로부터 유저 구독 상태 정보를 실시간으로 수신해 구독 유예, 보류, 일시 정지 기능을 구현할 수 있습니다. 실시간 구독 알림 API는 Hive IAP 서버가 게임 서버를 호출하는 형식이며 Request Body에 구독 상태 변경 정보를 담아 실시간으로 전달하는 API입니다. 따라서, 게임 서버는 이 정보를 수신할 API, 즉 API 엔드포인트(URL)를 Hive에 제공해야 합니다.
API URL은 Hive 콘솔 > 앱센터 > 게임 상세 > 게임서버 탭 > 게임서버 및 마켓 서버 알림 URL 등록에서 등록할 수 있습니다. 게임 서버가 지역별로 나뉘어 있고, 각 게임 서버에서 알림을 수신해야 한다면 게임 서버마다 URL을 제공해주세요. 이후 Hive IAP에서는 URL이 전달된 모든 게임 서버로 알림을 전송합니다.
Hive IAP는 Hive 서버에서 게임 서버로 실시간 구독 상태를 전송합니다. 따라서 알림을 받을 게임 서버는 아래 서버 IP의 인바운드 방화벽을 해제해야 합니다.
- 43.202.181.138
-
3.38.239.17
-
요청 명세 (Hive IAP > 게임 서버)
필드명 | 설명 | 타입 | 필수여부 |
---|---|---|---|
notification_type | 알림 타입 | String | Y |
sub_type | 알림 서브 타입입니다. 애플 알림에만 있는 subtype 정보입니다. | String | N |
hiveiap_market_id | 결제한 마켓 구분 코드 1. Apple App Store 2. Google Play Store | Integer | Y |
hiveiap_receipt_verify_result | 마켓 검증 서버에서 전달한 영수증 검증 결과 | Object | Y |
hiveiap_receipt_start_date_ms | 구독 시작 시간 (Unix TimeStamp Milliseconds) | String | Y |
hiveiap_receipt_expire_date_ms | 구독 만료 시간 (Unix TimeStamp Milliseconds)입니다. 이 값이 변경되었다면, 알림 타입에 상관없이(모든 알림 타입에 대하여) 게임 내에서도 구독 만료 시간 변경을 반영해야 합니다. 예를 들어, 게임 내에서 유저가 보유한 구독형 게임 아이템의 사용 만료 기간을 변경해야 합니다. | String | Y |
hiveiap_receipt_autoresume_date_ms |
| String | N |
hiveiap_receipt_subscription_state | 구독 상태입니다. 0. 정상 구독 1. 결제 유예 2. 결제 보류 3. 일시 중지 4. 만료 | Integer | N |
hiveiap_apple_info | Apple 구독 영수증 검증 결과에서 구독 영수증을 식별할 수 있는 키 정보를 가진 객체입니다. App Store 구독 영수증일 경우만 해당됩니다. 응답코드가 0(검증 성공)일 때만 값을 전달합니다. | Object | N |
ㄴ original_transaction_id | 애플 구독 영수증을 식별 가능한 키입니다. 어떤 Apple Store 계정이 구입한 동일 상품이나 동일 그룹 내 상품을 업그레이드, 다운그레이드, 취소 또는 재구매했을 때에도 이 값은 항상 동일한 값을 반환합니다(16자이며 Apple 가이드에 String 길이에 대한 안내가 없어 변동 가능함). | String | N |
hiveiap_google_info | Google 구독 영수증 검증 결과에서 영수증을 식별할 수 있는 키 정보로 응답 Play Store 구독 영수증일 경우만 해당되며, 응답코드가 0(검증 성공)일 때만 값을 전달 | Object | N |
ㄴ purchase_token | 영수증의 구매 토큰 200자 이상이며 Google 가이드에 별도 설명이 없어 길이 변동이 가능 | String | N |
ㄴ purchase_token_hash | purchase_token 필드 값을 해싱하여 생성한 값 (sha1) purchase_token 값이 길어 게임에서 DB 저장과 조회에 어려움이 예상되기 때문에 해싱 후 제공 (40자) | String | N |
ㄴ linked_purchase_token | 업그레이드, 다운그레이드, 구독 취소 또는 인앱에서 재활성화했을 때 구독 영수증이 신규 발행되면 이 필드 값으로 구 영수증의 구매 토큰 식별이 가능 값이 있을 경우 구 영수증을 강제 만료시키도록 권장 200자 이상이며 Google 가이드에 별도 설명이 없어 길이 변동이 가능 (단, Play Store에서 재활성화 했을 때는 신규 발행 없음) | String | N |
ㄴ linked_purchase_token_hash | linked_purchase_token 필드 값을 해싱하여 생성한 값 (sha1) linked_purchase_token 값이 길어 게임에서 DB 저장과 조회에 어려움이 예상되기 때문에 해싱 후 제공 (40자) | String | N |
hiveiap_iap_payload | 게임사에서 정의한 구매 메타 정보입니다. 정의한 메타 정보가 없으면 null 을 반환합니다. | String | Y |
hiveiap_receipt_cancel_date_ms | 구독 취소 시간(unix timestamp, ms)입니다. 기본값은 0입니다. | Integer | Y |
hiveiap_receipt_refund_date_ms | 결제 환불 시간(unix timestamp, ms)입니다. 기본값은 0입니다. | Integer | Y |
Warning
hiveiap_receipt_subscription_states
는 현재 Google 구독만 값을 전송합니다. 구독 결제 보류(Account holding) 안내 및 구독 복원 지원 기능이 2020년 11월 1일부터 필수 사항으로 Google 정책이 변경되기 때문에 구독 상태 확인을 목적으로 추가되었습니다.
- 결제 유예(Grace period): 유저의 결제 상태가 정상화될 때까지 만료 시간 연장 (Google 마켓 콘솔에 설정한 유예 시간 동안 적용)
- 결제 보류(Account holding): 유저의 결제 상태가 정상화되지 않은 상황에 만료 시간이 지나면서 컨텐츠 권한이 부여되지 않으나, 결제 상태가 정상화된 후 구독을 복원할 때 구독 만료 시간 연장 (최대 30일간 결제 보류 상태 유지)
- 호출 (Hive IAP > 게임 서버)
curl -L -v
-d '{"notification_type":"SUBSCRIBED","sub_type":"RESUBSCRIBE","hiveiap_market_id":1,"hiveiap_market_pid":"com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.arshive001","hiveiap_receipt_verify_result":{"status":0,"receipt":{"transactionId":"2000000326618738","originalTransactionId":"2000000287618347","webOrderLineItemId":"2000000026848658","bundleId":"com.com2us.hivesdk.normal.freefull.apple.global.ios.universal","productId":"com.com2us.hivesdk.normal.freefull.apple.global.ios.universal.arshive001","subscriptionGroupIdentifier":"20519034","purchaseDate":1683534980000,"originalPurchaseDate":1677492217000,"expiresDate":1683535160000,"quantity":1,"type":"Auto-Renewable Subscription","appAccountToken":"5e657cde-3651-34c0-93fa-1e9cfccfafa2","inAppOwnershipType":"PURCHASED","signedDate":1688470718581,"environment":"Sandbox","transactionReason":"RENEWAL","storefront":"KOR","storefrontId":"143466"}},"hiveiap_receipt_start_date_ms":"1683534980000","hiveiap_receipt_expire_date_ms":"1683535160000","hiveiap_apple_info":{"original_transaction_id":"2000000287618347"},"hiveiap_iap_payload":"{\"server\":\"1\",\"character\":\"1\"}","hiveiap_receipt_cancel_date_ms":0,"hiveiap_receipt_refund_date_ms":0}' \
-H "Content-Type: text/html" \
https://sandbox-misample.com2us.net/hive/Iap_subscription_notification // (게임 서버에서 제공한 API 엔드포인트 예시)
curl -L -v
-d '{"notification_type":"13","hiveiap_market_id":2,"hiveiap_market_pid":"sub01","hiveiap_receipt_verify_result":{"kind":"androidpublisher#subscriptionPurchaseV2","startTime":"2023-07-25T08:00:19.285Z","regionCode":"KR","subscriptionState":"SUBSCRIPTION_STATE_EXPIRED","latestOrderId":"GPA.3319-2535-4331-99754..0","canceledStateContext":{"userInitiatedCancellation":{"cancelTime":"2023-07-25T08:07:21.881Z"}},"testPurchase":[],"acknowledgementState":"ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED","externalAccountIdentifiers":{"obfuscatedExternalAccountId":"84530982-c9c3-3114-b0dc-848dd7e8bf76"},"lineItems":[{"productId":"sub01","expiryTime":"2023-07-25T08:10:09.583Z","autoRenewingPlan":[],"offerDetails":{"basePlanId":"p1w"}}]},"hiveiap_receipt_start_date_ms":"1690272019000","hiveiap_receipt_expire_date_ms":"1690272609000","hiveiap_receipt_autoresume_date_ms":"","hiveiap_receipt_subscription_state":4,"hiveiap_google_info":{"purchase_token_hash":"5a109e5da69467a706a180fca423e09ab7671389","purchase_token":"eejgienjlbapbnojcnjipdib.AO-J1OxxtNGzvOT7-mSeeAORzZ0GZ90t33v7UQn-t4xPAPGLCQqQAPFmvDK3p3wO8ZwXfYCwmVk9pTI93P8k4IyZJn2XI7ES-EJEFPOLpmUzlXXsOndqbhu1oPRu7V4ddTIUCVB_cHjGKvRnZu1DUu2dEd603grO2Q","linked_purchase_token":"","linked_purchase_token_hash":""},"hiveiap_iap_payload":null,"hiveiap_receipt_cancel_date_ms":1690272441000,"hiveiap_receipt_refund_date_ms":0}' \
-H "Content-Type: text/html" \
https://sandbox-misample.com2us.net/hive/Iap_subscription_notification // (게임 서버에서 제공한 API 엔드포인트 예시)
- 요청 (Hive IAP > 게임 서버)
- 응답 명세 (게임 서버 > Hive IAP)
필드명 | 설명 | 타입 | 필수여부 |
---|---|---|---|
result_code | 응답 코드
| Integer | Y |
result_msg | 응답 메시지 | String | Y |
- 응답 (게임 서버 > Hive IAP)