跳轉至

订阅支付系统

自動續訂訂閱

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

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

確保讓您的遊戲用戶隨時訪問自動續訂訂閱,無論設備類型如何,如果用戶定期被收取特定訂閱費用。根據用戶需求,訂閱恢復是一項基本功能。

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

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

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

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

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

購買、恢復和寬限期

購買

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

取消

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

退款

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

恢復

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

寬限期

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

帳戶暫停 (Google)

帳戶暫停是由於支付時發生的問題而無法續訂的狀態,並以未解決的問題結束。在這種情況下,請確保將訂閱處理為不可用,最多30天。

暫停 (Google)

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

顯示 Google 通知彈出窗口

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

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

韓文 訂閱自動付款未正常進行,訂閱服務已過期。 請前往Google Play的訂閱設定,檢查您的付款方式並重新進行付款。 付款後請務必點擊【恢復】按鈕以確認您的訂閱狀態。
英文 訂閱服務已過期,因為自動訂閱付款失敗。 請前往您的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)按鈕以檢查您的訂閱狀態。
英文 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 指南

使用 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: 使用收到的收据请求验证    
        }    
}

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: Request verification of receipt with received receipt    
        }    
}];
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 標識政策以確認貨幣符號的表格。
  • 如果需要添加或更改增值稅,服務器會計算所有貨幣的增值稅並將其添加到顯示價格、價格、顯示原始價格和原始價格中。因此,您不再需要與增值稅相關的工作。
Note

Google 支持在价格和原价不同的情况下显示原价。如果两个值相同,则该商品没有折扣。 Apple 不提供 iconURL 值。 originalPrice 和 displayOriginalPrice 仅适用于 Google (v4 12.0.0 +) 和 Apple (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
            }

    }];
import HIVEService
IAPV4Interface.getSubscriptionProductInfo { result, productInfoList, balance in
    if result.isSuccess() {
        // Implementation of the desired features by the game studio, such as shop UI.   
        productInfoList?.forEach { .. }
    } 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: Request receipt verification using the received receiptList    
         }    
}];