Google Play Billing Library リリースノート

このトピックには、Google Play Billing Library のリリースノートが含まれています。

Google Play Billing Library 2.0.3 リリース(2019-08-05)

Google Play Billing Library のバージョン 2.0.3 がリリースされました。

バグの修正

  • querySkuDetailsAsync() が正しい結果を返さず、コード DEVELOPER_ERROR で失敗することがあるバグを修正しました。

Google Play Billing Library 2.0.2 リリース(2019-07-08)

Google Play Billing Library のバージョン 2.0.2 がリリースされました。このリリースではリファレンス ドキュメントが更新されていますが、ライブラリの機能に変更はありません。

Google Play Billing Library 2.0.1 リリース(2019-06-06)

Google Play Billing Library のバージョン 2.0.1 がリリースされました。このバージョンには、以下の変更が含まれています。

バグの修正

  • 一部のケースでデバッグ メッセージが null で返されていたバグを修正しました。
  • メモリリークに関する潜在的な問題を修正しました。

Google Play Billing Library 2.0 リリース(2019-05-07)

Google Play Billing Library のバージョン 2.0 がリリースされました。このバージョンには、以下の変更が含まれています。

購入は 3 日以内に承認する必要がある

Google Play では、アプリ内またはアプリ外でのアイテム購入をサポートしています。ユーザーがどちらでアイテムを購入したかにかかわらず、Google Play で一貫した購入エクスペリエンスを確保するには、ユーザーに権利を付与した後できるだけ早く Google Play Billing Library を介して受信したすべての購入を確認する必要があります。3 日以内に購入を承認しない場合、ユーザーは自動的に払い戻しを受け、Google Play は購入を取り消します。保留中の取引(バージョン 2.0 の新機能)では、購入ステータスが SUCCESS に移行したときに 3 日間の期間が開始されますが、購入ステータスが PENDING の間は適用されません。

定期購入の場合、新しい購入トークンのある購入はすべて承認する必要があります。つまり初回購入、プランの変更、再登録はすべて承認する必要がありますが、その後の更新を承認する必要はありません。購入に確認が必要かどうかを判断するには、購入の確認フィールドを確認します。

Purchase オブジェクトには、購入が承認されたかどうかを示す isAcknowledged() メソッドが含まれるようになりました。さらに、Google Play Developer API には、Purchases.productsPurchases.subscriptions の確認ブール値が含まれています。購入を承認する際は、すでに承認されているかどうかを確認するためにこれらの方法を必ず使用してください。

次のいずれかの方法で購入を承認できます。

  • 消費アイテムの場合は、クライアント API にある consumeAsync() を使用します。
  • 非消費アイテムの場合は、クライアント API にある acknowledgePurchase() を使用します。
  • Server API では、新しい acknowledge() メソッドも利用できます。

BillingFlowParams.setSku() の削除

以前にサポート対象外となった BillingFlowParams#setSku() メソッドは、このリリースで削除されました。購入フローでアイテムをレンダリングするには、BillingClient.querySkuDetailsAsync() を呼び出して、結果として得られる SkuDetails オブジェクトを BillingFlowParams.Builder.setSkuDetails() に渡します。

コード例については、Google Play Billing Library の使用についての説明をご覧ください。

デベロッパー ペイロードのサポート

Google Play Billing Library のバージョン 2.0 では、購入に添付できる任意の文字列であるデベロッパー ペイロードのサポートが追加されました。デベロッパー ペイロード パラメータを購入に添付することができますが、購入が承認または消費された場合に限られます。これは、購入フローを起動するときにペイロードを指定できる AIDL のデベロッパー ペイロードとは異なります。購入はアプリ外部で開始できるようになったため、この変更により、常にペイロードを購入に追加できるようになりました。

新しいライブラリでペイロードにアクセスするために、Purchase オブジェクトに getDeveloperPayload() メソッドが追加されました。

一貫したオファー

割引 SKU を提供すると Google Play は SKU の元の価格を返すようになり、割引が適用されていることをユーザーに知らせることができます。

SkuDetails には、元の SKU 価格を取得するための 2 つの新しいメソッドがあります。

保留中の取引

Google Play Billing Library のバージョン 2.0 では、取引が有効になる前に追加のアクションが必須の購入をサポートします。たとえば、ユーザーは実店舗でアプリ内アイテムを現金で購入するよう選択したとします。その場合は、トランザクションがアプリの外部で完了することになります。このシナリオでは、ユーザーがトランザクションを完了した後にのみ利用権を付与する必要があります。

保留中の購入を有効にするには、アプリの初期化の一環として enablePendingPurchases() を呼び出します。

Purchase.getPurchaseState() を使用して、購入ステータスが PURCHASEDPENDING かを確認します。ステータスが PURCHASED の場合にのみ利用権を付与するようにしてください。Purchase ステータスが更新されているかどうかを確認する手順は次のとおりです。

  1. アプリの開始時に BillingClient.queryPurchases() を呼び出して、ユーザーに関連付けられた未消費のアイテムのリストを取得します。
  2. 返された Purchase オブジェクトごとに Purchase.getPurchaseState() を呼び出します。
  3. onPurchasesUpdated() メソッドを実装し、Purchase オブジェクトの変更に対応します。

また、Google Play Developer API には Purchases.productsPENDING ステータスが含まれています。保留中の取引はサブスクリプションではサポートされていません。

このリリースでは、新しいリアルタイムのデベロッパー通知タイプである OneTimeProductNotification も導入されています。この通知タイプには、値が ONE_TIME_PRODUCT_PURCHASED または ONE_TIME_PRODUCT_CANCELED のいずれかである単一のメッセージが含まれています。この通知タイプは、現金などのお支払い方法で遅延が関係する購入に対してのみ送信されます。

保留中の購入を承認する場合は、購入ステータスが PENDING ではなく SUCCESS の場合にのみ承認するようにしてください。

API の変更

Google Play Billing Library のバージョン 2.0 には、新しい機能をサポートし、既存の機能を明確にするための API の変更がいくつか含まれています。

consumeAsync

consumeAsync()purchaseToken ではなく ConsumeParams オブジェクトを受け取るようになりました。ConsumeParams には purchaseToken と省略可能なデベロッパー ペイロードが含まれます。

このリリースでは、以前のバージョンの consumeAsync() が削除されました。

queryPurchaseHistoryAsync

混乱を最小限に抑えるために、queryPurchaseHistoryAsync()Purchase オブジェクトではなく PurchaseHistoryRecord を返すようになりました。PurchaseHistoryRecord オブジェクトは Purchase オブジェクトと同じですが、queryPurchaseHistoryAsync() によって返された値のみを反映し、autoRenewingorderIdpackageName フィールドを含みません。返されたデータにはなんの変更もないことにご注意ください。queryPurchaseHistoryAsync() は以前と同じデータを返します。

BillingResult の戻り値

以前は BillingResponse 整数値を返していた API が BillingResult オブジェクトを返すようになりました。BillingResult には BillingResponse 整数と、エラー診断に使用できるデバッグ文字列が含まれています。デバッグ文字列は en-US ロケールを使用し、エンドユーザーには表示されません。

バグの修正

Google Play Billing Library 1.2.2 リリース(2019-03-07)

Google Play Billing Library のバージョン 1.2.2 がリリースされました。このバージョンには、以下の変更が含まれています。

バグの修正

  • バージョン 1.2.1 で発生したスレッドの問題を修正しました。バックグラウンド呼び出しでメインスレッドをブロックしなくなりました。

その他の変更点

  • メインスレッドを使用することをおすすめしますが、バックグラウンド スレッドから Google Play Billing Library をインスタンス化することができるようになりました。
  • ANR が発生する可能性を減らすために、インスタンス化はバックグラウンド スレッドに完全に移行されました。

Play Billing Library 1.2.1 リリース(2019-03-04)

Google Play Billing Library のバージョン 1.2.1 がリリースされました。このバージョンには、以下の変更が含まれています。

主な変更

その他の変更点

  • テストを容易にするために PurchasesResultSkuDetailsResult に公開コンストラクタを追加しました。
  • SkuDetails オブジェクトで新しいメソッド getOriginalJson() を使用できるようになりました。
  • すべての AIDL サービス呼び出しはバックグラウンド スレッドによって処理されるようになりました。

バグの修正

  • NULL のコールバック リスナーがパブリック API に渡されなくなりました。

Google Play Billing Library 1.2 リリース(2018-10-18)

Google Play Billing Library のバージョン 1.2 がリリースされました。このバージョンには、以下の変更が含まれています。

変更の概要

  • Google Play Billing Library は、Android ソフトウェア開発キットのライセンス契約のもとに提供されます。
  • launchPriceChangeConfirmationFlow API が追加されました。これにより、定期購入価格に対する保留中の変更を確認するようユーザーに促します。
  • ユーザーの定期購入をアップグレードまたはダウングレードする場合に、新しい比例配分モード DEFERRED のサポートが追加されました。
  • BillingFlowParams クラス内で setSku()setSkuDetails() で置き換えました。
  • 軽微なバグの修正とコードの最適化を行いました。

価格変更の確認

Google Play Console で購読の価格を変更し、ユーザーがアプリを起動した際に新しい価格を確認して承認できるように表示できるようになりました。

この API を使用するには、定期購入商品の skuDetails を使用して PriceChangeFlowParams オブジェクトを作成し、launchPriceChangeConfirmationFlow() を呼び出します。次のコード スニペットに示すように、PriceChangeConfirmationListener を実装して価格変更確認フローが終了したときに結果を処理してください。

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                // Handle the result.
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams =
        PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                // Handle the result.
            }
        });

価格変更確認フローに新しい価格情報を含むダイアログが表示され、ユーザーに新しい価格を受け入れるように求めます。このフローは、BillingClient.BillingResponse 型のレスポンス コードを返します。

新しい比例配分モード

ユーザーの定期購入をアップグレードまたはダウングレードする場合は、新しい比例配分モード DEFERRED を使用できます。このモードでは、次回の更新時にユーザーの定期購入を更新します。比例配分モードの設定方法について詳しくは、比例配分モードの設定をご覧ください。

SKU の詳細を設定する新しい方法

BillingFlowParams クラスでの setSku() メソッドが非推奨になりました。この変更により、Google Play 請求サービスのフローを最適化できます。

アプリ内課金クライアントで BillingFlowParams の新しいインスタンスを作成するときは、setSkuDetails() を使用して JSON オブジェクトを直接操作することをおすすめします。以下に示すコード スニペットをご確認ください。

BillingFlowParams Builder クラスでの setSku() メソッドが非推奨になりました。代わりに、次のコード スニペットに示すように、setSkuDetails() メソッドを呼び出してください。setSkuDetails() オブジェクトに渡されるオブジェクトは querySkuDetailsAsync() メソッドで取得されます。

Kotlin

private lateinit var mBillingClient: BillingClient
private val mSkuDetailsMap = HashMap<String, SkuDetails>()

private fun querySkuDetails() {
    val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
    ) { responseCode, skuDetailsList ->
        if (responseCode == 0) {
            for (skuDetails in skuDetailsList) {
                mSkuDetailsMap[skuDetails.sku] = skuDetails
            }
        }
    }
}

private fun startPurchase(skuId: String) {
    val billingFlowParams = BillingFlowParams.newBuilder()
    .setSkuDetails(mSkuDetailsMap[skuId])
    .build()
}

Java

private BillingClient mBillingClient;
private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();

private void querySkuDetails() {
    SkuDetailsParams.Builder skuDetailsParamsBuilder
            = SkuDetailsParams.newBuilder();
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode,
                        List<SkuDetails> skuDetailsList) {
                    if (responseCode == 0) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
                        }
                    }
                }
            });
}

private void startPurchase(String skuId) {
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(mSkuDetailsMap.get(skuId))
            .build();
}

Play Billing Library 1.1 リリース(2018-05-07)

Google Play Billing Library のバージョン 1.1 がリリースされました。このバージョンには、以下の変更が含まれています。

変更の概要

  • 既存の定期購入をアップグレードまたはダウングレードする際に BillingFlowParams で配分モードを指定するためのサポートを追加しました。
  • BillingFlowParamsreplaceSkusProration ブール値フラグはサポートされなくなりました。代わりに replaceSkusProrationMode を使用してください
  • launchBillingFlow() はレスポンスの失敗に対してコールバックをトリガーするようになりました。

動作の変更

Google Play Billing Library バージョン 1.1 では、次のように動作が変更されました。

デベロッパーが BillingFlowParams クラスの replaceSkusProrationMode を設定できるようになった

ProrationMode は、ユーザーの定期購入をアップグレードまたはダウングレードする際の比例配分の種類に関する詳細を提供します。

Kotlin

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build()

Java

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build();

現在、Google Play は次の比例配分モードをサポートしています。

IMMEDIATE_WITH_TIME_PRORATION 切り替えは直ちに有効になり、新しい有効期限が比例配分され、ユーザーへの入金または請求が行われます。これが現在のデフォルトの動作です。
IMMEDIATE_AND_CHARGE_PRORATED_PRICE 切り替えは直ちに有効になりますが、請求期間は変わりません。残りの期間の価格に対する請求が行われます。

: このオプションは定期購入のアップグレードでのみ利用可能です。

IMMEDIATE_WITHOUT_PRORATION 切り替えは直ちに有効になり、新しい価格が次回契約期間に請求されます。請求期間は変わりません。

replaceSkusProrationBillingFlowParams クラスでサポートされなくなった

デベロッパーは、定期購入のアップグレード要求に対して比例配分額を請求するためのブール値フラグを設定できましたが、より詳細な比例配分命令を含む ProrationMode がサポートされるようになったため、このブール値フラグはサポートされなくなります。

launchBillingFlow() がレスポンスの失敗に対してコールバックをトリガーするようになった

Billing Library は常に PurhcasesUpdatedListener コールバックをトリガーし、BillingResponse を非同期で返します。BillingResponse の同期戻り値も保持されます。

バグの修正

  • サービスが切断されると、非同期メソッドの早い段階で正しく終了するようになりました。
  • Builder パラメータ オブジェクトはビルド オブジェクトを変換しなくなりました。
  • 不具合 68087141: launchBillingFlow() はレスポンスの失敗に対してコールバックをトリガーするようになりました。

Google Play Billing Library 1.0 リリース(2017-09-19、発表

Google Play Billing Library のバージョン 1.0 がリリースされました。このバージョンには、以下の変更が含まれています。

重要な変更点

  • ライブラリのマニフェスト内に請求許可を埋め込みました。com.android.vending.BILLING 権限を Android マニフェストに追加する必要はありません。
  • 新しいビルダーが BillingClient.Builder クラスに追加されました。
  • SKU を照会するためのメソッドで使用される SkuDetailsParams クラスのビルダー パターンが導入されました。
  • 整合性のためにいくつかの API メソッドが更新されました(戻り引数の名前と順序は同じ)。

動作の変更

Google Play Billing Library バージョン 1.0 では、次のように動作が変更されました。

BillingClient.Builder クラス

BillingClient.Builder が newBuilder パターンで初期化されるようになりました。

Kotlin

billingClient = BillingClient.newBuilder(context).setListener(this).build()

Java

billingClient = BillingClient.newBuilder(context).setListener(this).build();

launchBillingFlow メソッドが BillingFlowParams クラスを使用して呼び出されるようになった

購入または定期購入の請求フローを開始するには、launchBillingFlow() メソッドが、リクエストに固有のパラメータによって初期化された BillingFlowParams インスタンスを受け取ります。

Kotlin

BillingFlowParams.newBuilder().setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .build()

// Then, use the BillingFlowParams to start the purchase flow
val responseCode = billingClient.launchBillingFlow(builder.build())

Java

BillingFlowParams.newBuilder().setSku(skuId)
                              .setType(billingType)
                              .setOldSku(oldSku)
                              .build();

// Then, use the BillingFlowParams to start the purchase flow
int responseCode = billingClient.launchBillingFlow(builder.build());

利用可能なアイテムを照会するための新しい方法

queryPurchaseHistoryAsync() メソッドと querySkuDetailsAsync() メソッドの引数は Builder パターンにラップされました。

Kotlin

val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList)
        .setType(itemType)
billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
    ...
})

Java

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList)
        .setType(itemType);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})

以前は便宜上、また API で整合性をとるためにラッパークラスだった結果が、結果コードと SkuDetails オブジェクトのリストで返されるようになりました。

Kotlin

fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)

Java

public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)

onConsumeResponse() メソッドでパラメータの順序が変更された

ConsumeResponseListener インターフェースから返される onConsumeResponse の引数の順序が、API 全体で整合性がとれるように変更されました。

Kotlin

fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)

Java

public void onConsumeResponse(@BillingResponse int responseCode, String outToken)

PurchaseResult オブジェクトのラップ解除

PurchaseResult が、API 全体で整合性がとれるようラップ解除されました。

Kotlin

fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)

Java

void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)

バグの修正

デベロッパー プレビュー 1 リリース(2017-06-12、発表

デベロッパーによるプレビューが開始されました。請求書作成時の開発プロセスを簡素化することを目的としており、デベロッパーはアプリケーション アーキテクチャやナビゲーション構造といった Android アプリ固有のロジックの実装に専念できます。

このライブラリには、Android アプリを Google Play Billing API と統合する際に使用できる便利なクラスと機能がいくつか含まれています。また、このライブラリは、Android インターフェース定義言語(AIDL)サービス上に抽象化レイヤーも提供するため、デベロッパーはアプリと Google Play Billing API 間のインターフェースを定義しやすくなります。