Google Play 決済(IAB)のフロー解説

はじめに

お久しぶりです。 絶賛サーバーサイドKotlinを愛でてるrhyskです。

アプリ開発をしていると当たり前のようにアプリ決済が行われていますが、先日VideomarketのAndroidアプリもリニューアルし、Google Play決済を導入しました。Google Play決済を導入した弊社のフローの中でつまずいたところ含めて解説したいと思います。

Google Play決済(IAB)とは

Androidデバイスを利用するとGoogleアカウントを作ってアプリのダウンロードなどを行いますが、 ダウンロードしたアプリ内でGoogleアカウントを使った決済ができる仕組みをGoogle Play決済と呼びます。

アプリ内決済(In App Billing)を略してIABなどと呼びますが、iOSはアプリ内購入(In App Purchase)を略してIAPと呼んでおり名称が区別されています。

決済のフロー

f:id:rhysk:20220317101003p:plain
Google Play決済フロー

前提としてGoogle Playの課金を利用するためにはGoogle Play Consoleで課金アイテムを設定する必要があります。

Play Console上でアイテムID(商品ID)と価格とアイテム名などを設定して課金を有効にすることで商品を登録することができます。

(1), (2) 設定中の商品はサービスのBackendAPIからも参照できるようにしておき、ユーザーに商品の一覧を見せます。

(3) ユーザーがどの商品を購入するか決定したら、AndoroidのアプリからGoogle PlayにPlay Billingライブラリを使って決済を行います。

(4) ライブラリで決済を行うとレシートと署名が送られてきます。

レシートは以下のようにJSONで送られてきます。

{"orderId":"GPA.XXXX-XXXX-XXXX-XXXXX","packageName":"jp.videomarket.android.iablib.demo","productId":"jp.videomarket.android.iablib.demo.subs.1","purchaseTime":1627366206891,"purchaseState":0,"purchaseToken":"購入トークンが入ります","quantity":1,"autoRenewing":true,"acknowledged":false}

(5), (6) レシートと署名は自社のバックエンドAPIに送り、署名を使ってレシートが本当に正しいものかを検証します。

(7)レシートは発行時点のものなので購入ステータスが成功しているかどうかの情報は分かりません。 そのためGoogleのPurchase APIを使って購入ステータスを取得し決済されているかを確認する必要があります。

(9), (10) 商品購入処理の確定とレシートの保存を行います。 レシートはサービスに問い合わせなどがあった場合や、事後検証をする場合にも使うので必ず保存しておきましょう。

(11)商品購入処理が終わったら商品の決済をサービス側が承認してGoogle APIに送らなければなりません。 これをAcknowledgeと呼び、承認するためのAPIのエンドポイントが用意されています。 Acknowledgeが完了しないと決済がGoogle側でキャンセルされるので必ず行なってください。

これでアプリ内決済した商品が利用できるようになります。

フロー上の注意点

まず、同じレシートが何度も送られてきても大丈夫なようにサービスAPIを作る必要があります。

いわゆる冪等性(1度でも何度でも同じ結果)の作りを担保してあげます。

決済が1回なのにレシートが何度も送られることによって商品がユーザーに対して2重に付与されないようにしましょう。

Acknowledgeは何度実行しても副作用がありません。最後に商品の購入処理が終わったら行うようにしましょう。

もう一つはレシートや購入ステータスに含まれるテスト決済かどうかの情報と無料トライアルかどうかの情報です。

テスト決済は、デベロッパーが検証しやすいようにGoogleによって提供されています。 テスト決済かどうかはレシートに含まれる"purchaseType" = 0 があるかどうかで判定することができます。定期購入であれば1ヶ月も更新を待たずとも5分おきに更新してくれて便利です。本番環境でももちろん利用できますが、本番課金とテスト課金は分けて集計できるようにしておきましょう。

無料トライアルは定期購入のレシート限定で含まれる"paymentState" = 2で判定することができます。無料トライアルも初回は課金自体されないので、テスト課金同様0円決済であることを集計できるようにしておきましょう。無料トライアルを有効にするかどうかはPlay Console上で設定できます。

終わりに

Google Play決済の導入を考えている方の手助けになればいいなと思い今更ですがフローを作ってみました。

参考になれば嬉しいです。

次回は定期購入の更新について話したいと思います。