コンテンツにスキップ

サブスクリプション支払いシステム

自動更新型サブスクリプション

Hive SDK v4.11.6は、自動更新サブスクリプションと呼ばれる新機能をサポートしており、定期的に支払いが繰り返されます。サブスクリプションの種類には、月額サブスクリプション、年額サブスクリプション、および一般的な無料トライアルがあります。GoogleとAppleが提供するサブスクリプション形式について詳しく知りたい場合は、以下の表を参照してください。自動更新サブスクリプションは、ユーザーがOSタイプによって定期的な支払いの期間を選択した場合に利用可能です。

OS Google Apple
更新条件 毎週 毎月 3ヶ月ごと 6ヶ月ごと 毎年 毎週 毎月 2ヶ月ごと 3ヶ月ごと 6ヶ月ごと 毎年

ユーザーが特定のサブスクリプションに定期的に課金される場合、デバイスタイプに関係なく、ゲームユーザーが自動更新サブスクリプションにいつでもアクセスできるようにしてください。サブスクリプションの復元は、ユーザーのニーズに応じた重要な機能です。

価格変更 自動更新のサブスクリプションは、サブスクリプションレベルをアップグレードまたはダウングレードするのが無料です。サブスクリプションは単一使用ではなく、ユーザーが再開しようとするときに領収書を提供します。

Googleでは、サブスクリプションのレベルをアップグレードまたはダウングレードし、新しいものに変更するのは無料です。ユーザーが価格を変更した場合、以前のサブスクリプションの価値は日単位で計算され、新しいサブスクリプションの期限が切れた後に提供されます。

Appleプラットフォームでは、サブスクリプショングループはiTunesコンソールで定義されているため、同じグループ内の他のサブスクリプションタイプに変更することが可能です。ユーザーがサブスクリプションをアップグレードすると、以前のサブスクリプションの価値は日割りで計算され、新しいサブスクリプションの期限切れ後に提供されます。ダウングレードの場合、既存のサブスクリプションが期限切れた後に新しいサブスクリプションに更新されます。

Warning
  • Appleからのサブスクリプション期間をGoogleと同じにすることを推奨します。週ごと、月ごと、3ヶ月ごと、6ヶ月ごと、年ごとのタイプです。
  • サブスクリプションは自動的に復元されません。
  • ゲームごとに1種類の自動更新サブスクリプションを使用することを推奨します。
    • すべてのサブスクリプションは、単一のサブスクリプショングループとして機能を提供します。
  • サブスクリプション期間、無料トライアル期間、新規加入者向けの割引などの詳細は利用できません。
  • 売上データはクライアント内のマーケティング帰属ツール(例: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)버튼을 클릭하여 구독 상태를 확인해주세요。
英語 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.
アラビア語 انتهت صلاحية خدمة الاشتراك بسبب فشل دفع الاشتراك الآلي. انتقل إلى إعداداتك في غوغل بلاي وتحقق من طريقة الدفع و حاول مرة أخرى. تأكد من النقر فوق زر استعادة الأشتراك بعد الشراء للتحقق من حالة اشتراكك.
  • 保留中の状態の通知フレーズ
韓国語 구독 자동 결제가 정상적으로 이뤄지지 않아 구독 서비스가 만료되었습니다. 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 Billing Libraryの変更に関する詳細は、こちらをご覧ください。

Google Play Consoleに商品を登録する

Google Play ConsoleでGoogleサブスクリプションV2を使用して販売される製品を登録してください。詳細については、Play Consoleガイドを参照してください。

getSubscriptionProductInfoで登録された製品情報を確認する

Google Play Consoleに登録された製品情報は、IAPV4.getSubscriptionProductInfoメソッドのレスポンス値、IAPV4ProductオブジェクトのoriginalMarketJsonで確認できます。 * productId: 製品 * basePlanId: サブスクリプションプラン * offerIdToken: 特典

以下は、「sub003」と呼ばれる例の製品を示しており、その情報はoriginalMarketJsonにあります。週払いと月払いをそれぞれ登録し、月払いのために2つの特典を定義した後のものです。

{
    "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つの基本ベネフィットがあります。実際には、月額支払いを行う際に最初または2番目のベネフィットがユーザーに適用されます。

サブスクリプションをリクエスト

上記で取得したIAPV4ProductオブジェクトoriginalMarketJsonを使用して、以下のようにサブスクリプションをリクエストします。ユーザーに対応する特典を適用してサブスクリプションをリクエストできます。

フィールド名 説明 必須
YOUR_PRODUCT_MARKET_PID これはoriginalMarketJsonproductIdです。 Y
YOUR_PRODUCT_OLD_MARKET_PID ユーザーがすでに購読しているproductIdです。これは、既存のサブスクリプションをユーザーが現在リクエストしているものにアップグレードする際に必要です。 N
YOUR_PAYLOAD これはゲームスタジオによって事前定義された購入メタデータです。 N
YOUR_OFFER_ID_TOKEN これはoriginalMarketJsonofferIdTokenです。このフィールドに値を入力しない場合、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: 受け取ったレシートでレシートの検証をリクエストする    
         }    
});

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: 受け取ったレシートでレシートの検証をリクエストする    
             }    
         }    
})

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: 受け取ったレシートでの検証をリクエスト    
         }    
});

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 purchaseSubscription

#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) More
productDescription 製品の詳細
originalMarketJson GoogleサブスクリプションV2を使用する際に市場から受け取った元の製品情報、Google Play Consoleで定義された製品情報はこれで確認できます。
displayOriginalPrice 割引前の価格文字列 Hive SDK v4.12.0以降で利用可能、Google専用
originalPrice 割引なしの元の価格
iconURL 製品アイコン(512*512) Hive SDK v4.12.0以降で利用可能、Google専用

displayPrice

  • 通貨記号と価格の組み合わせでdisplayPriceを送信してください(例:$0.99)。AndroidやiOSにはそれぞれ独自の表示形式があるため、通貨記号と価格の順序は、OSによって異なる国で異なって表示される場合があります。
  • 各国の通貨記号をその表と同じように出力してください。通貨記号の表を確認するには、Hive識別子ポリシーを参照してください。
  • 追加の国を追加またはVATを変更する場合、サーバーはすべての通貨のVATを計算し、displayPrice、price、displayOriginalPrice、originalPriceに追加します。したがって、VATに関連する作業はもうありません。
Note

Googleは、priceの値とoriginalPriceの値が異なる場合に元の価格を表示することをサポートしています。2つの値が同じ場合、そのアイテムはセール中ではありません。 AppleはiconURLの値を提供していません。 originalPriceとdisplayOriginalPriceは、Google(v4 12.0.0 +)およびApple(v4 24.0.0 +)専用です。priceの値とoriginalPriceの値が同じ場合、それは割引状態ではないことを意味します。逆に、2つの値が異なる場合、割引中であるため、割引価格と元の価格を別々に表示するために使用できます。

以下は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) {
                        // ゲームスタジオによるショップ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:

    // サブスクリプションリストを検索するリクエスト
    [HIVEIAPV4 getSubscriptionProductInfo:^(HIVEResultAPI *result, NSArray *productInfoList, NSUInteger balance) {
            if( [result isSuccess]) {
                    for( HIVEIAPV4Product* productInfo in productInfoList) {
                            // ゲームスタジオによる希望する機能の実装、例えばショップUI。
                    }
            } else {
                    // エラーハンドリング
            }

    }];
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() メソッドを呼び出さないと、製品リストを実装する際にサブスクリプション情報を活用できなくなります。

ゲームクライアントが、**成功のコールバックを得るまで再試行する**や、**ユーザーにエラーポップアップを表示する(例:市場が利用できない)**など、Result APIの失敗を返すための応答を直接実装する必要があります。Result APIコードの詳細については、Result API Code - IAP v4を参照してください。

購入サブスクリプション商品

**IAPV4**クラスのpurchaseSubscriptionUpdate()メソッドを呼び出して、Apple App StoreおよびGoogle Play Storeに登録されたMarketPidをパラメータとして使用して、サブスクリプション購入をリクエストします。

Note

既存のサブスクリプションがあり、ユーザーがサブスクリプション製品を変更する必要がある場合は、既存のサブスクリプション製品の marketPid を oldMarketPid に入力します。この機能は 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: 受け取った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: 受け取った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    
         }    
}];