IAP v4 实时订阅通知

通过实时订阅通知,游戏服务器实时接收来自Hive IAP服务器的用户订阅状态信息。用户可以利用这些信息实现订阅暂停、保留和暂停功能。

Warning

要使用实时订阅通知功能,您必须在市场控制台中设置通知 URL

实时订阅通知 API 通过从 Hive IAP 服务器向游戏服务器发出调用来工作,并在请求体中包含订阅状态更改信息,并实时传输。由于游戏服务器接收到订阅状态更改信息,因此必须向 Hive 提供 API 端点 (URL)。

API URL 可以在 the Hive 控制台 > App Center > Game List > Game details > Game server > Market 服务器通知 URL 中注册。如果游戏服务器按区域划分,并且每个区域都应该接收通知,请逐个提供 URL。然后, IAP 会向所有游戏服务器发送通知。

 

IAP 将实时订阅状态从 Hive 服务器发送到游戏服务器。因此,请确保游戏服务器打开以下服务器 IP 的入站防火墙以接收通知。

  • 43.202.181.138
  • 3.38.239.17

 

  • 请求 规范 ( IAP > 游戏 服务器)
    字段名称 描述 类型 必需
    notification_type

      通知类型

    • 苹果
    • 谷歌: 订阅在宽限期/挂起/暂停状态时,基于 hiveiap_receipt_subscription_state 的值。请将此字段用作参考数据。
    字符串
    sub_type 通知的子类型。仅适用于苹果通知 子类型信息 字符串
    hiveiap_market_id 付费市场代码
    1. 苹果应用商店
    2. 谷歌 Play 商店
    整数
    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

    订阅状态

    1. 活动
    2. 在宽限期内
    3. 挂起
    4. 暂停
    5. 过期
    目前仅可发送 Google 订阅数据。根据修订后的 Google 政策,从 2020 年 11 月 1 日起,账户保持和恢复功能是必需的。此 API 检查订阅状态。
    • 宽限期:它将到期延长,直到用户的付款状态恢复正常(仅适用于在 Google Play 控制台上设置的宽限期)。
    • 账户保持:由于付款存在问题以及到期时间结束,未授予使用内容的权限,但在付款状态恢复正常后恢复付费订阅时,它会延长订阅到期时间(保持保持状态最长 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`。 字符串
    hiveiap_receipt_cancel_date_ms 这是订阅被取消时的时间(unix 时间戳,毫秒)。默认值为 0。 整数
    hiveiap_receipt_refund_date_ms 这是进行购买退款时的时间(Unix 时间戳,毫秒)。默认值为 0。 整数
  • 拨打 ( 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 > 游戏 服务器)
> POST /hive/Iap_subscription_notification HTTP/2
> Host: misample.com2us.net // (游戏服务器提供的API端点示例)
> user-agent: curl/7.68.0
> accept: /> content-type: text/html
> content-length: 1211
> POST /hive/Iap_subscription_notification HTTP/2
> Host: misample.com2us.net // (游戏服务器提供的API端点示例)
> user-agent: curl/7.68.0
> accept: /> content-type: text/html
> content-length: 1369

 

  • 响应规范 (游戏 服务器 > IAP)
    字段名称 描述 类型 必需
    result_code 响应代码
    • 0: 应用成功。除非游戏服务器错误,否则响应为成功
    • 其他代码: 应用失败
    整数
    result_msg 响应消息 字符串

    • 响应 (游戏 服务器 > 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>