コンテンツにスキップ

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

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

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

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ストアアカウントに基づいて最初のサブスクリプションにのみ付与できます。

Subscription 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 {
                    // エラーハンドリング
            }

    }];
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: 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: 受け取った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    
         }    
}];