アドオン付きの定期購入

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

考慮事項

アドオンを含む定期購入機能を使用する際は、次の点を考慮してください。

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

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

  • アドオンを含む定期購入で購入できるアイテムは最大 50 個です。

  • この機能は、韓国( KR)ではご利用いただけません。

Play Billing Library と統合する

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

購入フローを起動する

アドオンを含む定期購入の購入フローを起動する手順は次のとおりです。

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

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

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

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

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

アドオンを含む定期購入を変更すると、アップグレードまたはダウングレードが行われます。詳しくは、 定期購入をアップグレードまたはダウングレードするをご覧ください。

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

  • 現在の定期購入の購入トークンを使用して、常に setOldPurchaseToken を呼び出します。
  • アイテムをアップグレード、ダウングレード、クロスグレードするには、SubscriptionProductReplacementParams.setReplacementMode を呼び出して、新旧の購入アイテム間でプランの変更を処理する方法を指定します。 それ以外の場合は、SubscriptionProductReplacementParams を設定する必要はありません。
  • 基本アイテムが変更されていない場合でも、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 に設定します。
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 -> C の置換は setSubscriptionReplacementMode(PBL 8.1 で非推奨)によって異なります。
  • B は、削除が延期されるようにスケジュール設定されています。
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 日に値上げが適用される予定です。
    • 6 月 2 日に、アイテム B の新しい価格移行($5 から $6)が開始されます。オプトインによる値上げは移行から 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 を使用すると、次のことができます。

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

    • 日割り計算された払い戻しを使用してアドオンを含む定期購入を取り消す場合、次回の更新までの残り時間に基づいて日割り計算された金額で、各アイテムの最新の注文に対して払い戻しが行われます。

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

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

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

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

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

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

考慮事項

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

課金を延期する

アドオンを含む定期購入の次回の請求日を延期するには、 Purchases.subscriptionsv2:defer メソッドを使用します。

アドオンを含む定期購入を延期すると、定期購入内のすべてのアイテムが同じ期間だけ延期されます。延期期間中、ユーザーはすべてのアイテムにフルアクセスできますが、課金はされません。すべてのアイテムの更新日は、新しい日付に更新されます。

これは、プロモーションや顧客へのサービスに役立ちます。課金の延期は、API 呼び出し 1 回あたり最短で 1 日、最長で 1 年間です。新しい請求日が到来する前に API を複数回呼び出して、延期期間を延長できます。

この操作を行うと、SUBSCRIPTION_DEFERRED リアルタイム デベロッパー通知がトリガーされます。

支払いの不承認時のアイテムの有効期限

アドオンを含む定期購入の購入では、今後の有効期限が切れるアイテムに影響を与えることなく、一部のアイテムの利用資格のみを延長する必要がある場合があります。

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

リカバリー期間の選択

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

有効なアイテムには、更新を試みる直前にアドオンを含む定期購入の購入で有効だったアイテムが含まれます。新しく追加されたアイテム(復元後まで利用資格が付与されない)は除外され、削除または取り消しによって有効でなくなったアイテムも除外されます。

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

猶予期間

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

アカウントの一時停止

定期購入の購入がアカウントの一時停止になっている間は、支払いが復元されるまで、すべての定期購入アイテムへのアクセスが一時停止されます。

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

例:

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

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

支払いの不承認により定期購入がアカウントの一時停止になると、ユーザーはアドオンを含む定期購入のアイテムにアクセスできなくなります。 更新されていないアイテムの残り時間は、支払いが復元されたか解約されたため、定期購入がアカウントの一時停止を終了したときにユーザーに返されます。

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

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

  • 30 日後にアカウントが復元されない場合、定期購入は 9 月 21 日に解約され、ユーザーは「アドオン プラン」にアクセスできなくなり、9 月 30 日まで「マイ基本プラン」へのアクセスが再開されます。

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

財務レポートと照合

収益レポートを使用して、有効な定期購入と Google Play での取引を照合します。各取引明細行には注文 ID があります。複数のアイテムを表す購入の場合、収益レポートと推定販売 販売レポートには、関連するアイテムごとに、請求、 手数料、税金、払い戻しなどの取引の行が個別に表示されます。

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

  • コンソールの [財務レポート] セクションに表示される収益統計は、アイテムごとに分類されます。

  • 注文管理には、アドオンを含む定期購入の購入が反映され、購入したアイテムの一覧が表示されます。注文管理から、ユーザーの購入を取り消したり、解約したり、全額払い戻しを行ったりできます。