💰

RailsでGoogle Playのアプリ内課金の購入ステータスを取得する

2024/02/15に公開

Google Play Developer APIにアクセスする方法としてはREST APIの仕様に従って自前でアクセスする方法と、公式クライアントライブラリを使用する方法がある。
例えばこの記事のコードが参考になる。
ググるとだいたいこのように自前で実装している。
Google Play Developer API を使用してAndroidのin-app billingのレシート検証を行う(メモ) #Android - Qiita

公式のクライアントライブラリはドキュメントが少ない上にサンプルコードもすべてを網羅していないので結局ライブラリのコードを自分で読む事になる...。
とりあえず、購入ステータスを取得する事が出来たので手順を自分なりにまとめておきたい。

試した環境

  • Ruby 3.3.0
  • Rails 7.0.8

前提

  • アプリ内課金の実装が完了しており、サーバー(Rails)にGoogle Playの購入完了時にレシートが送信されて来る
  • レシートのJSONに含まれるpackgeName, productId, purchaseTokenが取得できる

Gemfileにgoogle-apis-androidpublisher_v3を追加

Gemfile
gem 'google-apis-androidpublisher_v3'

bundle installを実行。

サービスアカウントの情報を取得

Google Cloud Consoleからサービスアカウントのキー(JSON)を作成して保存。
これの管理をどうするか悩むところだが、ファイルとして保存せずにconfig/credentials.yml.encに内容を保存する事にした。
(bin/rails credentials:editで編集するやつ)
暗号化して保存されるのでgitでコミットしてもOKだし。
master_keyはもちろんバージョン管理外として別途管理する。
Rails.application.credentials.google_service_accountでJSONファイルの内容がすべて取得できるように定義する。

# Google::Auth::ServiceAccountCredentials.make_credsがJSONファイルのIOオブジェクトを必要としているので自分の管理方法に合わせて生成してやる
# JSONファイルをそのまま指定したい場合は以下の方法でOK
# json_key_io = File.open("JSONファイルのパス") 
json_key_io = StringIO.new(Rails.application.credentials.google_service_account.to_json)

# Android Publisher APIのオブジェクトを生成
scopes =  ['https://www.googleapis.com/auth/androidpublisher']
credential = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: json_key_io, scope: scopes)
android_publisher = Google::Apis::AndroidpublisherV3::AndroidPublisherService.new
android_publisher.authorization = credential

# アプリから送信されて来たレシートのJSONとする
receipt = JSON.parse(receipt_json)

# 購入成功時のレシートからパッケージ名、プロダクトID、PurchaseTokenを取得
package_name = receipt['packageName']
product_id = receipt['productId']
purchase_token = receipt['purchaseToken']

# 購入ステータスを取得する
# 対応するAPIドキュメント: https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products/get?hl=ja
purchase_product = android_publisher.get_purchase_product(package_name, product_id, purchase_token)
pp purchase_product

実行結果の例

#<Google::Apis::AndroidpublisherV3::ProductPurchase:0x00007f5115028d08
 @acknowledgement_state=1,
 @consumption_state=1,
 @developer_payload="",
 @kind="androidpublisher#productPurchase",
 @order_id="GPA.3365-9902-0523-32280",
 @purchase_state=0,
 @purchase_time_millis=1700545135030,
 @purchase_type=0,
 @region_code="JP">

Discussion