Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Play Billing in 2026: the purchase isn't done when launchBillingFlow returns

2026年10月16日に「Dev.to」が公開したITニュース「Play Billing in 2026: the purchase isn't done when launchBillingFlow returns」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Google Play課金では、購入開始後も処理は非同期。`launchBillingFlow`は「支払い開始」を意味し、「支払い完了」ではない。購入は最大3日以内に確認・承認しないと自動返金される。最新のライブラリを使い、起動時やフォアグラウンド復帰時に購入状況を常に確認し、保留中の購入には機能を付与しないようにしよう。

ITニュース解説

Google Play Billingは、Androidアプリでデジタルコンテンツやサービスを販売する際に利用する、Googleが提供する唯一の公式ライブラリである。このライブラリの役割は、アプリとGoogle Playを連携させ、ユーザーが安全に支払いを行い、アプリがその購入内容を正確に把握できるようにすることにある。しかし、この仕組みには非同期処理や購入後の確認など、開発者が注意すべき点が数多く存在し、これらを理解せずに実装すると、ほとんどの課金関連のバグが発生する原因となる。

開発者がよく陥る誤解の一つは、launchBillingFlow()という購入フローを開始するメソッドを、レジで現金払いが完了したかのように即座に「支払い済み」という結果が返ってくるものとして扱うことだ。実際には、このメソッドは購入手続きの画面を表示するだけであり、ユーザーが支払いを完了したかどうかはその時点ではわからない。購入の結果は、アプリが起動している間だけでなく、アプリが閉じられた後や、ユーザーが別のデバイスで同じアカウントを使って購入を行った場合でも、非同期的にリスナーを通じて後から通知される。また、ユーザーがコンビニ払いなどの支払い完了に時間がかかる方法を選択した場合、購入は「PENDING(保留中)」という状態として通知されることもある。このように、購入はいつでもどこからでも発生し、結果がすぐには得られないという非同期性を理解することが極めて重要である。

さらに、Google Play Billingのシステムでは、購入が完了したとアプリが認識した後、その購入を3日以内にGoogleに対して「確認(Acknowledge)」しなければならないというルールがある。この確認を怠ると、その購入は自動的に払い戻しされ、ユーザーに付与されたはずのデジタルコンテンツやサービス(特典)も取り消されてしまう。これは、アプリが購入を正しく処理し、特典を付与したことをGoogleに伝えるための重要なステップであり、必ず実行する必要がある。

Play Billing Libraryは常に改良されており、Googleはメジャーバージョンごとに約2年間のサポート期間を設定している。そのため、開発者は新しいアプリや既存アプリの更新時に、常に推奨される最新バージョンを使用する義務がある。例えば、記事執筆時点の2026年10月ではバージョン9.1.0が最新であり、これを使えば2028年8月31日まではサポートされる。過去のバージョンアップでは、古いメソッドの廃止(例:バージョン8.0.0でqueryPurchaseHistory()など)、アプリ内アイテムの呼び方の変更(「ワンタイムプロダクト」へ)、アプリの最低SDKバージョンの引き上げ(バージョン8.1.0)、Playストアがブロックされている場合の応答コードの変更(バージョン9.0.0)など、ビルドエラーに繋がる可能性のある重要な変更が数多く行われているため、リリースノートを確認しながらアップグレードを進める必要がある。

実装の基本としては、アプリが起動したときや、ユーザーがアプリをフォアグラウンドに戻したときに、BillingClientというGoogle Play Billingとの接続窓口を一つだけ確立することがGoogleによって強く推奨されている。このBillingClientは、enableAutoServiceReconnection()という設定を有効にしておくことで、ネットワークが一時的に切断された後でも自動的にGoogle Playとの接続を再確立してくれるため、安定した課金処理が可能になる。この接続はアプリのライフサイクルに合わせて適切に管理し、不要な接続を切断することも重要である。

アプリ内で表示する商品の価格については、アプリのコード内に直接書き込む(ハードコードする)べきではない。Google Playは、ユーザーの地域や通貨、利用言語に合わせて最適な価格や表示形式を自動的に調整して提供する。したがって、アプリはqueryProductDetailsAsync()メソッドを使って、常にGoogle Playから最新の価格情報を取得し、それをユーザーに表示する必要がある。これにより、国際展開しているアプリでも正確な価格表示が可能となる。

ユーザーが商品を購入する際には、アプリはlaunchBillingFlow()メソッドを呼び出し、購入したい商品の詳細情報(ProductDetails)や必要であればオファートークンを渡す。このメソッドが返ってきた時点では、まだ支払い状況は不明であり、購入結果はonPurchasesUpdated()リスナーに通知されるのを待つことになる。

購入結果として通知される状態の中で、特に重要なのは「PENDING」と「PURCHASED」である。「PENDING」は、ユーザーが支払いの手続きを開始したが、まだ支払いが完全に完了していない状態を示す。この状態では、まだユーザーに特典を付与してはならない。特典を付与するのは、購入が完全に完了し「PURCHASED」状態になったことを確認した後である。

「PURCHASED」状態になったら、以下の3つのステップを順に実行する必要がある。まず、その購入が正当なものであるかを検証する。セキュリティ上の理由から、この検証はアプリのバックエンドサーバーで行うことが強く推奨される。次に、検証が完了したら、ユーザーに購入したデジタルコンテンツやサービスを付与する。そして最後に、その購入をGoogleに「Acknowledge(確認)」するか、あるいは「Consume(消費)」する。

「Acknowledge」は、一度購入すれば永続的に利用できるアイテム(例:広告削除機能やプレミアム版へのアップグレードなど)に対して行う。これを一度行えば、ユーザーはそのアイテムを再度購入することはできない。「Consume」は、ユーザーが複数回購入できるアイテム(例:ゲーム内通貨やライフ回復アイテムなど)に対して行う。Consumeを行うと、その購入は消費されたとみなされ、ユーザーは同じアイテムを再度購入できるようになる。どちらの場合も、購入後3日以内にこの処理を行わないと、Googleによって自動的に払い戻されてしまうため、速やかに処理することが求められる。

ただし、onPurchasesUpdated()リスナーだけを頼りに購入を処理するのは不十分である。リスナーは、ネットワークが一時的に切断された後に支払いが行われた場合、ユーザーが別のデバイスで同じアカウントを使って購入した場合、アプリ外でプロモーションコードが利用された場合、あるいはアプリが閉じている間に保留中の支払いが完了した場合など、一部の重要な購入イベントを見逃してしまう可能性がある。

この問題を解決するためには、BillingClientがGoogle Playに接続されたときや、アプリがフォアグラウンドに戻ってきたときに、過去の購入履歴を照会するqueryPurchasesAsync()メソッドを常に呼び出す必要がある。このメソッドは、過去に完了したがアプリ側でまだ処理されていない購入や、Acknowledgeが失敗して再試行が必要な購入などを検出し、それらを改めて処理することで、3日間の期限内に全ての購入が確実に処理されるようになる。

本番リリース前には、実際の決済が行われる環境での徹底したテストが不可欠である。Googleは、開発者が実際の金銭を支払うことなくテストできるように、様々な機能を提供している。「ライセンステスター」として登録したGoogleアカウントは、実際の支払いなしでアプリ内課金をテストでき、デバッグビルドやサイドロードされたアプリでも機能する。Google Play Consoleでは、支払いが数分後に承認される「遅延カード」、数分後に拒否されるカード、承認後にチャージバックが発生するカードといった特別なテスト用クレジットカードも用意されており、これらを使ってPENDING状態の動作確認や、遅れて承認された購入がqueryPurchasesAsync()によって正しく処理されるかを確認できる。さらに、「Play Billing Lab」アプリを利用すれば、テストの際にPlayストアの国を変更したり、同じアカウントでトライアルや紹介オファーを繰り返したり、サブスクリプションの状態変化を早めたりといった、より複雑なテストシナリオをシミュレーションできる。

まとめとして、Google Play Billingを実装する上での重要な点を再確認する。新規開発ではPlay Billing Libraryの最新バージョンを使用し、BillingClientは一つだけにしてenableAutoServiceReconnection()を有効にする。PENDING状態の購入には決して特典を付与せず、PURCHASED状態になったら、検証、特典付与、そして3日以内のAcknowledgeまたはConsumeを確実に行う。そして、BillingClientが接続されたときと、アプリがフォアグラウンドに戻ってきたときには必ずqueryPurchasesAsync()を呼び出し、未処理の購入をチェックし処理する。最後に、リリース前にはライセンステスターとテスト用カードを使って徹底的にテストすることが、ユーザーに安定した課金体験を提供するために不可欠である。

関連コンテンツ

関連IT用語