跳转至

订阅支付系统

自动续订订阅

Hive SDK v4.11.6 支持一种新功能,称为自动续订订阅,它会定期重复付款。订阅的类型包括月度订阅、年度订阅和一般的免费试用。如果您想了解更多关于 Google 和 Apple 提供的订阅格式,请参考下表。如果用户选择按操作系统类型的定期付款周期,则可以使用自动续订订阅。

操作系统 Google Apple
续订条款 每周 每月 每3个月 每6个月 每年 每周 每月 每2个月 每3个月 每6个月 每年

确保让您的游戏用户在任何设备类型下随时访问自动续订订阅,如果用户定期被收取特定订阅费用。订阅恢复是根据用户需求的基本功能。

价格变动 自动续订的订阅可以免费升级或降级订阅级别。订阅不是一次性使用的,并在用户尝试恢复时提供收据。

在谷歌上,订阅可以免费升级或降级订阅级别,并更改为新的订阅,无论之前的订阅如何。如果用户更改价格,则之前订阅的价值将按日计算,并在新订阅到期后提供。

在苹果平台上,订阅组在iTunes控制台上定义,因此可以更改为同一组中的其他订阅类型。如果用户升级其订阅,之前订阅的价值将按日计算,并在新订阅到期后提供。在降级的情况下,它将在现有订阅到期后续订为新订阅。

Warning
  • 建议提供与Google相同的Apple订阅周期,每周、每月、每3个月、每6个月和每年类型。
  • 订阅不会自动恢复。
  • 建议每个游戏使用一种类型的自动续订订阅。
    • 所有订阅作为单一订阅组提供功能。
  • 订阅周期、免费试用期和新订阅者的折扣等详细信息不可用。
  • 销售数据不会转移到营销归因工具(例如,Singular,Adjust)内,但IAP服务器会根据订阅周期发送数据。
  • Android订阅:仅支持Google Play商店、Amazon、One Store、Samsung-GalaxyStore和华为。不支持Facebook Cloud和Lebi。
  • iOS订阅:仅支持Apple iTunes Store。
Note

支持的功能可能因操作系统/市场而异。有关更多详细信息,请参见支持功能的状态

购买、恢复和宽限期

购买

  • 免费试用 如果订阅有免费试用期,则不计算为销售。在免费试用期结束后,订阅将自动收费。
  • 新订阅者折扣 这是针对新订阅者的促销活动。此促销在特定时间段内以折扣价格提供。

取消

订阅者可以在续订期之前取消订阅。取消的方法在每个市场的 管理订阅 菜单中描述。取消订阅后,自动续订将失效。

退款

如果订阅者在取消后请求退还订阅的剩余价值,则退款金额是根据剩余时间段和订阅的价值(Google 控制台)计算的。

恢复

如果订阅在付款后不可用,订阅者可以恢复订阅。恢复的价值计算基于所有权政策,如果订阅者拥有该订阅的所有权。

宽限期

当订阅续订未能成功收费时,请使用宽限期。确保在宽限期内的状态与订阅的状态相同。

账户冻结(谷歌)

账户暂停是由于付款时发生问题而未能续订订阅的状态,并以未解决的问题结束。在这种情况下,请确保处理订阅不可用,最长为30天。

暂停 (谷歌)

暂停订阅的最大可用时间为三个月。当该期限结束时,订阅将自动恢复。

显示 Google 通知弹出窗口

如果 Google 订阅状态处于 宽限期账户暂停,则显示通知弹出窗口。弹出窗口应包含当前订阅状态、解决问题的方法以及一个链接到市场设置的按钮。在宽限期内,此按钮并不是必需的,但为了用户方便,建议使用。 如果用户在 宽限期暂停 状态下更改支付信息,则在用户处于 宽限期 状态时,订阅会自动支付。在 账户暂停 状态下,用户应重新启动订阅。当用户的订阅状态在重新启动后续订时,提供一个订阅购买页面和一个恢复按钮,以便用户享受他们的订阅福利。

通知弹窗示例如下。使用这些短语或根据每个游戏进行自定义。 * 宽限期通知短语

韩语 订阅自动付款未正常进行,订阅服务已到期。 请前往Google Play的订阅设置,检查付款方式并重新付款。 付款后请务必点击恢复按钮以检查您的订阅状态。
英语 由于自动付款失败,订阅服务已到期。 前往谷歌商店的订阅设置,查看付款方式后重新进行付款吧。 付款后请务必点击复原(restore)按键查看订阅状态。
日语 由于自动付款未进行,订阅服务已结束。 请前往Google Play的订阅设置,检查付款方式并重试。 付款后,请务必点击“恢复”按钮以检查您的订阅状态。
简体中文 由于自动付款失败,订阅服务已到期。 前往谷歌商店的订阅设置,查看付款方式后重新进行付款吧。 付款后请务必点击复原(restore)按键查看订阅状态。
繁体中文 自動續訂扣款失敗,已取消訂閱服務。 請至Google Play的[訂閱]設定中,確認付款方式後,再次付款。 付款完畢後,請務必點選[回復]按鈕,並確認訂閱狀態。
法语 订阅服务已中断,因为自动付款未正常进行。 请前往Google Play的订阅设置重新进行付款。 付款后,请确保点击“恢复”按钮以确认您的订阅状态。
德语 由于自动付款失败,订阅已过期。 请前往您的Google Play订阅设置,检查付款方式并重试。 请确保在购买后点击“恢复”以检查您的订阅状态。
俄语 由于未能进行自动付款,订阅已过期。 请前往Google Play的订阅设置,检查付款方式并重试。 付款后,请点击“恢复”按钮以确认您的订阅状态。
西班牙语 由于自动付款失败,订阅服务已过期。 请前往Google Play的订阅设置,检查付款方式并重试。 请确保在购买后点击“恢复”以检查您的订阅状态。
葡萄牙语 由于自动付款失败,订阅服务已到期。 请访问Google Play的订阅设置,检查付款方式并重试。 请确保在购买后点击“恢复”以检查您的订阅状态。
印尼语 由于自动付款失败,订阅服务已停止。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请确保在购买后点击“恢复”以查看您的订阅状态。
越南语 由于自动付款未成功,订阅服务已到期。 请前往Google Play的订阅设置,检查您的付款方式并重新付款。 付款后请务必点击“恢复”按钮以检查您的订阅状态。
泰语 由于自动付款未成功,订阅服务已到期。 请前往Google Play的订阅设置,检查付款方式并重试。 请确保在购买后点击“恢复”以检查您的订阅状态。
意大利语 由于自动付款失败,订阅服务已过期。 请前往Google Play的订阅设置,检查付款方式并重试。 请确保在购买后点击“恢复”以检查您的订阅状态。
土耳其语 由于自动付款未正常进行,订阅服务已结束。 请前往Google Play的订阅设置,检查付款方式并重新付款。 付款后,请确保点击“恢复”按钮以检查您的订阅状态。
阿拉伯语 由于自动付款失败,订阅服务已到期。 请前往Google Play的设置,检查付款方式并重试。 请确保在购买后点击“恢复”按钮以检查您的订阅状态。
  • 当处于待处理状态时的通知短语
韩语 구독 자동 결제가 정상적으로 이뤄지지 않아 구독 서비스가 만료되었습니다. Google Play의 구독 설정으로 이동하여 결제 방법을 확인하고 다시 결제를 해주세요. 결제 후엔 반드시 복원(restore)버튼을 클릭하여 구독 상태를 확인해주세요.
英语 The subscription service has expired because the auto subscription payment has failed. Go to the your Google Play subscription settings, check your payment method and try again. Be sure to click Restore after purchase to check your subscription status.
日语 購読自動決済が行われなかったため、購読サービスが終了しました。 Google Playの購読設定に移動して決済方法を確認し、もう一度お試しください。 決済した後、必ず【復元】ボタンをタップして購読状態を確認してください。
简体中文 由于自动付款失败,订阅服务已到期。 前往谷歌商店的订阅设置,查看付款方式后重新进行付款吧。 付款后请务必点击复原(restore)按键查看订阅状态。
繁体中文 自動續訂扣款失敗,已取消訂閱服務。 請至Google Play的[訂閱]設定中,確認付款方式後,再次付款。 付款完畢後,請務必點選[回復]按鈕,並確認訂閱狀態。
法语 Le service d'abonnement est interrompu : le paiement automatique ne s'est pas déroulé normalement. Veuillez procéder de nouveau au paiement en vous rendant dans les paramètres d'abonnement de Google Play. Après le paiement, confirmez bien le statut de l'abonnement en appuyant sur le bouton "Reprendre".
德语 Der Abonnement ist abgelaufen, weil die automatische Zahlung für das Abonnement fehlgeschlagen ist. Gehe zu den Einstellungen deiner Google Play-Abonnements, überprüfe deine Zahlungsmethode und versuche es erneut. Bitte stelle sicher, dass du nach dem Kauf auf Wiederherstellen klickst, um den Status deines Abonnements zu überprüfen.
俄语 Срок действия подписки истек, поскольку не удалось произвести автоматическую оплату за подписку. Перейдите в настройки подписки Google Play, проверьте метод оплаты и повторите вновь. После оплаты подтвердите статус подписки, нажав на кнопку «Возобновить».
西班牙语 La subscripción del servicio ha expirado porque ha fallado el método de pago automático de la subscripción. Ve a los ajustes de subscripción de tu Google Play, comprueba tu método de pago e inténtalo de nuevo. Asegúrate de pulsar Restaurar después de comprar para comprobar el estado de tu subscripción.
葡萄牙语 O serviço de assinatura expirou porque houve uma falha no pagamento automático da assinatura. Acesse as suas configurações de assinatura da Google Play, verifique o seu método de pagamento e tente novamente. Certifique-se de clicar em Recuperar após a compra, para conferir o status da sua assinatura.
印尼语 Layanan berlangganan dihentikan karena pembayaran otomatis telah gagal. Silakan buka pengaturan langganan Google Play, periksa metode pembayaranmu dan coba lagi. Pastikan kamu klik Pulihkan setelah membeli untuk melihat status berlangganan.
越南语 Dịch vụ đăng ký đã hết hạn do thanh toán đăng ký tự động không thành công. Vui lòng vào thiết lập đăng ký của Google Play để kiểm tra phương thức thanh toán của bạn và thanh toán lại. Đừng quên nhấn vào nút Khôi Phục (Restore) sau khi thanh toán để kiểm tra tình trạng đăng ký của bạn.
泰语 บริการจากการสมัครบริการหมดอายุแล้ว เนื่องจากชำระเงินอัตโนมัติไม่สำเร็จ กรุณาไปที่หน้าตั้งค่า Subscription ใน Google Play แล้วตรวจสอบวิธีการชำระเงินอีกครั้ง อย่าลืมกด Restore หลังซื้อ เพื่อตรวจสอบสถานะการสมัครของคุณ
意大利语 Il servizio di abbonamento è scaduto perché il pagamento dell'abbonamento automatico è fallito. Vai alle impostazioni degli abbonamenti di Google Play, controlla il metodo di pagamento e riprova. Assicurati di fare clic su Ripristina dopo l'acquisto per controllare lo stato dell'abbonamento.
土耳其语 Abone otomatik ödeme düzgün gerçekleşmediği için abonelik hizmeti sona erdi. Google Play Abonelik ayarına gidip ödeme yöntemini kontrol edip tekrar ödeme yapınız. Ödemeyi yaptıktan sonra geri yükle (restore) butonuna tıklayıp abonelik durumunuzu kontrol ediniz.
阿拉伯语 انتهت صلاحية خدمة الاشتراك بسبب فشل دفع الاشتراك الآلي. انتقل إلى إعداداتك في غوغل بلاي وتحقق من طريقة الدفع و حاول مرة أخرى. تأكد من النقر فوق زر استعادة الأشتراك بعد الشراء للتحقق من حالة اشتراكك.
Note

支持的功能可能因操作系统/市场而异。有关更多详细信息,请参见支持功能的状态

订阅购买流程

图表

流程图

Google 订阅 V2 支持

Google 订阅 API V2 允许您使用新的订阅方法创建和管理多个福利。这些福利的示例包括您第一次订阅时的福利,以及在您已经有订阅时通过订阅额外产品获得的折扣。有关 Google 订阅的更多信息,请参见 这里

如果您使用 Google 订阅 V2,您可以根据订阅状态(例如订阅期限和过去的订阅数量)为支付价格提供差异化的优惠。要使用 Google 订阅 V2,请按照以下步骤操作。

Note

有关 Google 计费库更改的更多信息,请参见 这里

在 Google Play 控制台中注册产品

在 Google Play 控制台上注册您的产品以使用 Google 订阅 V2 进行销售。有关更多详细信息,请参阅 Play Console Guide

使用 getSubscriptionProductInfo 检查注册的产品信息

您可以在IAPV4.getSubscriptionProductInfo方法的响应值中检查注册在Google Play控制台中的产品信息,即IAPV4Product对象的originalMarketJson。 * productId: 产品 * basePlanId: 订阅计划 * offerIdToken: 福利

下面展示了一个名为“sub003”的示例产品,其信息可以在originalMarketJson中找到,在注册每周和每月各一次付款并为每月付款定义两个福利之后。

{
    "productId": "sub003",
    "type": "subs",
    "title": "sub003-name (HIVE SDK)",
    "name": "sub003-name",
    "localizedIn": [
        "ko-KR"
    ],
    "skuDetailsToken": "AEuhp4KfxD0MTrwzJV_jl0exSz9NuCZzipMe8mo45lR7pi3y_bWsvXdeKNM04CMxxNY=",
    "subscriptionOfferDetails": [
        {
            "offerIdToken": "AUj\/Yhj7Zx5lt7B0G4qWDtmPFDioPkobZB7zw0xi1A8+B4iD0AbZbwQJKitQLCjR9CMLssbH+g43p4wf3tLREE8H41NgdDpOaCsla0xoTQKPkCsH6+U4XszzPUtOGNwuskbzNjEDfTJoF50j1fSd+IXCkQ==",
            "basePlanId": "baseprice-p1m",
            "offerId": "offer-freetrial",
            "pricingPhases": [
                {
                    "priceAmountMicros": 0,
                    "priceCurrencyCode": "KRW",
                    "formattedPrice": "free",
                    "billingPeriod": "P1M",
                    "recurrenceMode": 2,
                    "billingCycleCount": 1
                },
                {
                    "priceAmountMicros": 1650000000,
                    "priceCurrencyCode": "KRW",
                    "formattedPrice": "₩1,650",
                    "billingPeriod": "P1M",
                    "recurrenceMode": 2,
                    "billingCycleCount": 2
                },
                {
                    "priceAmountMicros": 3300000000,
                    "priceCurrencyCode": "KRW",
                    "formattedPrice": "₩3,300",
                    "billingPeriod": "P1M",
                    "recurrenceMode": 1
                }
            ],
            "offerTags": [
                "offer-free",
                "offer-freetrial"
            ]
        },
        {
            "offerIdToken": "AUj\/YhjUXnT6K8XbdZd5lUtCSef0HA+qikjGfNPEAXvLeLKWTZ0RqwcFIvR5GhECXTRD1SdUrn0LcaB6oquBo5QeUTEZJGTstWGzfmrwL3oSsvBs1EERERSdJ6NDq54=",
            "basePlanId": "baseprice-p1m",
            "pricingPhases": [
                {
                    "priceAmountMicros": 3300000000,
                    "priceCurrencyCode": "KRW",
                    "formattedPrice": "₩3,300",
                    "billingPeriod": "P1M",
                    "recurrenceMode": 1
                }
            ],
            "offerTags": []
        },
        {
            "offerIdToken": "AUj\/YhhlJDIsjfnvcc5TfxlBjSA+o3QcNsCAjU+DfXBJn2JF\/zLgew468AvchceNBynmB3CvnPLhqlr8be8dJlIvAEkKgdas1DGoiu3p52jSvwsxh8jQLN7QReXUdrY=",
            "basePlanId": "baseprice-p1w",
            "pricingPhases": [
                {
                    "priceAmountMicros": 500000000,
                    "priceCurrencyCode": "KRW",
                    "formattedPrice": "₩500",
                    "billingPeriod": "P1W",
                    "recurrenceMode": 1
                }
            ],
            "offerTags": []
        }
    ]
}

在上面的 offerIdToken 示例中,总共有 3 个福利关键值,月付款有 2 种福利类型,周付款有 1 种基础福利。在进行月付款时,实际上将应用第一个或第二个福利给用户。

请求订阅

如下面所示,使用上面获得的 IAPV4Product 对象 originalMarketJson 请求订阅。您可以请求订阅,并将相应的福利应用于用户。

字段名称 描述 必需
YOUR_PRODUCT_MARKET_PID 这是originalMarketJson中的productId Y
YOUR_PRODUCT_OLD_MARKET_PID 用户已经订阅的productId。在将现有订阅升级到用户当前请求的订阅时需要此字段。 N
YOUR_PAYLOAD 这是游戏工作室预定义的购买元数据。 N
YOUR_OFFER_ID_TOKEN 这是originalMarketJson中的offerIdToken。如果您在此字段中未输入值,Hive SDK将使用originalMarketJsonsubscriptionOfferDetails中的第一个offerIdToken N

API 参考: IAPV4 .purchaseSubscription

using hive;    
    IAPV4PurchaseParam.Builder builder = new IAPV4.IAPV4PurchaseParam.Builder();    
    IAPV4PurchaseParam param = builder.setMarketPid("YOUR_PRODUCT_MARKET_PID")    
    .setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")    
    .setIapPayload("YOUR_PAYLOAD")    
    .setOfferToken("YOUR_OFFER_ID_TOKEN")    
    .build();    

    IAPV4.purchaseSubscription (param, (ResultAPI result, IAPV4Receipt receipt) => {    
        if (result.isSuccess()) {    
        // TODO: 使用收到的收据请求验证    
        }    
});
#include "HiveIAPV4.h"

FHiveIAPV4PurchaseParam Param;
Param.MarketPid = TEXT("YOUR_PRODUCT_MARKET_PID");
Param.OldMarketPid = TEXT("YOUR_PRODUCT_OLD_MARKET_PID");
Param.IapPayload = TEXT("YOUR_PAYLOAD");
Param.OfferToken = TEXT("YOUR_OFFER_ID_TOKEN");

FHiveIAPV4::PurchaseSubscription(Param, FHiveIAPV4OnPurchaseDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveIAPV4Receipt& Receipt) {
        if (Result.IsSuccess()) {
                // TODO: Request verification of receipt with received receipt
        }
}));

API 参考: IAPV4 ::purchaseSubscription

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    
    auto* param = new IAPV4PurchaseParam();    
    param->marketPid = "YOUR_PRODUCT_MARKET_PID";    
    param->oldMarketPid = "YOUR_PRODUCT_OLD_MARKET_PID";    
    param->iapPayload = "YOUR_PAYLOAD";    
    param->offerToken = "YOUT_OFFER_ID_TOKEN";    

    IAPV4::purchaseSubscription(*param, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {    
         if (result.isSuccess()) {    
             // TODO: Request verification of receipt with received receipt    
         }    
});

API 参考: IAPV4.purchaseSubscription

import com.hive.IAPV4    
    import com.hive.ResultAPI    
    val param = IAPV4.IAPV4PurchaseParam.Builder()    
    .setMarketPid("YOUR_PRODUCT_MARKET_PID")    
    .setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")    
    .setIapPayload("YOUR_PAYLOAD")    
    .setOfferToken("YOUR_OFFER_ID_TOKEN")    
    .build()    
    IAPV4.purchaseSubscription(param, object : IAPV4.IAPV4PurchaseListener {    
         override fun onIAPV4Purchase(result: ResultAPI, receipt: IAPV4.IAPV4Receipt?) {    
             if (result.isSuccess) {    
                 // TODO: Request verification of receipt with received receipt    
             }    
         }    
})

API 参考: IAPV4.INSTANCE .purchaseSubscription

import com.hive.IAPV4;    
    import com.hive.ResultAPI;    
    IAPV4.IAPV4PurchaseParam param = new IAPV4.IAPV4PurchaseParam.Builder()    
             .setMarketPid("YOUR_PRODUCT_MARKET_PID")    
             .setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")    
             .setIapPayload("YOUR_PAYLOAD")    
             .setOfferToken("YOUR_OFFER_ID_TOKEN")    
             .build();    
    IAPV4.INSTANCE.purchaseSubscription(param, (result, iapV4Receipt) -> {    
         if (result.isSuccess()) {    
             // TODO: Request verification of receipt with received receipt    
         }    
});

API 参考: IAPV4Interface.purchaseSubscription

import HIVEService    
    let param = IAPV4PurchaseParam.Builder()    
    .setMarketPid("YOUR_PRODUCT_MARKET_PID")    
    .setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")    
    .setIapPayload("YOUR_PAYLOAD")    
    .setOfferToken("YOUR_OFFER_ID_TOKEN")    
    .build()    

    IAPV4Interface.purchaseSubscription(param) { result, receipt in    
        if result.isSuccess() {    
        // TODO: Request verification of receipt with received receipt    
        }    
}

API 参考: HIVEIAPV4 购买订阅

#import <HIVEService/HIVEService-Swift.h>    
    HIVEIAPV4PurchaseParamBuilder *builder = [[HIVEIAPV4PurchaseParamBuilder alloc] init];    
    HIVEIAPV4PurchaseParam *param = [[[[[builder setMarketPid: @"YOUR_PRODUCT_MARKET_PID"]    
    setIapPayload: @"YOUR_PRODUCT_OLD_MARKET_PID"]    
    setOldMarketPid: @"YOUR_PAYLOAD"]    
    setOfferToken: @"YOUR_OFFER_ID_TOKEN"]    
    build];    

    [HIVEIAPV4 purchaseSubscription: param handler: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {    
        if ([result isSuccess]) {    
        // TODO: 请求验证收到的收据    
        }    
}];
Note

当授予第一个订阅福利时,该福利只能基于 Google Play 商店账户授予第一个订阅。

订阅 API

Warning

请确保联系解决方案架构师团队,Com2US平台以实施自动续订订阅系统。

获取订阅产品列表

当用户在游戏中进入订阅产品商店时,必须调用查询订阅产品列表的 IAPV4.getSubscriptionProductInfo() 方法。当调用此 API 时,将返回包含产品列表和产品信息的 IAPV4Product 对象作为结果。IAPV4Product 对象与在 搜索产品列表 中返回的对象类似。

IAPV4Product 对象

字段名称 描述
marketPid 在应用内商店注册的唯一产品 ID
currency 货币类型(例如 KRW/USD)
price 产品价格
title 产品标题
displayPrice 产品价格的字符串(例如 $100.00) 更多
productDescription 产品详情
originalMarketJson 使用 Google 订阅 V2 时从市场接收到的原始产品信息,可以通过 Google Play 控制台检查定义的产品信息。
displayOriginalPrice 折扣前的价格字符串,仅适用于 Hive SDK v4.12.0 及更高版本,仅限 Google
originalPrice 未折扣的原始价格
iconURL 产品图标 (512*512),仅适用于 Hive SDK v4.12.0 及更高版本,仅限 Google

displayPrice

  • 在订单中发送带有货币符号和价格的displayPrice(例如:$0.99)。由于Android或iOS有其自己的显示类型,货币符号和价格的顺序在不同国家可能会因操作系统而有所不同。
  • 确保输出每个国家的货币符号与其表格一致。请参考Hive标识符政策以确认货币符号的表格。
  • 如果需要添加或更改增值税,服务器会计算所有货币的增值税并将其添加到displayPrice、price、displayOriginalPrice和originalPrice中。因此,您无需再处理与增值税相关的工作。
Note

谷歌支持在价格和原价不同的情况下显示原价。如果两个值相同,则该商品没有打折。 苹果不提供iconURL值。 originalPrice和displayOriginalPrice仅适用于谷歌(v4 12.0.0 +)和苹果(v4 24.0.0 +)。如果价格值和原价值相同,则表示没有折扣状态。相反,如果两个值不同,由于正在打折,可以分别显示折扣价和原价。

以下是实现getSubscriptionProductInfo()方法的示例代码。

API 参考: IAPV4::getSubscriptionProductInfo

```None linenums="1"
// 请求搜索订阅列表
IAPV4::getSubscriptionProductInfo([=](ResultAPI const & result, std::vector const & productInfoList, unsigned int balance) {
        if (result.isSuccess()) {
                for( auto productInfo : productInfoList) {
                        // 游戏工作室实现所需功能,例如商店UI。
                }
        }
        else {
                // 错误处理
        }
});
```
#include "HiveIAPV4.h"

FHiveIAPV4::GetSubscriptionProductInfo(FHiveIAPV4OnProductInfoDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<FHiveIAPV4Product>& ProductInfoList, uint32 Balance) {

        if (Result.IsSuccess()) {
                for (const auto& ProductInfo : ProductInfoList) {
                        // 实现游戏工作室所需的功能,例如商店用户界面。
                }
        } else {
                // 错误处理
        }
}));

API 参考: com.hive.IAPV4.getSubscriptionProductInfo

// 请求搜索订阅列表    
    IAPV4.getSubscriptionProductInfo(new IAPV4.IAPV4ProductInfoListener() {    
        @Override    
        public void onIAPV4ProductInfo(ResultAPI result, final List iapV4ProductList, final int balance) {    
            if (result.isSuccess()) {    
                for (IAPV4Product productInfo : iapV4ProductList) {    
                // 游戏工作室所需功能的实现,例如商店 UI。    
                }    
            } else {    
                // 错误处理    
            }    
        }    
});

API 参考: HIVEIAPV4::getSubscriptionProductInfo:

// 请求搜索订阅列表
    IAPV4.getSubscriptionProductInfo(new IAPV4.IAPV4ProductInfoListener() {
            @Override
            public void onIAPV4ProductInfo(ResultAPI result, final List iapV4ProductList, final int balance) {
                    if (result.isSuccess()) {
                            for (IAPV4Product productInfo : iapV4ProductList) {
                            // 游戏工作室所需功能的实现,例如商店UI。
                            }
                    } else {
                            // 错误处理
                    }
            }
    });

API 参考: HIVEIAPV4::getSubscriptionProductInfo:

    // 请求搜索订阅列表
    [HIVEIAPV4 getSubscriptionProductInfo:^(HIVEResultAPI *result, NSArray *productInfoList, NSUInteger balance) {
            if( [result isSuccess]) {
                    for( HIVEIAPV4Product* productInfo in productInfoList) {
                            // 游戏工作室所需功能的实现,例如商店 UI。
                    }
            } else {
                    // 错误处理
            }

    }];
Warning

未能调用 getSubscriptionProductInfo() 方法将无法在实现产品列表时利用订阅信息。

它要求游戏客户端直接实现返回结果 API 失败的响应,例如 重试直到获得成功回调向用户显示错误弹窗(例如,市场不可用)。有关结果 API 代码的详细信息,请参见 结果 API 代码 - IAP v4

购买订阅产品

调用 IAPV4 类的 purchaseSubscriptionUpdate() 方法,使用在 Apple App Store 和 Google Play Store 注册的 MarketPid 作为参数请求订阅购买。

Note

如果用户需要更改订阅产品,并且已有订阅,请在 oldMarketPid 中输入现有订阅产品的 marketPid。此功能仅适用于 Android。

以下是purchaseSubscriptionUpdate()的示例实现。

API 参考: IAPV4::purchaseSubscriptionUpdate

```unity linenums="1"
std::string marketPid = "{YOUR_PRODUCT_MARKET_PID}";
std::string oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}";
std::string iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}";

// 请求购买订阅产品
IAPV4::purchaseSubscriptionUpdate(marketPid, oldMarketPid, iapPayload, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
        if (result.isSuccess()) {
                                // 请求验证收到的收据
        }
        else {
                // 错误处理
        }
});
```

API 参考: IAPV4::purchaseSubscriptionUpdate

```c++ linenums="1"
std::string marketPid = "{YOUR_PRODUCT_MARKET_PID}";
std::string oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}";
std::string iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}";

// 请求购买订阅产品
IAPV4::purchaseSubscriptionUpdate(marketPid, oldMarketPid, iapPayload, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
        if (result.isSuccess()) {
                                // 请求使用收到的收据验证收据
        }
        else {
                // 错误处理
        }
});
```

API 参考: com.hive.IAPV4.purchaseSubscriptionUpdate

val marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
    val oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}"    
    val iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}"    


    // 请求购买订阅产品    
    IAPV4.purchaseSubscriptionUpdate(pid, oldMarketPid, iapPayload, object : IAPV4.IAPV4PurchaseListener {    
        override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {    
            if (result.isSuccess()) {    
                    // 请求验证收到的收据    
            } else {    
                   // 错误处理    
            }    
        }    
})

API 参考: com.hive.IAPV4.purchaseSubscriptionUpdate

String marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
    String oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}";    
    String iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}";    


    // 请求购买订阅产品    
    IAPV4.purchaseSubscriptionUpdate(pid, oldMarketPid, iapPayload, new IAPV4.IAPV4PurchaseListener() {    
        @Override    
        public void onIAPV4Purchase(ResultAPI result, IAPV4.IAPV4Receipt iapV4Receipt) {    
            if (result.isSuccess()) {    
                    // 请求验证收到的收据    
            } else {    
                   // 错误处理    
            }    
        }    
});

API 参考文献: HIVEIAPV4::purchaseSubscriptionUpdate:oldMarketPid:additionalInfo:handler:

let marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
    let oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}"    
    let iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}"    

    // 请求购买订阅产品    
    HIVEIAPV4.purchaseSubscriptionUpdate(marketPid, oldMarketPid: oldMarketPid, iapPayload: iapPayload) { result, receipt in    
        if result.isSuccess() {    
            // 请求验证收到的收据    
        } else {    
            // 错误处理    
        }    
}

API Reference: HIVEIAPV4::purchaseSubscriptionUpdate:oldMarketPid:additionalInfo:handler:

NSString* marketPid = @"{YOUR_PRODUCT_MARKET_PID}";    
    NSString* oldMarketPid = @"{YOUR_PRODUCT_OLD_MARKET_PID}";    
    NSString* iapPayload = @"{YOUR_PRODUCT_IAP_PAYLOAD}";    

    // 请求购买订阅产品    
    [HIVEIAPV4 purchaseSubscriptionUpdate:marketPid oldMarketPid:oldMarketPid iapPayload:iapPayload handler:^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {    
        if ([result isSuccess]) {    
                    // 请求验证收到的收据    
        } else {    
                   // 错误处理    
        }    
}];

恢复订阅状态

如果当前订阅在订阅者的设备上不可用,请在 IAPV4 类中实现 restoreSubscription() 方法,以恢复订阅并请求已收费订阅的收据。

以下是实现restoreSubscription()方法的示例代码。

API 参考: hive .IAPV4.restoreSubscription

using hive;    
    IAPV4.restoreSubscription((ResultAPI result, List<IAPV4Receipt> receiptList) => {    
    if (result.isSuccess()) {    
    // TODO: Request receipt verification using the received receiptList    
         }    
});

API 参考: IAPV4 ::restoreSubscription

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    
    IAPV4::restoreSubscription([=](ResultAPI const & result, vector<reference_wrapper<IAPV4Receipt>> receiptList) {    
         if (result.isSuccess()) {    
    // TODO: Request receipt verification using the received receiptList    
         }    
});

API 参考: IAPV4.restoreSubscription

import com.hive.IAPV4    
    import com.hive.ResultAPI    
    IAPV4.restoreSubscription(object : IAPV4.IAPV4RestoreListener {    
         override fun onIAPV4Restore(result: ResultAPI, iapv4ReceiptList: ArrayList<IAPV4.IAPV4Receipt>?) {    
             if (result.isSuccess) {    
                 // TODO: Request receipt verification using the received iapv4ReceiptList    
             }    
         }    
})

API 参考: com .hive.IAPV4.restoreSubscription

import com.hive.IAPV4;    
    import com.hive.ResultAPI;    
    IAPV4.INSTANCE.restoreSubscription((result, iapv4ReceiptList) -> {    
         if (result.isSuccess()) {    
             // TODO: Request receipt verification using the received iapv4ReceiptList    
         }    
});

API 参考文献: IAPV4Interface .restoreSubscription

import HIVEService    
    IAPV4Interface.restoreSubscription() { result, receiptList in    
    if result.isSuccess() {    
    // TODO: Request receipt verification using the received receiptList    
    }    
}

API 参考: HIVEIAPV4 ::restoreSubscription:

#import <HIVEService/HIVEService-Swift.h>    
    [HIVEIAPV4 restoreSubscription: ^(HIVEResultAPI *result, NSArray<HIVEIAPV4Receipt *> *receiptList) {    
         if ([result isSuccess]) {    
    // TODO: Request receipt verification using the received receiptList    
         }    
}];