Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Google Play IAB(In-App Billing) 〜Railsでのサーバサイド...
Search
MITSUBOSHI
September 24, 2021
Technology
4
7.3k
Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜
MITSUBOSHI
September 24, 2021
Tweet
Share
More Decks by MITSUBOSHI
See All by MITSUBOSHI
Good to know yaml
mitsuboshi
0
1.3k
From ㍻ to U+32FF
mitsuboshi
0
2.1k
Other Decks in Technology
See All in Technology
alecthomas/kong はいいぞ / kamakura.go#7
fujiwara3
1
300
継続的にアウトカムを生み出し ビジネスにつなげる、 戦略と運営に対するタイミーのQUEST(探求)
zigorou
0
520
2024年にチャレンジしたことを振り返るぞ
mitchan
0
130
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
190
新機能VPCリソースエンドポイント機能検証から得られた考察
duelist2020jp
0
220
How to be an AWS Community Builder | 君もAWS Community Builderになろう!〜2024 冬 CB募集直前対策編?!〜
coosuke
PRO
2
2.8k
終了の危機にあった15年続くWebサービスを全力で存続させる - phpcon2024
yositosi
1
760
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
310
AI時代のデータセンターネットワーク
lycorptech_jp
PRO
1
280
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
120
バクラクのドキュメント解析技術と実データにおける課題 / layerx-ccc-winter-2024
shimacos
2
1.1k
多領域インシデントマネジメントへの挑戦:ハードウェアとソフトウェアの融合が生む課題/Challenge to multidisciplinary incident management: Issues created by the fusion of hardware and software
bitkey
PRO
2
100
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
65
11k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Optimizing for Happiness
mojombo
376
70k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
97
How STYLIGHT went responsive
nonsquared
95
5.2k
Building Your Own Lightsaber
phodgson
103
6.1k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Making the Leap to Tech Lead
cromwellryan
133
9k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Transcript
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play IAB(In-App Billing)
〜Railsでのサーバサイド対応のすべて〜 三星祐也 @MITSUBOSHI 銀座Rails #37
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Company: Quipper Limited
➔ GitHub: MITSUBOSHI ➔ Twitter: Y_MITSUBOSHI self.introduce
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Play IABのサーバサイド対応情報があまり発信されていない
◆ Androidクライアントサイドの情報は多い ◆ Google公式の情報もサーバサイド側の話が少ない Motivation
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Agenda | 01 02
03 04 Google Play IAB(In-App Billing)の仕様 Google Play IAB(In-App Billing)の対応方針と設計 Androidクライアント間との処理 Cloud Pub/Subを用いたRTDNイベント処理
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play IAB(In-App Billing)の仕様
01
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Playの課金システム ◆
ざっくり言うと、Androidスマホ・タブレットにおけるアプリ内決済 Google Play IAB(In-App Billing)とは
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ One-time products ➔
Subscriptions Google Play IAB(In-App Billing)の種類
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 買い切り型 ◆ consumable
… 複数回購入可能 • 例: ゲーム内通貨 ◆ non-consumable … 一度だけ購入可能 • 例: 永久会員権, 電子書籍 One-time products
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 定期購入型 ◆ 例:
月額課金系のサービス Subscriptions
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 定期購入型 ◆ 例:
月額課金系のサービス • => スタディサプリ 中学/高校/大学受験講座 Subscriptions
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ ユーザがIAB Subscriptionを購入してから3日以内に承認をしなかった場合、自動 返金される
acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ ユーザがIAB Subscriptionを購入してから3日以内に承認をしなかった場合、自動 返金される
➔ acknowledge方法 ◆ Androidクライアントライブラリ(PBL: Play Billing Library)経由 ◆ Google Play Developer API経由 acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ ユーザがIAB Subscriptionを購入してから3日以内に承認をしなかった場合、自動 返金される
➔ acknowledge方法 ◆ Androidクライアントライブラリ(PBL: Play Billing Library)経由 ◆ Google Play Developer API経由 acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ユーザがSubscription購入を試行 acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscriptionの購入に成功 acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権の付与に成功 + acknowledgeする acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権の付与に失敗 + acknowledgeしない acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 購入から3日後に自動返金される acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ IAB Subscriptionの購入(申し込み) +
サービス側の役務提供の開始 (acknowledge)の2つを以って、定期購入開始とする acknowledge
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play IAB(In-App Billing)の対応
方針と設計 02
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 obfuscatedExternalAccountId
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 IAB Subscriptionとユーザの紐付け
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ obfuscatedExternalAccountId ◆ Androidクライアント側(Play
Billing Library)でIAB Subscriptionに対して任 意の文字列を指定出来る • => 難読化されたユーザID ◆ Google Play Developer API経由で取得する最新のsubscriptionデータ内に もfieldとして表出するようになる ◆ Subscriptionの購入者と利用権付与対象者が一致するかの検証にも利用 IAB Subscriptionとユーザの紐付け
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 サーバ側からSubscriptionの状態を取得する方法
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Play Developer
API ➔ Androidクライアント経由でのレシート情報取得 ➔ Real Time Developer Notification サーバ側からSubscriptionの状態を取得する方法
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 特定のsubscription(SubscriptionPurchaseリソース)に対する操作が可能 ◆ Ref:
https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscri ptions ➔ 可能な操作 ◆ 最新リソースの取得(get) ◆ subscriptionの承認(acknowledge) ◆ etc. Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ GET https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageNa me}/purchases/subscriptions/{subscriptionId}/tokens/{token}
➔ 必須パラメータ ◆ packageName … Android app固有の一意な識別子 (別名: applicationId) ◆ subscriptionId … サービスが提供するsubscription毎に一意な識別子(別名: SKU or productId) ◆ token … ユーザが購入したsubscription毎の一意な識別子 (別名: purchaseToken) Subscriptionの最新状態の取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscriptionの最新状態の取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 注意点 ◆ リクエスト時点のsubscription情報しか取得できない
• => 過去時点のsubscription状態を把握したいケースがある場合は、細かく記録しておく ことが重要 Subscriptionの最新状態の取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ gem 'google-apis-androidpublisher_v3' Google
Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント経由でのレシート情報取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Play Billing Library(PBL)経由でレシート情報を取得可能
◆ https://developer.android.com/reference/com/android/billingclient/a pi/Purchase Androidクライアント経由でのレシート情報取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント経由でのレシート情報取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ expiryTimeMillis (有効期限)の値を知るためにはGoogle Play
Developer APIを 利用する必要がある Androidクライアント経由でのレシート情報取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Real Time Developer Notification
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Subscriptionの状態変化毎に通知を受け取ることが出来る機構 ◆ Google
Cloud Pub/Subを利用する必要がある ◆ 受け取るメッセージにはsubscriptionの詳細情報は含まれていないため、 Google Play Developer APIを利用する必要がある ➔ 以降は、RTDNと略します Real Time Developer Notification
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 エンドポイント設計
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ サーバサイドの主な役割 ◆ 購入されたsubscriptionの状態に従って、ユーザに適切なコンテンツ/サービ
スの利用権を付与する エンドポイント設計
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入 … Androidクライアント間
➔ 新規購入以外 … RTDN間 エンドポイント設計
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入 … Androidクライアント間
◆ 理由: subscriptionの新規購入はアプリ内での操作であるため(+ ユーザに同 期的にフィードバックをしたい) エンドポイント設計
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入以外 … RTDN間
◆ 理由: subscriptionの新規購入以外はアプリ外での操作/状態変化であるた め(例: 解約, 再開, 月額更新, 猶予期間) エンドポイント設計
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 DB設計
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 DB設計
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 役割 ◆ サービスが提供するsubscriptionのマスタデータ
➔ fields ◆ package_name … Android app固有の一意な識別子 (別名: applicationId) ◆ product_id … サービスが提供するsubscription毎に一意な識別子(別名: SKU or subscriptionId) GooglePlayIabPackage
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 役割 ◆ 各subscriptionの管理用
• ※subscriptionの有効期限等は関連のpaymentに同期させている ➔ fields ◆ purchase_token … ユーザが購入したsubscription毎の一意な識別子 ◆ google_play_iab_package_id ◆ payment_id GooglePlayIabReceipt
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 役割 ◆ 各処理時点でのsubscription情報の履歴管理用
(※追記型) ➔ 主なfields ◆ raw_subscription_purchase … json型であり、subscriptionの情報をそのまま突っ込んでいる • 検索に必要なものは fieldとして切り出して定義している ◆ source_type … Android側が取得したレシート or Google Play Developer API。STIにはしていな い。 ◆ rtdn_type … Real Time Developer Notificationのイベント種別 GooglePlayIabSubscriptionPurchaseHistory
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント間との処理 03
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 定期購入開始用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 定期購入開始用エンドポイント ➔ 復元用エンドポイント
エンドポイントの種類
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 定期購入開始用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入のフロー
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Subscription購入後に、定期購入開始用エンドポイントへリクエストする 新規購入のフロー
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Endpoint: POST /api/v1/android/iab/subscriptions
➔ Request parameter: ◆ receipt … クライアントが取得可能な購入情報を含むデータ • https://developer.android.com/reference/com/android/billingclie nt/api/Purchase#getOriginalJson() ◆ signature … 購入情報を含むreceiptを開発者用の秘密鍵で署名したもの • https://developer.android.com/reference/com/android/billingclie nt/api/Purchase#getSignature() 定期購入開始用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 主な処理の流れ ◆ 署名検証
◆ subscriptionの最新状態の取得 + 検証 ◆ 利用権付与 + acknowledge処理 定期購入開始用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント経由でのレシート情報取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 定期購入開始用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証 LICENSE PUBLIC KEYはGoogle
Play Consoleから取得出来る。 Base64エンコードされているため、デコードする。
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証 signatureもBase64エンコードされているため、デコードする。
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証 => true/false
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証の呼び出し側
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証の呼び出し側
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの最新状態の取得
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ gem 'google-apis-androidpublisher_v3' を拡張
Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ gem 'google-apis-androidpublisher_v3' を拡張
Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 IAB Subscriptionの検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権付与 + acknowledge処理
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 復元用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権の付与に失敗 + acknowledgeしない 復元用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Play側の購入状態とサービス側の利用権状態がズレているとき ◆
a) Google Play側の購入状態(有) + Quipperの利用権状態(無)の場合 • a-1) 対応するGooglePlayIabReceiptが存在しない(≒ 1回も利用権が付 与出来ていない) • a-2) 対応するGooglePlayIabReceiptが存在する(≒ 最低1回は利用権 が付与出来ている) 復元の定義
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Endpoint: POST /api/v1/android/iab/subscriptions/restore
➔ Request parameter: ◆ receipt … クライアントが取得可能な購入情報を含むデータ ◆ signature … 購入情報を含むreceiptを開発者用の秘密鍵で署名したもの ※定期購入開始用エンドポイントと同じ 復元用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 主な処理の流れ ◆ 署名検証
◆ GooglePlayIabReceiptの有無の確認 ◆ subscriptionの最新状態の取得 + 検証 ◆ 利用権付与 + acknowledge処理 復元用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 復元用エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subを用いたRTDNイベント処 理 04
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入以外 … RTDN間
◆ 理由: subscriptionの新規購入以外はアプリ外での操作/状態変化であるた め(例: 解約, 再開, 月額更新, 猶予期間) エンドポイント設計 (思い出し)
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ フルマネージドのメッセージングサービス ➔ Real
Time Developer Notificationを受け取るために利用が必要 Google Cloud Pub/Subとは
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Topic ◆ Publisherがメッセージ(≒
queue)を送信する窓口 ◆ 複数のsubscriptionを紐付けさせることが出来る ◆ 関連付けられたすべてのsubscriptionで対象メッセージがacknowledgeされた時点でメッ セージを破棄する ➔ Subscription ◆ Subscriberがメッセージ(≒ queue)を受け取る窓口 ◆ 対象メッセージがacknowledgeされた時点でメッセージを破棄する Google Cloud Pub/Sub TopicとSubscription
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Pull型 ◆ 受信方法
… subscriptionに対してメッセージ取得のリクエストをする(能動的) ◆ acknowledge方法 … SDKのacknowledgeメソッド呼び出し ➔ Push型 ◆ 受信方法 … subscribe用のendpointを指定し、メッセージをHTTP Requestとして受け取れる (受動的) ◆ acknowledge方法 … HTTP Status Code(102, 200, etc.) Pub/Sub Subscriptionのメッセージ受信/acknowledge方法
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ At-Least-Once delivery ◆
同じメッセージが1回以上配信されることを考慮する必要がある • => 処理の冪等性 ➔ エラーの処理方針 ◆ Exponential Backoff ◆ Dead letter topic • RTDNの場合は最悪メッセージが処理不可 or 欠如しても困らないため設定していない ◦ => 想定内のエラー + リトライ不要な場合は acknowledgeする方針にしている Pub/Sub Subscriptionの注意点
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 RTDNを受け取る構成
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 RTDNを受け取る構成
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 RTDNを受け取る構成
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 メッセージはacknowledgeされない限り、リトライ対象となる RTDNを受け取る構成
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 メッセージはacknowledgeされると、subscriptionおよびtopicから破棄される RTDNを受け取る構成
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのpush型エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのpush型エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのpush型エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 主な処理 ◆ JWT認証
◆ messageのRTDN種別に応じた処理 Cloud Pub/Subのpush型エンドポイント
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 認証ヘッダーにエンコードされたJWTが含まれている ◆ header.payload.signature
と区切られている • header ... 電子署名のアルゴリズムについて • payload ... GCP サービスアカウントのemailクレームやaudクレームなど の情報 JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ https://cloud.google.com/pubsub/docs/push/?hl=ja#authentication_and_a uthorization JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証の呼び出し側
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ message.dataに以下3種類のうちどれか1つが排他的に含まれている ◆ subscriptionNotification
… 定期購入型の場合 ◆ oneTimeProductNotification … 買い切り型の場合 ◆ testNotification … テスト用。Google Play Consoleからtest notificationを 使って通知出来る。 Cloud Pub/Subのtopic message
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのmessage受け取り
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Handlerのbase処理
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのmessage受け取り
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのmessage受け取り
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 SUBSCRIPTION_RENEWD
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ notificationType … 2
➔ 定期購入(≒月額課金)成功を意味する ➔ サーバ側はsubscriptionの状態に応じて、有効期限の延長処理を行う SUBSCRIPTION_RENEWED
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 - 更新の処理
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ IAB Subscriptionのacknowledgeは有り難い仕様 ➔
Google Play Developer API経由で取得できるsubscriptionは最新状態のみのた め、処理毎に履歴を保存しておくと良い ➔ Real Time Developer Notificationは便利 Conclusion
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 公式ドキュメント: Google Play
請求サービス ◆ https://developer.android.com/google/play/billing ➔ Re:ゼロから始める Play Billing Library ◆ https://speakerdeck.com/syarihu/re-zero-starting-uses-of-play-billing-l ibrary ➔ Google Play アプリ内定期購入を実装する ◆ https://techlife.cookpad.com/entry/2018/03/14/090000 参考資料
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Thank you
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 We’re hiring
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 付録
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Console
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscription毎の設定値
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Free trial ◆
新規購入者向けの無料期間の設定。 ➔ Introductory price ◆ 新規購入者向けの特別価格の設定。 Subscription毎の設定値
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Grace Period ◆
猶予期間の有効/無効設定 • ユーザが定期購入の支払いに失敗した場合、猶予期間の間は有料状態としてサービス を使い続けることが出来る(ようにサービス側は対応しなければならない)。 ➔ Resubscribe ◆ アプリ外購入の有効/無効設定 • 定期購入の有効期限切れ後、Google Play Store上(≒アプリ外)から新規購入が可能に なる。 Subscription毎の設定値
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscription毎の設定値
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 アプリ内全Subscriptionsへの共通設定値
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Pause ◆ 定期購入の一時停止機能の有効/無効設定
• 一時停止期間終了後に定期購入が再開する ➔ Free trial limit ◆ 無料期間の付与条件の設定 • One per subscription • One across all subscriptions アプリ内全Subscriptionsへの共通設定値
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscriptionの購入検証
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ テスト購入が行える仕組みのこと ◆ https://developer.android.com/google/play/billing/test
➔ 注意点 ◆ テスト購入ではGoogle Play Store上、pauseやresubscribeが有効になって いる • => そのため、subscriptionの設定値の反映確認は実購入で試した License Tester
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 監視
#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Pub/SubのDatadog integrationを使用
➔ 採用したメトリクスの種類 ◆ gcp.pubsub.subscription.oldest_unacked_message_age ◆ gcp.pubsub.subscription.num_unacked_messages_by_region ◆ gcp.pubsub.subscription.push_request_count ◆ gcp.pubsub.subscription.push_request_latencies.avg Google Cloud Pub/Subの監視