技術系(Tips)
PR

【Android】Google Play 外部決済(代替決済)の報告フローと API 実装ガイド

saratogax
記事内に商品プロモーションを含む場合があります

Google Play の「外部決済(代替決済)」を導入する際、エンジニアが直面する最大の壁は、「決済情報の管理モデル」が根本から変わる点にあります。

Google Play が決済代行を行わないため、これまでのレシート検証ロジックは一切通用しなくなります。

本記事では、外部決済の報告フローと ID 設計、そして Apple(App Store)との決定的な違いについて詳しく解説します。

Google Play 決済と外部決済の大きな違い

外部決済を利用すると、Google Play は「プラットフォーム提供者」の立場に徹し、決済の詳細(カード番号や成功可否)には関与しません。

そのため、「誰が何を買ったか」のマスターデータは自社サーバーで管理する責任が生じます。

比較項目従来の Google Play 決済外部決済 (Alternative Billing)
購入データの管理Google 側で保持自社サーバーで保持
API の役割購入内容の照会(Pull 型)売上の報告(Push 型)
レシート(トークン)Google 発行の購入証明自社発行の取引 ID
レシート検証Google サーバーで検証不要(自社決済系で完結)
※表は横スクロールできます

外部決済の実装フロー

外部決済は、アプリとサーバーの連携によって成り立ちます。

  1. アプリ側:報告用トークンの取得 ユーザーがアプリ内の選択画面で外部決済を選択した際、Billing Library を通じて externalTransactionToken を取得します。これが Google への報告時に必要な「取引の予約票」となります。
  2. 外部決済の実行 独自の決済システムや Stripe などの決済代行を利用し、ブラウザ上で決済を完了させます。
  3. サーバー側:Google への報告(External Transactions API) 決済成功後、24時間以内に Google の API を呼び出して取引内容を送信します。

都度購入と定期購入、それぞれのルール

外部決済では、従来の Google Play 決済で必須だった acknowledge(承認)や consume(消費)といったステップは一切不要です。

都度購入(一回限りの購入)

決済成功時に、取引情報を一度 Google に報告(create)して終了です。

Google 側には購入履歴やレシートが残らないため、自社 DB で「どのユーザーが購入済みか」を完全に管理する必要があります。

定期購入(サブスクリプション)

初回決済だけでなく、更新(継続課金)が発生するたびに報告する義務があります。

  • ID の紐付け: 初回報告時の ID(externalTransactionId)を保存しておき、2回目以降の報告時に initialExternalTransactionId としてセットします。
  • これにより、一連のサブスクリプションとして Google 側に認識されます。

externalTransactionId設計のポイント

外部決済では Google の purchaseTokenorderId(GPA.xxx…)が自動発行されないため、自社で ID を生成する必要があります。

  • 推奨: 自社 DB の決済レコードに紐づく UUID をそのまま使用するのがベストです。
  • 理由: Google 側の管理画面と自社 DB を 1:1 で突き合わせる際、トレーサビリティ(追跡可能性)が最も高くなるためです。

Apple (App Store) との詳細比較

Apple の send-external-purchase-report と Google のフローを比較すると、「未完了の取引をどう扱うか」という設計思想に大きな差があります。

比較項目Google PlayApple (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 を「購入情報の唯一の正解」として設計し直す必要がある。
ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました