【Android】Google Play 外部決済(代替決済)の報告フローと API 実装ガイド
Google Play の「外部決済(代替決済)」を導入する際、エンジニアが直面する最大の壁は、「決済情報の管理モデル」が根本から変わる点にあります。
Google Play が決済代行を行わないため、これまでのレシート検証ロジックは一切通用しなくなります。
本記事では、外部決済の報告フローと ID 設計、そして Apple(App Store)との決定的な違いについて詳しく解説します。
Google Play 決済と外部決済の大きな違い
外部決済を利用すると、Google Play は「プラットフォーム提供者」の立場に徹し、決済の詳細(カード番号や成功可否)には関与しません。
そのため、「誰が何を買ったか」のマスターデータは自社サーバーで管理する責任が生じます。
| 比較項目 | 従来の Google Play 決済 | 外部決済 (Alternative Billing) |
|---|---|---|
| 購入データの管理 | Google 側で保持 | 自社サーバーで保持 |
| API の役割 | 購入内容の照会(Pull 型) | 売上の報告(Push 型) |
| レシート(トークン) | Google 発行の購入証明 | 自社発行の取引 ID |
| レシート検証 | Google サーバーで検証 | 不要(自社決済系で完結) |
外部決済の実装フロー
外部決済は、アプリとサーバーの連携によって成り立ちます。
- アプリ側:報告用トークンの取得 ユーザーがアプリ内の選択画面で外部決済を選択した際、Billing Library を通じて
externalTransactionTokenを取得します。これが Google への報告時に必要な「取引の予約票」となります。 - 外部決済の実行 独自の決済システムや Stripe などの決済代行を利用し、ブラウザ上で決済を完了させます。
- サーバー側:Google への報告(External Transactions API) 決済成功後、24時間以内に Google の API を呼び出して取引内容を送信します。
都度購入と定期購入、それぞれのルール
外部決済では、従来の Google Play 決済で必須だった acknowledge(承認)や consume(消費)といったステップは一切不要です。
都度購入(一回限りの購入)
決済成功時に、取引情報を一度 Google に報告(create)して終了です。
Google 側には購入履歴やレシートが残らないため、自社 DB で「どのユーザーが購入済みか」を完全に管理する必要があります。
定期購入(サブスクリプション)
初回決済だけでなく、更新(継続課金)が発生するたびに報告する義務があります。
- ID の紐付け: 初回報告時の ID(
externalTransactionId)を保存しておき、2回目以降の報告時にinitialExternalTransactionIdとしてセットします。 - これにより、一連のサブスクリプションとして Google 側に認識されます。
externalTransactionId設計のポイント
外部決済では Google の purchaseToken や orderId(GPA.xxx…)が自動発行されないため、自社で ID を生成する必要があります。
- 推奨: 自社 DB の決済レコードに紐づく UUID をそのまま使用するのがベストです。
- 理由: Google 側の管理画面と自社 DB を 1:1 で突き合わせる際、トレーサビリティ(追跡可能性)が最も高くなるためです。
Apple (App Store) との詳細比較
Apple の send-external-purchase-report と Google のフローを比較すると、「未完了の取引をどう扱うか」という設計思想に大きな差があります。
| 比較項目 | Google Play | Apple (App Store) |
|---|---|---|
| 報告対象 | 決済成功時のみ | 成功・失敗・未完了のすべて |
| 失敗(離脱)の扱い | 報告不要(API を叩かない) | NO_LINE_ITEM として報告必須 |
| 報告期限 | 取引完了から 24 時間以内 | 取引完了またはリンク遷移後、速やかに |
| サーバー通知 | 特になし (自社から Push するのみ) | App Store Server Notifications (V2) |
| 報告漏れへの対応 | 特になし | 通知で報告漏れが督促される |
Apple の「厳格な監視」と Google の「成功ベース」
Apple の場合、ユーザーが外部決済リンクを踏んでトークンが発行された時点で、Apple 側はそのトークンの「結末」を監視します。
決済されなかった場合でも「決済されなかった」という報告をしないと、App Store Server Notifications (V2) を通じて「未報告のトークンがあります」と督促が届く非常に厳格な仕組みです。
対して Google は現時点では、デベロッパーが決済成功を検知したものを Push してくるのを待つ、比較的シンプルな「成功ベース」の運用となっています。
従来の購入照会 API は利用不可
外部決済で支払われた取引には、Google 発行の「レシート(Purchase Token)」が存在しません。そのため、以下の API にリクエストを送っても「データなし」のエラーが返ります。
- 都度購入:
purchases.productsv2.get - 定期購入:
purchases.subscriptionsv2.get
外部決済ユーザーの権限判定(アイテム付与や有効期限確認)は、Google API に頼らず、自社データベースの情報をマスターとして判定するロジックに切り替える必要があります。
まとめ:実装のポイント
- 外部決済には Google 側の「レシート」や「承認 API」は存在しない。
- 決済成功時のみ、自社発行の ID(UUID 推奨)を使って Google へ報告する。
- Google は Apple と異なり、決済失敗(離脱)の報告までは求めていない。
- 自社 DB を「購入情報の唯一の正解」として設計し直す必要がある。
