跳轉至

订阅支付系统

自動續訂訂閱

Hive SDK v4.11.6 支援一種稱為自動續訂訂閱的新功能,該功能會定期重複付款。訂閱類型包括每月訂閱、每年訂閱以及一般的免費試用。如果您想了解更多有關 Google 和 Apple 提供的訂閱格式,請參考以下表格。如果用戶根據操作系統類型選擇定期付款的期間,則可使用自動續訂訂閱。

作業系統 Google Apple
續訂條款 每週 每月 每3個月 每6個月 每年 每週 每月 每2個月 每3個月 每6個月 每年

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

價格變更 自動續訂訂閱可以免費升級或降級訂閱級別。訂閱不是一次性使用,並在用戶嘗試恢復時提供收據。

在 Google 上,訂閱可以免費升級或降級訂閱級別,並且可以更改為新的訂閱,而不管之前的訂閱。如果用戶更改價格,之前訂閱的價值將按日計算,並在新訂閱到期後提供。

在 Apple 平台上,訂閱組是在 iTunes 控制台上定義的,因此可以更改為同一組中的其他訂閱類型。如果用戶升級其訂閱,則先前訂閱的價值將按日計算,並在新訂閱到期後提供。在降級的情況下,它會在現有訂閱到期後續訂為新訂閱。

Warning
  • 建議提供與 Google 相同的 Apple 訂閱期,每週、每月、每 3 個月、每 6 個月和每年類型。
  • 訂閱不會自動恢復。
  • 建議每個遊戲使用一種自動續訂訂閱類型。
    • 所有訂閱作為單一訂閱組提供功能。
  • 訂閱期、免費試用期和新訂閱者的折扣等詳細資訊不可用。
  • 銷售數據不會轉移到行銷歸因工具(例如,Singular、Adjust)內,但 IAP 伺服器會根據訂閱期發送數據。
  • Android 訂閱:僅支持 Google Play 商店、Amazon、One Store、Samsung-GalaxyStore 和 Huawei。不支持 Facebook Cloud 和 Lebi。
  • iOS 訂閱:僅支持 Apple iTunes Store。
Note

支援的功能可能因操作系統/市場而異。欲了解更多詳情,請參閱支援功能的狀態

購買、恢復和寬限期

購買

  • 免費試用 如果訂閱有免費試用期,則不計算為銷售。在免費試用期結束後,訂閱將自動收費。
  • 新訂閱者折扣 這是針對新訂閱者的促銷活動。此促銷活動在特定時間內提供折扣價格。

取消

訂閱者可以在續訂期間之前取消訂閱。如何取消的說明在每個市場的管理訂閱菜單中。訂閱取消後,自動續訂將失效。

退款

如果訂閱者在取消後請求退款,退款金額將根據剩餘的時間段和訂閱的價值(Google 控制台)計算。

恢復

訂閱者可以在付款後如果訂閱不可用的情況下恢復訂閱。恢復的價值計算基於擁有權政策,如果訂閱者擁有該訂閱的擁有權。

寬限期

當訂閱續訂未能收費時,請使用寬限期。確保在寬限期內的狀態與訂閱的狀態相同。

帳戶暫停 (Google)

帳戶暫停是一種因支付時出現問題而無法續訂的狀態,並以未解決的問題結束。在這種情況下,請確保處理訂閱不可用的時間不超過30天。

暫停 (Google)

暫停訂閱最多可達三個月。當期間結束時,訂閱將自動恢復。

顯示 Google 通知彈出窗口

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

通知彈出樣本如下。使用這些短語或根據每個遊戲進行自定義。 * 寬限期通知短語

韓文 訂閱自動付款未正常進行,訂閱服務已過期。 請前往Google Play的訂閱設定,檢查付款方式並重新付款。 付款後請務必點擊恢復(restore)按鈕以檢查訂閱狀態。
英文 訂閱服務已過期,因為自動訂閱付款失敗。 前往您的Google Play訂閱設定,檢查您的付款方式並重試。 請在購買後務必點擊恢復以檢查您的訂閱狀態。
日文 購読自動決済が行われなかったため、購読サービスが終了しました。 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.
阿拉伯文 انتهت صلاحية خدمة الاشتراك بسبب فشل دفع الاشتراك الآلي. انتقل إلى إعداداتك في غوغل بلاي وتحقق من طريقة الدفع و حاول مرة أخرى. تأكد من النقر فوق زر استعادة الأشتراك بعد الشراء للتحقق من حالة اشتراكك.
  • 當它處於待處理狀態時的通知短語
韓文 訂閱自動扣款未正常進行,訂閱服務已到期。 請前往Google Play的訂閱設置,檢查您的付款方式並重試。 付款後請務必點擊恢復(restore)按鈕以檢查您的訂閱狀態。
英文 訂閱服務已到期,因為自動訂閱付款失敗。 前往您的Google Play訂閱設置,檢查您的付款方式並重試。 請務必在購買後點擊恢復以檢查您的訂閱狀態。
日文 購讀自動決済が行われなかったため、購読サービスが終了しました。 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 指南

使用 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: Request verification of receipt with received receipt    
        }    
});
#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

  • 在顯示價格時,請將貨幣符號和價格結合在一起(例如:$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) {
                        // 游戏工作室实现所需功能,例如商店用户界面。
                }
        }
        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) {
                        // 實現遊戲工作室所需的功能,例如商店 UI。
                }
        } 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:

    // Request to search subscription lists
    [HIVEIAPV4 getSubscriptionProductInfo:^(HIVEResultAPI *result, NSArray *productInfoList, NSUInteger balance) {
            if( [result isSuccess]) {
                    for( HIVEIAPV4Product* productInfo in productInfoList) {
                            // Implementation of the desired features by the game studio, such as shop UI.
                    }
            } else {
                    // Error Handling
            }

    }];
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 參考: 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: 使用接收到的receiptList请求收据验证    
         }    
}];