IAP v4 リアルタイムサブスクリプションの通知
リアルタイムのサブスクリプション通知は、ゲームが猶予期間中、保留中、または一時停止中のさまざまなタイプのサブスクリプションを実装するのに役立ちます。リアルタイムのサブスクリプション通知APIは、IAPサーバー側から呼び出され、ゲームサーバーにリクエストを送信します。このAPIのリクエストボディを介して、ユーザーサブスクリプションの状態変更をリアルタイムで配信します。したがって、ゲームサーバーはこの情報をHiveサーバーに受信するためのAPIエンドポイント(URL)を提供する必要があります。
APIのURLは、the Hiveコンソール > アプリ センター > ゲーム リスト > ゲーム 詳細 > ゲーム サーバー > マーケットサーバー通知URLに登録できます。ゲームサーバーが地域ごとに分かれており、各地域が通知を受け取る必要がある場合は、URLを1つずつ提供してください。その後、IAPはすべてのゲームサーバーに通知を送信します。
IAPは、Hiveサーバーからゲームサーバーにリアルタイムのサブスクリプション状態を送信します。したがって、ゲームサーバーが通知を受け取るために、以下のサーバーIPのインバウンドファイアウォールを開放していることを確認してください。
- 43.202.181.138
- 3.38.239.17
- リクエスト 仕様 ( IAP > ゲーム サーバー)
フィールド名 説明 タイプ 必須 notification_type 文字列 はい sub_type 通知のサブタイプ。これはAppleの通知のみに関連し、サブタイプ情報です。 文字列 いいえ hiveiap_market_id 有料マーケットコード - Apple App Store
- Google Play Store
整数 はい hiveiap_receipt_verify_result マーケット検証サーバーから送信されたレシートの検証結果 オブジェクト はい hiveiap_receipt_start_date_ms サブスクリプションの開始時間 (Unix タイムスタンプ ミリ秒) 文字列 はい hiveiap_receipt_expire_date_ms サブスクリプションの終了時間 (Unix タイムスタンプ ミリ秒) この値が変更された場合、すべての通知タイプに対してゲーム内で適用する必要があります。たとえば、ユーザーのゲームアイテムのサブスクリプションの有効期限を変更する必要があります。 文字列 はい hiveiap_receipt_autoresume_date_ms - サブスクリプションが一時停止された場合の再開時間 (Unix タイムスタンプ ミリ秒)
- サブスクリプションが一時停止されていない場合は“”が受信されます
文字列 いいえ hiveiap_receipt_subscription_state サブスクリプションの状態
- アクティブ
- グレース期間中
- 保留中
- 一時停止中
- 期限切れ
- 猶予期間: ユーザーの支払い状態が正常に戻るまで有効期限を延長します(Google Play Consoleで設定された猶予期間にのみ適用されます)。
- アカウント保留: 支払いに問題があるため、コンテンツの使用許可は付与されませんが、支払い状態が正常に戻った後に有料サブスクリプションを復元する際にサブスクリプションの有効期限を延長します(最大30日間保留状態を維持します)。
整数 N hiveiap_apple_info このオブジェクトは、Appleのサブスクリプションレシート検証結果においてサブスクリプションレシートを識別するためのキー値を持っています。これはApp Storeのサブスクリプションレシートにのみ使用されます。レスポンスコードが0(検証成功)の場合のみ提供されます。 オブジェクト N ㄴ original_transaction_id これはAppleのサブスクリプションレシートを識別するためのキー値です。App Storeアカウントの場合、この値は同じ製品を購入した場合、または同じグループ内でアップグレード、ダウングレード、再購入、または購入がキャンセルされた場合に同じままです(16文字が許可されていますが、この文字列の長さに関する具体的なガイドはありません)。 文字列 N hiveiap_google_info Googleのサブスクリプションレシート検証結果においてレシートを識別するためのキー値 Play Storeのサブスクリプションレシートのみ。レスポンスコードが0(検証成功)の場合のみ値を送信します。 オブジェクト N ㄴ purchase_token レシート内の購入トークン。 トークン値は200文字以上が必要で、Googleのガイドに制限がないため、長さの変更が可能です。 文字列 N ㄴ purchase_token_hash `purchase_token`フィールドの値をハッシュ化することによって生成されます(sha1)。 `purchase_token`の値が長いため、データベースで検索して保存するためにハッシュ処理を行います(40文字)。 文字列 N ㄴ linked_purchase_token サブスクリプションレシートがアップグレード、ダウングレード、キャンセル、または再アクティブ化の後に新たに発行された場合、このフィールドの値は古いレシート内の購入トークンを識別できます。 値がある場合は強制的に期限切れにすることを推奨します。 トークン値は200文字以上が必要で、Googleのガイドに制限がないため、長さの変更が可能です。 (ただし、Play Storeでの再アクティブ化の場合は新たな発行はありません) 文字列 N ㄴ linked_purchase_token_hash `linked_purchase_token`フィールドの値をハッシュ化することによって生成されます(sha1)。 `linked_purchase_token`の値が長いため、データベースで検索して保存するためにハッシュ処理を行います(40文字)。 文字列 N hiveiap_iap_payload これはゲーム会社によって定義された購入メタ情報です。 メタ情報が定義されていない場合、`null`が返されます。 文字列 Y hiveiap_receipt_cancel_date_ms これはサブスクリプションがキャンセルされた時刻(Unixタイムスタンプ、ミリ秒)です。デフォルト値は0です。 整数 Y hiveiap_receipt_refund_date_ms これは購入の返金が行われた時刻(Unix タイムスタンプ、ms)です。デフォルト値は 0 です。 整数 Y
- コール ( 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 // (the API endpoint example provided from your game server)
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" \ (あなたのゲームサーバーから提供されたAPIエンドポイントの例)
- リクエスト ( IAP > ゲーム サーバー)<
フィールド名 | 説明 | タイプ | 必須 |
result_code | レスポンスコード
| 整数 | Y |
result_msg | レスポンスメッセージ | 文字列 | Y |
- 応答 (ゲーム サーバー > IAP)
< HTTP/2 200
< server: nginx
< date: Fri, 25 Mar 2022 06:56:17 GMT
< content-type: application/json; charset=utf-8
{"result_code":0,"result_msg":"OK"}</pre>