Google Play Developer APIを使ってレシート検証
※完全に個人的な備忘録のため、内容は新しくないし、そもそも書いている時点でもベストなものでない可能性があります。
前提
・in-app billingにて消費型アイテムを販売した際のレシート情報が正しいかを検証する
・レシート情報の取得等は既に実装できている
準備
- デベロッパーコンソールに契約アカウントでサインインし、デベロッパーアカウント -> APIアクセス
- Google Play Android Developerのリンクを行う
- OAuth クライアントを作成する
- Google Developers Consoleにて作成したクライアントのクライアントID、シークレットを確認
OAuth認証
ブラウザにて下記URLにアクセス
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=http://localhost&client_id=<準備.4で確認したクライアントID>
Googleのアカウントリンク画面が出るので許可する
http://localhost/?code=4/AACyzBvuCgBZQKv8VKPvCQl5Szt6U47GClAPLk0qTuItTUmUoFKJWqUfSyJN2bTCqLDXXXXXXXXXXXXXXXXXXXX#
のようなURLにリンクされるので、code=の部分を取得
アクセストークン取得
POSTリクエストのためCurlで実行
$ curl -v -X POST 'https://accounts.google.com/o/oauth2/token' -d 'grant_type=authorization_code&code=<上記OAuth認証で取得したCode#まで>&client_id=<準備.4で確認したクライアントID>&client_secret=準備.4で確認したクライアントシークレット>&redirect_uri=http://localhost'
上記のような結果が返るので、access_token / refresh_token を確認しておく
レシート検証
やっと本題
レシート情報から、
・packageName
・productId
・purchaseToken
を確認しておく
とりあえずまずは検証を手動で。。。
$ curl -v 'https://www.googleapis.com/androidpublisher/v3/applications/<packageName>/purchases/products/<productId>/tokens/<purchaseToken>?access_token=<アクセストークン取得で取得したaccess_token>'
上記のような結果が返ってきたらOK
結果の詳細は https://developers.google.com/android-publisher/api-ref/purchases/products#resource
要するに、
consumptionState:1
developerPayload:決済時に送信したペイロードと一致しているか
purchaseState:0
あたりを確認して検証したら良さそう
ここまで確認したら、同様の処理を実装する訳ですが、
問題はaccess_tokenが取得から1時間で有効期限切れしてしまいます。
access_tokenの更新
$ curl -v -X POST 'https://accounts.google.com/o/oauth2/token' -d 'grant_type=refresh_token&client_id=<クライアントID>&client_secret=<クライアントシークレット>&refresh_token=<アクセストークン取得時に確認したrefresh_token>'
新しいaccess_tokenが取得できます
実装フロー
上記を踏まえて
- レシート情報の取得
- access_tokenの更新
- レシート検証
- アイテム付与
という流れを実装することで良さそうです。
参考
https://groups.google.com/forum/#!topic/android-group-japan/jaaIGAl2lPE
http://d.hatena.ne.jp/fkm/20130504
https://developers.google.com/android-publisher/api-ref/purchases/products