この記事は デベロッパー アドボケート、Oscar Rodriguez による Android Developers Blog の記事 "Advanced in-app billing: handling alternative purchase flows" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
![]()
アプリやゲームを設計して開発するにつれ、収益化をどうするかが考え始めるときがあるでしょう。
Google Play でプロダクトを販売して収益化すると決めたら、販売するアイテムを表示するストア画面を作り、Google Play Billing Libraryを使ってユーザーが購入するダイアログを表示することになるでしょう。
ドキュメントや Billing Library TrivialDrive サンプルには詳しい説明が掲載されていますが、一般的なフローは次のようになります。
AIDL API でも、フローはほぼ同じです。
1 つ目は、購入フローが完了する前に中断された場合です。たとえば、アプリがクラッシュした、ユーザーがアプリを強制終了させた、インターネット接続が失われた、などが考えられます。いずれにしても、Google Play で支払いの処理が終わっているにもかかわらず、ユーザーにアイテムが提供されていない状況に陥る可能性があります。この場合、アイテムは中途半端な状態です。Google Play はアイテムを消費するまで再購入が認められませんが、アプリやゲームでは前述のフロー以外でアイテムが消費されることはないからです。
2 つ目は、別の購入フローによって発生します。別の購入フローとは、アプリ内プロモーション、最近発表されたアプリ外サブスクリプション サーフェス、サブスクリプション用プロモーション コード、Google と連携したその他のプロモーションなどを指します。この場合、ユーザーは Play ストアアプリで直接アイテムを入手しますが、その間、対象のアプリやゲームは一時停止されているか実行されていない状態にあります。または、対象のアプリがインストールされていない可能性もあります。
このような場合に備えて、Google Play Billing Library と Google Play Billing AIDL API には、承諾または消費されていない購入を検知できる仕組みが組み込まれています。
Google Play Billing API を使っている場合、次のようにします。
アプリの
最後に、アプリで処理しなければならないもう 1 つのケースが存在します。それは、Play ストアアプリでアイテムを入手した際に、マルチウィンドウ モードで Play ストアアプリと対象のアプリの両方が見えている場合です。
Google Play Billing Library でこれをサポートするには、次のようにします。
以上の手順に従えば、アプリやゲームは購入フローの中断や別の購入フローに確実に対処できるようになります。
Reviewed by Yuichi Araki - Developer Relations Team

アプリやゲームを設計して開発するにつれ、収益化をどうするかが考え始めるときがあるでしょう。
Google Play でプロダクトを販売して収益化すると決めたら、販売するアイテムを表示するストア画面を作り、Google Play Billing Libraryを使ってユーザーが購入するダイアログを表示することになるでしょう。
ドキュメントや Billing Library TrivialDrive サンプルには詳しい説明が掲載されていますが、一般的なフローは次のようになります。
- UI スレッドから
launchBillingFlow()
メソッドを呼び出し、Google Play 購入ダイアログを表示します。 - 購入が成功すると、Google Play によって
onPurchasesUpdated()
メソッドが呼ばれ、購入オペレーションの結果が渡されます。 - アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
- 消費可能アイテムは
consumeAsync()
で、消費不可アイテムはacknowledgePurchase()
で購入を承諾します。 - 最後に、アプリ内で購入したアイテムを付与します。
AIDL API でも、フローはほぼ同じです。
getBuyIntent()
リクエストまたはgetBuyIntentExtraParams()
リクエストを送って購入するアイテムを指定し、続いてstartIntentSenderForResult()
を呼び出して Google Play 購入ダイアログを表示します。- 購入ダイアログが閉じられると、Google Play によって
onActivityResult()
メソッドに応答のIntent
が送られます。ここで、購入が成功したかどうかを確認できます。 - アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
- 購入が成功した場合、
getPurchases()
メソッドを呼び出して、まだ消費されていない所有アイテムの一覧を取得します。消費可能アイテムの場合は、consumePurchase()
メソッドを呼び出して再購入できるようにします。 - 最後に、アプリ内で購入したアイテムを付与します。
1 つ目は、購入フローが完了する前に中断された場合です。たとえば、アプリがクラッシュした、ユーザーがアプリを強制終了させた、インターネット接続が失われた、などが考えられます。いずれにしても、Google Play で支払いの処理が終わっているにもかかわらず、ユーザーにアイテムが提供されていない状況に陥る可能性があります。この場合、アイテムは中途半端な状態です。Google Play はアイテムを消費するまで再購入が認められませんが、アプリやゲームでは前述のフロー以外でアイテムが消費されることはないからです。
2 つ目は、別の購入フローによって発生します。別の購入フローとは、アプリ内プロモーション、最近発表されたアプリ外サブスクリプション サーフェス、サブスクリプション用プロモーション コード、Google と連携したその他のプロモーションなどを指します。この場合、ユーザーは Play ストアアプリで直接アイテムを入手しますが、その間、対象のアプリやゲームは一時停止されているか実行されていない状態にあります。または、対象のアプリがインストールされていない可能性もあります。
このような場合に備えて、Google Play Billing Library と Google Play Billing AIDL API には、承諾または消費されていない購入を検知できる仕組みが組み込まれています。
Google Play Billing API を使っている場合、次のようにします。
- アプリの
onResume()
コールバックでqueryPurchases()
メソッドを呼び出し、アイテムのリストを取得します。これを使って承諾していないアイテムを検知することができます。 - アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
- 承諾されていない所有アイテムがある場合は、消費可能アイテムには
consumeAsync()
を、消費不可アイテムにはacknowledgePurchase()
を使って購入を承諾します。 - 購入したアイテムをアプリ内で付与します。
- アプリの
onResume()
コールバックでgetPurchases()
メソッドを呼び出し、まだ消費されていない所有アイテムの一覧を取得します。 - アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
- 消費可能アイテムの場合は、
consumePurchase()
メソッドを呼び出して再購入できるようにします。 - 最後に、アプリ内で購入したアイテムを付与します。
アプリの
onResume()
コールバックは、プロセスが開始した場合に加え、フォアグラウンドになった場合にも呼ばれる点に注意してください。アプリやゲームが一時停止する前にどのような画面が表示されていたかにはよりません。たとえば、ホーム画面、ストア画面、ゲーム画面があるゲームでは、すべての画面から onResume()
が呼ばれる可能性があります。最適なユーザー エクスペリエンスを実現するために、onResume()
が呼ばれた際に表示されている画面に関係なく、承諾または消費していないアイテムを処理できるようにすることをお勧めします。優れたユーザー エクスペリエンスを提供するには、それぞれの画面でこの処理を徹底的にテストすることが欠かせません。 最後に、アプリで処理しなければならないもう 1 つのケースが存在します。それは、Play ストアアプリでアイテムを入手した際に、マルチウィンドウ モードで Play ストアアプリと対象のアプリの両方が見えている場合です。
Google Play Billing Library でこれをサポートするには、次のようにします。
- 保留になっている新しいアイテムがあることをアプリに通知するため、Google Play によって
onPurchasesUpdated()
メソッドが呼ばれます。 - アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
- 消費可能アイテムは
consumeAsync()
で、消費不可アイテムはacknowledgePurchase()
で購入を承諾します。 - 最後に、アプリ内で購入したアイテムを付与します。
- アプリの
onResume()
コールバックでPurchasesUpdatedListener
を登録し、com.android.vending.billing.
PURCHASES_UPDATED
インテントを受け取れるようにします。また、アプリのonPause()
コールバックでリスナーの登録を解除します。 - アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
- 保留になっている新しいアイテムがあることをアプリに通知するため、Google Play によってリスナーが呼ばれます。リスナーで
getPurchases()
メソッドを呼び出し、まだ消費されていない所有アイテムの一覧を取得します。消費可能アイテムの場合は、consumePurchase()
メソッドを呼び出して再購入できるようにします。 - 最後に、アプリ内で購入したアイテムを付与します。
以上の手順に従えば、アプリやゲームは購入フローの中断や別の購入フローに確実に対処できるようになります。
Reviewed by Yuichi Araki - Developer Relations Team