アドオン付きの定期購入

アドオン付きの定期購入では、複数の定期購入商品をまとめて購入、請求、管理できます。既存の商品カタログの定期購入は、事前の仕様指定や追加の設定なしで、アドオンとしてシームレスに提供できます。複数の既存の定期購入商品を含む購入フローを起動し、アドオンとして販売できます。

考慮事項

アドオン付きのサブスクリプション機能を使用する際は、次の点にご注意ください。

  • アドオン付きの定期購入は、自動更新の基本プランでのみサポートされています。

  • 購入内のすべてのアイテムの定期購入の請求期間は同じである必要があります。たとえば、年間請求の定期購入に月単位の請求のアドオンを設定することはできません。

  • アドオン購入を含む定期購入には、最大 50 個のアイテムを含めることができます。

  • この機能は、インド(IN)リージョンと韓国(KR)リージョンではご利用いただけません。

Play Billing Library と統合する

このセクションでは、定期購入とアドオンの機能を Play Billing Library(PBL)と統合する方法について説明します。このガイドでは、アプリに PBL 依存関係を追加するBillingClient を初期化する、Google Play に接続するなど、PBL の初期統合手順を理解していることを前提としています。このセクションでは、アドオン付きの定期購入に固有の PBL 統合の側面について説明します。

購入フローを開始する

アドオン付きの定期購入の購入フローを開始する手順は次のとおりです。

  1. BillingClient.queryProductDetailsAsync メソッドを使用して、すべての定期購入アイテムを取得します。

  2. 各アイテムの ProductDetailsParams オブジェクトを設定します。

    ProductDetailsParams オブジェクトで表されるアイテム。定期購入アイテムを示す ProductDetails と、特定の定期購入 base plan または offer を選択する offerToken の両方を指定します。

  3. BillingFlowParams.Builder.setProductDetailsParamsList メソッドでアイテムの詳細を指定します。BillingFlowParams クラスは、購入フローの詳細を指定します。

    次のサンプルは、複数のアイテムを含む定期購入の購入の課金フローを開始する方法を示しています。

    Java

       BillingClient billingClient = ;
    
        // ProductDetails obtained from queryProductDetailsAsync().
        ProductDetailsParams productDetails1 = ...;
        ProductDetailsParams productDetails2 = ...;
        ArrayList productDetailsList = new ArrayList<>();
        productDetailsList.add(productDetails1);
        productDetailsList.add(productDetails2);
    
        BillingFlowParams billingFlowParams =
            BillingFlowParams.newBuilder()
               .setProductDetailsParamsList(productDetailsList)
               .build();
        billingClient.launchBillingFlow(billingFlowParams);

購入内のアイテムに適用されるルール

  • アドオンの更新日を最終的に基本アイテムと一致させるため、Google Play では、トライアルまたは初回限定価格のフェーズの後に日割り計算された料金が挿入されることがあります。
  • 特典の利用資格は、商品ごとに個別に評価されます。

購入を処理する

アドオン付きの定期購入の処理は、Google Play Billing Library をアプリに統合するで説明されている単一アイテムの購入の処理と同じです。唯一の違いは、ユーザーが 1 回の購入で複数の利用資格を取得できることです。アドオン付きの定期購入を購入すると、複数のアイテムが返されます。これらのアイテムは、Google Play Billing Library の Purchase.getProducts() と、Google Play Developer APIpurchases.subscriptionsv2.getlineItems リストを使用して取得できます。

アドオンを含む定期購入を変更する

アドオン付きのサブスクリプションを変更すると、アップグレードまたはダウングレードになります。詳しくは、定期購入をアップグレードまたはダウングレードするをご覧ください。

アプリでアドオン付きの定期購入の既存の購入を変更または復元するには、追加のパラメータを指定して launchBillingFlow API を呼び出し、次のことを確認する必要があります。

  • 現在の定期購入の購入トークンを使用して setOldPurchaseToken を常に呼び出します。
  • アイテムをアップグレード、ダウングレード、クロスグレードするには、SubscriptionProductReplacementParams.setReplacementMode を呼び出して、以前の購入アイテムと新しい購入アイテムの間でプランの変更をどのように処理するかを指定します。それ以外の場合は、このパラメータを設定する必要はありません。
  • ベースアイテムが変更されていない場合でも、SubscriptionProductReplacementParams.setSubscriptionReplacementMode を呼び出して特定の置換動作を適用できます。このケースに適用されるルールについては、再度定期購入、または同じ定期購入内でのプランの切り替えを行うをご覧ください。
  • 新しいアドオンは直ちに適用され、次回の更新日を定期購入の基本アイテムと合わせるため、按分した料金が請求されます。
  • 削除されたアドオンは、現在の請求対象期間の終了時に期限切れになります。
  • 請求フローを開始する際は、削除するアドオンを除く、アドオンを含む定期購入のすべてのアクティブなアイテムと、新しいアドオンを指定する必要があります。

次のサンプルは、アドオン付きの定期購入の既存の購入を変更するときに launchBillingFlow API を呼び出す方法を示しています。

Java

BillingClient billingClient = ;

int replacementMode =;

// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 = ...;
ProductDetailsParams productDetails2 = ...;
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
              // No need to set if change does not affect the base item.
             .setSubscriptionReplacementMode(replacementMode)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

サブスクリプションの変更シナリオ

次の表に、アドオン付きの定期購入のさまざまな変更シナリオと、それに対応する動作を示します。

SubscriptionProductReplacementParams を使用する場合

既存のアイテム 変更されたアイテム SubscriptionProductReplacementParams で置換モードを設定する必要がありますか? 動作
A(ベースアイテム)、B A(基本アイテム) はい(KEEP_EXISTING を使用)
  • アイテム B は削除が保留されています。
  • アイテム A は保持されます。
  • ユーザーは、アイテム A の現在の価格(登録時にお試し価格で支払った残りの期間を含む)を維持します。
A A(ベースアイテム)、B はい(A に KEEP_EXISTING を使用)
  • アイテム B は、日割り計算された料金で直ちに追加されます。
  • アイテム A は保持されます。
  • ユーザーは、アイテム A の現在の価格(登録時にお試し価格で支払った残りの期間を含む)を維持します。
A(ベースアイテム)、B A(ベースアイテム)、C はい(A に KEEP_EXISTING を使用)
  • B は削除が延期される予定です。
  • C は日割り計算された料金で直ちに追加されます。
  • アイテム A は保持されます。
  • ユーザーは、アイテム A の現在の価格(登録時にお試し価格で支払った残りの期間を含む)を維持します。
A(ベースアイテム)、B B(基本アイテム) いいえ A は保留された削除のスケジュールが設定されています。
A(ベースアイテム)、B C(ベースアイテム) はい
  • A -> C の置換は SubscriptionProductReplacementParams replacementMode に依存します
  • B は削除が延期される予定です。
A(ベースアイテム)、B C(ベースアイテム)、B はい
  • A -> C の置換は SubscriptionProductReplacementParams replacementMode に依存します。
  • アイテム B を変更しないままにするには、置換モードを KEEP_EXISTING に設定します。それ以外の場合、デフォルトの置換モードは IMMEDIATE_WITHOUT_PRORATION です。
A(ベースアイテム)、B C(ベースアイテム)、D あり
  • A -> C の置換は SubscriptionProductReplacementParams replacementMode に依存します。
  • B は削除が延期される予定です。
  • D はすぐに適用され、日割り計算された料金が請求されます。
A(ベースアイテム)、B A(ベースアイテム)、C はい
  • A -> A と B -> C の置換は、各 ProductDetailsParamsSubscriptionProductReplacementParams replacementMode で指定された置換モードによって異なります。
  • アイテム A を変更しない場合は、置換モードを KEEP_EXISTING に設定します。
A(ベースアイテム)、B、C D(ベースアイテム)、B、C はい
  • A->D と B->B、C->C の置換は、各 ProductDetailsParamsSubscriptionProductReplacementParams replacementMode で指定された置換モードによって異なります。
  • アイテム B と C を変更しないままにするには、置換モードを KEEP_EXISTING に設定します。

SubscriptionUpdateParams を使用する場合

既存のアイテム 変更されたアイテム 交換情報を設定する必要がありますか? 動作
A(ベースアイテム)、B A(基本アイテム) いいえ
  • アイテム B は削除が保留されています。
  • アイテム A の動作は、基本プランの基本プランと特典の変更の設定によって異なります。
  • アイテム A の価格が最新の価格に更新され、ユーザーは登録時に獲得したお試し価格の支払いを特典の利用資格要件に基づいて失う可能性があります。
A A(ベースアイテム)、B いいえ
  • アイテム B は、日割り計算された料金で直ちに追加されます。
  • アイテム A の動作は、基本プランの基本プランと特典の変更の設定によって異なります。
  • アイテム A の価格が最新の価格に更新され、ユーザーは特典の対象条件に基づいて登録時に受け取ったお試し価格の支払いを失う可能性があります。
A(ベースアイテム)、B A(ベースアイテム)、C いいえ
  • B は削除が延期される予定です。
  • C は日割り計算された料金で直ちに追加されます。
  • アイテム A の動作は、基本プランの基本プランと特典の変更の設定によって異なります。
A(ベースアイテム)、B B(基本アイテム) いいえ A は保留された削除のスケジュールが設定されています。
A(ベースアイテム)、B C(ベースアイテム) はい
A(ベースアイテム)、B C(ベースアイテム)、B はい A -> C の置換は setSubscriptionReplacementMode(PBL 8.1 で非推奨)に依存します。
A(ベースアイテム)、B C(ベースアイテム)、D あり
  • A -> C の置換は setSubscriptionReplacementMode(PBL 8.1 で非推奨)に依存します。
  • B は削除が延期される予定です。
  • D はすぐに適用され、日割り計算された料金が請求されます。

リアルタイム デベロッパー通知

複数のアイテム利用資格を含むアドオン付きサブスクリプションの購入の場合、RTDNsubscriptionId フィールドが提供されません。代わりに、Play Developer API を使用して購入を取得し、関連付けられたアイテムの利用資格を確認できます。

既存の定期購入者に対する価格変更

アドオン購入を含む定期購入の既存の定期購入者の定期購入価格を変更する手順は、定期購入の価格を変更するで説明されている単一アイテムの定期購入の定期購入価格を変更する手順と似ています。ただし、このセクションで説明するように、いくつかの制限事項と機能の違いがあります。

以前の価格コホートを終了する

以前のコホートを終了すると、アドオン購入を含む定期購入にも影響します。次のルールが適用されます。

  • 未適用のオプトインの値上げはすべて、新しい価格と同じ更新時間にする必要があります。アドオン付き定期購入のアイテムに、ユーザーがまだ確認していないオプトインによる値上げがある場合、購入内の他のアイテムに対する新たなオプトインによる値上げは、OUTSTANDING 状態の既存の値上げと同じ更新タイミングで新しい価格が適用される場合を除き、無視されます。ユーザーが値上げに同意すると、新しい価格変更が登録されます。また、ユーザーは未確認のオプトインによる値上げすべてに一度に同意することしかできません。

    例:

    • アドオン(アイテム A と B)を含むサブスクリプションが毎月 7 日に更新されるとします。
    • 商品 A は、7 ドルから 10 ドルへの価格変更が進行中で、7 月 7 日に値上げが適用される予定です。
    • アイテム B の新しい価格移行($5 から $6)が 6 月 2 日に開始されます。オプトインでの値上げは移行から 37 日後に開始されるため、アイテム B の値上げは 8 月 7 日が最短となります。

    このシナリオでは、ユーザーがアイテム A の価格変更に同意するまで(CONFIRMED 状態になるまで)、アイテム B の価格変更はこの定期購入には登録されず、SubscriptionPurchaseV2 はアイテム B の価格変更の詳細を返しません。ユーザーがアイテム A の価格変更を確認すると、アイテム B の価格変更が開始されます。ユーザーは、アイテム A のオプトインによる値上げに同意した後にのみ、アイテム B のオプトインによる値上げを受け取ります。

  • Google Play からのメールには、同じ日に料金の引き上げまたは引き下げが適用されるすべてのアイテムのリストが含まれています。

アドオンを含む定期購入を解約する

ユーザーは、Google Play 定期購入センターでアドオンを含む定期購入の購入全体を解約できます。デベロッパーは、Google Play Developer API を使用してのみ、アドオンを含む定期購入の購入全体を解約できます。

定期購入の購入が取り消されずにキャンセルされた場合、購入内のアイテムは自動更新されませんが、ユーザーは対応する請求期間が終了するまで、利用資格のあるアイテムに引き続きアクセスできます。

アドオンが含まれる定期購入を取り消して払い戻す

定期購入の取り消しと払い戻しに関するガイドラインは次のとおりです。

  • Google Play Console を使用して、定期購入へのアクセスを取り消すことなく、特定の注文に対して金額ベースの払い戻しを行います。

  • orders.refund を呼び出して、定期購入へのアクセス権を取り消すことなく、ユーザーが行った特定の定期購入の支払いを全額払い戻します。

  • purchases.subscriptionsv2.revoke を呼び出して、すべての定期購入アイテムへのアクセス権を直ちに取り消します。この API を使用すると、次のことができます。

    • すべてのアイテムへのアクセスを取り消し、日割り計算で払い戻しを行います。

    • 按分払い戻しを使用してアドオン付きの定期購入を取り消す場合、各アイテムの最新の注文に対して、次の更新までの残り時間に基づいて按分された金額が払い戻されます。

    • すべてのアイテムのアクセス権を取り消し、FullRefund を提供します。

    • 個々のアイテムのアクセス権を取り消し、アイテムの全額払い戻しを行います。

アドオンを含む定期購入の個々のアイテムを取り消す

購入全体を取り消すことなく、アドオン付きの定期購入の個々の定期購入アイテムを取り消すには、RevocationContextItemBasedRefund フィールドを設定して purchases.subscriptionsv2.revoke を呼び出します。取り消して払い戻しを行うアイテムの productId は、ItemBasedRefund フィールドで設定できます。

ItemBasedRefund フィールドは、1 つ以上の自動更新定期購入アイテムを含む購入に対して設定できます。

  • ItemBasedRefund で指定されたアイテムを取り消した後も、定期購入に有効なアイテムが残っている場合は、そのアイテムのみが取り消され、定期購入のステータスを中断することなく全額払い戻しが行われます。
  • ItemBasedRefund で指定されたアイテムを取り消した後、定期購入に有効なアイテムが残っていない場合、アイテムは取り消され、全額払い戻しが行われ、定期購入は解約されます。

考慮事項

  • ItemBasedRefund を使用する場合、一度に取り消すことができるアイテムは 1 つだけです。異なるアイテムを取り消す必要がある場合は、リクエストを複数回呼び出すことができます。
  • 定期購入の購入が支払い拒否状態のいずれかにある場合、または ItemBasedRefund で指定されたアイテムが所有されていないか期限切れの場合、アイテムのターンダウンはブロックされます。
  • プリペイド サブスクリプションでは、アイテムの拒否はサポートされていません。

お支払いが不承認になった場合のアイテムの有効期限

アドオン付きの定期購入の場合、特定の更新では、有効期限が切れていないアイテムに影響を与えることなく、アイテム利用資格のサブセットのみを延長する必要がある場合があります。

更新に関与するアイテムに関係なく、更新のお支払いが不承認となった場合、定期購入全体が猶予期間に入り、アカウントが保留されます。これについては、次のドキュメントで説明しています。

復元期間の選択

猶予期間自体はユーザーに利用資格を付与するため、アドオン付きの定期購入の購入時に更新のお支払いが不承認となった場合、すべての有効なアイテムの中で猶予期間が最も短いアイテムが選択され、その猶予期間とアカウントの一時停止期間がこの更新の復元期間として適用されます。

有効なアイテムには、更新を試みる直前にアドオン付きのサブスクリプションの購入で有効だったアイテムが含まれます。新しく追加されたアイテム(復元されるまで利用資格が付与されない)は除外され、削除または停止により有効でなくなったアイテムも除外されます。

選択された最小猶予期間のアイテムのアカウント一時停止設定が適用されます。最小猶予期間が同じで、アカウントの一時停止期間が異なるアイテムが複数ある場合は、最も長いアカウントの一時停止期間が適用されます。

猶予期間

定期購入の更新のお支払いが不承認になると、定期購入は猶予期間の状態になります。猶予期間中、ユーザーは前回の更新期間のすべてのアクティブなアイテムに引き続きアクセスできます。猶予期間が終了してもお支払い方法が修正されなかった場合、定期購入の購入全体がアカウントの一時停止状態になります。猶予期間中に他のアイテムが更新日を迎えた場合、定期購入が支払いの不承認から復旧すると、それらのアイテムに対して新しい請求が開始されます。

アカウントの一時停止

サブスクリプションの購入がアカウント保留中の場合、お支払いが回復するまで、すべてのサブスクリプション アイテムへのアクセスは一時停止されます。

アカウントの一時停止中の定期購入が再開された場合、定期購入の購入はそのまま継続されます。定期購入が再開されなかった場合、支払い不承認のアイテムは期限切れになり、他のアイテムへのアクセスは請求期間の残りの期間再開されます。

例:

  • ユーザーが毎月 1 日に更新される定期購入 My Base Plan を利用しているとします。8 月 15 日に、7 日間の無料トライアル付きの月額 $10 のアドオン プランを追加しました。どちらのアイテムにも猶予期間は設定されておらず、アカウントの一時停止期間はどちらも 30 日間です。

  • 8 月 22 日に、8 月 31 日までの日割り計算で 2.90 ドル(10*9/31)が請求されますが、それまでにお客様のお支払い方法の有効期限が切れ、定期購入は 8 月 22 日に支払いの不承認となります。

お支払いが拒否されたために定期購入がアカウントの一時停止状態になった場合、ユーザーはアドオン付きの定期購入に含まれるアイテムにアクセスできません。更新されないアイテムの残りの時間は、支払いが回復したか解約されたかのいずれかの理由で定期購入がアカウントの一時停止から解除されたときに、ユーザーに返されます。

前の例では、定期購入は 8 月 22 日にアカウントの一時停止ステータスになります。

  • 9 月 1 日の更新日より前の 8 月 25 日にアカウントが復元された場合、ユーザーは同日にマイ ベースプランアドオン プランの両方にアクセスできるようになります。次回の請求日が 9 月 4 日に変更されます。

  • 30 日後にアカウントが復元されなかった場合、定期購入は 9 月 21 日に解約され、お客様は アドオン プランにアクセスできなくなります。また、9 月 30 日まで 基本プランにアクセスできるようになります。

この例では、アドオン付きサブスクリプションのすべてのアイテムの更新された expiryTime を取得する必要があります。一部のアイテムは、猶予期間とアカウントの一時停止後に利用資格が再開される可能性があるためです。

財務レポートと照合

収益レポートを使用して、有効な定期購入と Google Play での取引を照合します。各トランザクションの明細項目には注文 ID があります。購入が複数のアイテムを表す場合、収益と予想販売レポートには、各アイテムの請求、手数料、税金、払い戻しなどの各取引の行が個別に含まれます。

Google Play Console のダッシュボードの場合:

  • コンソールの [売上レポート] セクションに表示される収益の統計情報は、アイテム別に分類されています。

  • 注文管理に、アドオン付きの定期購入の購入が反映され、購入したアイテムのリストが表示されます。注文管理では、ユーザーの購入を取り消したり、キャンセルしたり、全額払い戻ししたりできます。