Open1

Play Storeでの定期購入をバックエンド(Railsサーバー)でacknowledgeする

たっくんたっくん

Cloud Pub/Subから送られてくるデータをデコードする

Cloud Pub/Subから送られてくるデータ

{
  "message": {
    "attributes": {
      "key": "value"
    },
    "data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
    "messageId": "136969346945"
  },
  "subscription": "projects/myproject/subscriptions/mysubscription"
}

https://developer.android.com/google/play/billing/rtdn-reference?hl=ja#sub

base64でエンコードされたdataをデコードすると、その中のsubscriptionNotification に以下のようになる。

{
  "version":"1.0",
  "packageName":"com.some.thing",
  "eventTimeMillis":"1503349566168",
  "subscriptionNotification":
  {
    "version":"1.0",
    "notificationType":4,
    "purchaseToken":"PURCHASE_TOKEN",
    "subscriptionId":"monthly001"
  }
}

https://developer.android.com/google/play/billing/rtdn-reference?hl=ja#sub

デコードは以下のコードでできる

class Api::V1::GoogleServerNotificationsController < ActionController::API
  def create
    decoded_data = Base64.decode64(params[:message][:data])
    json_data = JSON.parse(decoded_data)

    head :ok
  end
end

acknowlegeする

gem 'google-apis-androidpublisher_v3'
    client = Google::Apis::AndroidpublisherV3::AndroidPublisherService.new.tap do |client|
      client.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
        # 動作確認のためにサービスアカウントの鍵をローカルに置いている
        json_key_io: Rails.root.join('service-account.json'),
        scope: CREDENTIAL_ACCESS_SCOPE
      )
    end
    client.acknowledge_purchase_subscription(package_name, subscription_id, purchase_token)

APIドキュメント
https://googleapis.dev/ruby/google-api-client/latest/Google/Apis/AndroidpublisherV3/AndroidPublisherService.html

サブスクリプションを取得する

gem 'google-apis-androidpublisher_v3'
    client = Google::Apis::AndroidpublisherV3::AndroidPublisherService.new.tap do |client|
      client.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
        # 動作確認のためにサービスアカウントの鍵をローカルに置いている
        json_key_io: Rails.root.join('service-account.json'),
        scope: CREDENTIAL_ACCESS_SCOPE
      )
    end
    client.get_purchase_subscriptionsv2(package_name, purchase_token)

実装の参考

Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜
https://speakerdeck.com/mitsuboshi/google-play-iab-in-app-billing-railsdefalsesabasaidodui-ying-falsesubete?slide=69

RailsでGoogle Playのアプリ内課金の購入ステータスを取得する
https://zenn.dev/mingos/articles/0e2bffdf147ec5

Androidアプリ内購入、パート 5: サーバーサイドでの購入の検証 > 定期購入の承認
https://adapty.io/ja/blog/android-in-app-purchases-part-5-server-side-purchase-validation/

Simple REST client for version V3 of the Google Play Android Developer API
https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-androidpublisher_v3/OVERVIEW.md