アドオン付きの定期購入

アドオン付きの定期購入では、複数の定期購入プロダクトをバンドルして、まとめて購入、請求、管理できます。既存の商品カタログ サブスクリプションは、事前の仕様や追加の構成なしで、アドオンとしてシームレスに提供できます。複数の既存の定期購入商品を含む購入フローを開始し、アドオンとして販売できます。

考慮事項

アドオン付きサブスクリプション機能を使用する場合は、次の点を考慮してください。

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

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

  • アドオンの購入を含む定期購入には、最大 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 を呼び出します。
  • 基本アイテムをアップグレード、ダウングレード、またはクロスグレードするには、setSubscriptionReplacementMode を呼び出して、以前の基本アイテムとアドオン付きの定期購入の新しい購入の間でプラン変更を処理する方法を指定します。それ以外の場合は、このパラメータを設定する必要はありません。
  • ベースアイテムが変更されていない場合でも、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);

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

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

既存のアイテム 変更されたアイテム 交換モードを設定する必要がありますか? 動作
A(ベースアイテム)、B A(ベースアイテム) × アイテム B は削除が保留されています。
A A(ベースアイテム)、B × アイテム B はすぐに追加され、按分された料金が請求されます。
A(ベースアイテム)、B A(ベースアイテム)、C ×
  • B は削除が保留されています。
  • C はすぐに追加され、案分された料金が請求されます。
A(ベースアイテム)、B B(ベースアイテム) × A は削除が保留されています。
A(ベースアイテム)、B C(ベースアイテム) はい
A(ベースアイテム)、B C(ベースアイテム)、B はい A -> C の置換は setSubscriptionReplacementMode によって異なります。
A(ベースアイテム)、B C(ベースアイテム)、D あり
  • A -> C の置換は setSubscriptionReplacementMode によって異なります。
  • B は削除が保留されています。
  • D はすぐに追加され、案分された料金が請求されます。

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

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

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

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

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

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

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

    例:

    • アドオン(アイテム 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 からのメールには、同じ日に料金の引き上げまたは引き下げが適用されるすべてのアイテムのリストが記載されています。

アドオン付きの定期購入を解約する

ユーザーは 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 日に更新される定期購入の基本プランを契約しており、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 のダッシュボードの場合:

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

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