代替の課金システム専用のアプリ内統合のガイダンス

このガイドでは、対象アプリで「代替の課金システムのみ」(ユーザー選択型ではない)を提供するように API を統合する方法について説明します。資格要件や対象地域など、これらのプログラムの詳細については、代替の課金システムについてをご覧ください。

Play Billing Library のセットアップ

Android アプリに Play Billing Library の依存関係を追加します。代替の課金システムの API を使用するには、バージョン 6.1 以降を使用する必要があります。

Google Play に接続する

統合プロセスの最初のステップは、Google Play 請求サービスの統合ガイドに記載のステップと同じですが、BillingClient の初期化の際にいくつかの違いがあります。

  • enableAlternativeBillingOnly という新しいメソッドを呼び出して、アプリが「代替の課金システムのみ」を使用していることを示す必要があります。

次の例は、これらの変更を行った BillingClient の初期化方法を示しています。

Kotlin


var billingClient = BillingClient.newBuilder(context)
    .enableAlternativeBillingOnly()
    .build()

Java

private BillingClient billingClient = BillingClient.newBuilder(context)
    .enableAlternativeBillingOnly()
    .build();

BillingClient を初期化したら、統合ガイドの説明のとおりに Google Play への接続を確立する必要があります。

利用可否の確認

アプリは isAlternativeBillingOnlyAvailableAsync を呼び出して、「代替の課金システムのみ」が利用可能であることを確認する必要があります。

「代替の課金システムのみ」が利用可能な場合、この API は BillingResponseCode.OK を返します。他のレスポンス コードに対応する方法については、レスポンス処理をご覧ください。

Kotlin


billingClient.isAlternativeBillingOnlyAvailableAsync(object:
    AlternativeBillingOnlyAvailabilityListener {
        override fun onAlternativeBillingOnlyAvailabilityResponse(
            billingResult: BillingResult) {
            if (billingResult.responseCode !=  BillingResponseCode.OK) {
                // Handle failures such as retrying due to network errors,
                // handling alternative billing only being unavailable, etc.
                return
            }

            // Alternative billing only is available. Continue with steps in
            // the guide.
        }
    });

Java


billingClient.isAlternativeBillingOnlyAvailable(
    new AlternativeBillingOnlyAvailabilityListener() {
        @Override
        public void onAlternativeBillingOnlyAvailabilityResponse(
            BillingResult billingResult) {
            if (billingResult.getResponseCode() != BillingResponseCode.OK) {
                 // Handle failures such as retrying due to network errors,
                 // handling alternative billing only being unavailable,
                 // etc.
                return;
            }

            // Alternative billing only is available. Continue with steps in
            // the guide.
        }
    });

ユーザー向け情報ダイアログ

「代替の課金システムのみ」を統合するには、対象アプリで情報画面を表示して、Google Play では課金が管理されないことをユーザーが把握できるようにする必要があります。情報画面は、代替の課金システムのフローを開始する前に、毎回 showAlternativeBillingOnlyInformationDialog API を呼び出してユーザーに表示しなければなりません。ユーザーがすでにダイアログを確認している場合、通常はこの API を使用してもダイアログが再度表示されることはありません。ユーザーがデバイスのキャッシュを削除した場合などに、ダイアログが再度表示されることがあります。

Kotlin


// An activity reference from which the alternative billing only information
// dialog will be launched.
val activity : Activity = ...;

val listener : AlternativeBillingOnlyInformationDialogListener =
    AlternativeBillingOnlyInformationDialogListener { 
        override fun onAlternativeBillingOnlyInformationDialogResponse(
            billingResult: BillingResult) {
            // check billingResult
        }
}

val billingResult =
    billingClient.showAlternativeBillingOnlyInformationDialog(activity,
        listener)

Java


// An activity reference from which the alternative billing only information
// dialog will be launched.
Activity activity = ...;

AlternativeBillingOnlyInformationDialogListener listener =
    new AlternativeBillingOnlyInformationDialogListener() {
        @Override
        public void onAlternativeBillingOnlyInformationDialogResponse(
            BillingResult billingResult) {
                // check billingResult
            }
    };

BillingResult billingResult =
    billingClient.showAlternativeBillingOnlyInformationDialog(activity,
        listener);

このメソッドが BillingResponseCode.OK を返した場合、アプリは取引を続行できます。BillingResponseCode.USER_CANCELED の場合は、アプリは showAlternativeBillingOnlyInformationDialog を呼び出して、再度ユーザーにダイアログを表示する必要があります。他のレスポンス コードについては、レスポンス処理のセクションをご覧ください。

Google Play に取引を報告する

代替の課金システムを通じて行われた取引はすべて、24 時間以内にバックエンドから Google Play Developer API を呼び出して Google Play に報告する必要があります。その際、以下の API を使用して取得した externalTransactionToken を提供します。1 回だけの購入、新しい定期購入、既存の定期購入のアップグレードまたはダウングレードごとに、新しい externalTransactionToken を生成する必要があります。externalTransactionToken の取得後に取引を報告する方法については、バックエンド統合ガイドをご覧ください。

Kotlin

billingClient.createAlternativeBillingOnlyReportingDetailsAsync(object:
    AlternativeBillingOnlyReportingDetailsListener {
        override fun onAlternativeBillingOnlyTokenResponse(
            billingResult: BillingResult,
            alternativeBillingOnlyReportingDetails:
                AlternativeBillingOnlyReportingDetails?) {
            if (billingResult.responseCode !=  BillingResponseCode.OK) {
                // Handle failures such as retrying due to network errors.
                return
            }

            val externalTransactionToken =
                alternativeBillingOnlyReportingDetails?
                    .externalTransactionToken

            // Send transaction token to backend and report to Google Play.
        }
    });

Java


billingClient.createAlternativeBillingOnlyReportingDetailsAsync(
    new AlternativeBillingOnlyReportingDetailsListener() {
        @Override
        public void onAlternativeBillingOnlyTokenResponse(
            BillingResult billingResult,
            @Nullable AlternativeBillingOnlyReportingDetails
                alternativeBillingOnlyReportingDetails) {
            if (billingResult.getResponseCode() != BillingResponseCode.OK) {
                // Handle failures such as retrying due to network errors.
                return;
            }

            String transactionToken =
                alternativeBillingOnlyReportingDetails
                .getExternalTransactionToken();

            // Send transaction token to backend and report to Google Play.
        }
    });

レスポンス処理

上記のメソッド isAlternativeBillingOnlyAvailableAsync(), showAlternativeBillingOnlyInformationDialog() および createAlternativeBillingOnlyReportingDetailsAsync() は、エラーの場合、BillingResponseCode.OK 以外のレスポンスを返すことがあります。推奨されるエラー処理は次のとおりです。

  • ERROR: これは内部エラーです。代替の課金システムで取引の処理を進めてください。影響を受ける定期購入の更新を含め、取引を Google に報告する必要はありません。
  • FEATURE_NOT_SUPPORTED: 代替の課金システムの API が、現在のデバイスの Play ストアでサポートされていません。代替の課金システムで取引の処理を進めてください。取引、および影響を受ける定期購入の更新を Google に報告する必要はありません。
  • USER_CANCELED: ユーザーが次回購入しようとしたときに情報ダイアログを表示するため、再度 showAlternativeBillingOnlyInformationDialog() を呼び出してください。
  • BILLING_UNAVAILABLE: 取引が「代替の課金システムのみ」の対象ではないため、このプログラムでは進めることができません。このエラーは、ユーザーがこのプログラムの対象国に居住していないか、アカウントがプログラムに正常に登録されていない場合に発生します。後者の場合は、Google Play Console で登録ステータスを確認してください。
  • DEVELOPER_ERROR: リクエストでエラーが発生しています。先に進む前に、デバッグ メッセージを使用してエラーを特定および修正してください。
  • NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE: 再試行が必要な一時的なエラーです。SERVICE_DISCONNECTED の場合は、Google Play との接続を再確立してから再試行してください。

代替の課金システムをテストする

代替の課金システムの統合をテストするには、ライセンス テスターを使用する必要があります。ライセンス テスター アカウントによって開始された取引については、請求は発生しません。ライセンス テスターの設定について詳しくは、アプリ ライセンスを使用してアプリ内課金をテストするをご覧ください。

次のステップ

アプリ内統合が完了すると、バックエンドを統合する準備が整います。