Slide 1

Slide 1 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 三星祐也 @MITSUBOSHI 銀座Rails #37

Slide 2

Slide 2 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Company: Quipper Limited ➔ GitHub: MITSUBOSHI ➔ Twitter: Y_MITSUBOSHI self.introduce

Slide 3

Slide 3 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Play IABのサーバサイド対応情報があまり発信されていない ◆ Androidクライアントサイドの情報は多い ◆ Google公式の情報もサーバサイド側の話が少ない Motivation

Slide 4

Slide 4 text

#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イベント処理

Slide 5

Slide 5 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play IAB(In-App Billing)の仕様 01

Slide 6

Slide 6 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Playの課金システム ◆ ざっくり言うと、Androidスマホ・タブレットにおけるアプリ内決済 Google Play IAB(In-App Billing)とは

Slide 7

Slide 7 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ One-time products ➔ Subscriptions Google Play IAB(In-App Billing)の種類

Slide 8

Slide 8 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 買い切り型 ◆ consumable … 複数回購入可能 ● 例: ゲーム内通貨 ◆ non-consumable … 一度だけ購入可能 ● 例: 永久会員権, 電子書籍 One-time products

Slide 9

Slide 9 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 定期購入型 ◆ 例: 月額課金系のサービス Subscriptions

Slide 10

Slide 10 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 定期購入型 ◆ 例: 月額課金系のサービス ● => スタディサプリ 中学/高校/大学受験講座 Subscriptions

Slide 11

Slide 11 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ ユーザがIAB Subscriptionを購入してから3日以内に承認をしなかった場合、自動 返金される acknowledge

Slide 12

Slide 12 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ ユーザがIAB Subscriptionを購入してから3日以内に承認をしなかった場合、自動 返金される ➔ acknowledge方法 ◆ Androidクライアントライブラリ(PBL: Play Billing Library)経由 ◆ Google Play Developer API経由 acknowledge

Slide 13

Slide 13 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ ユーザがIAB Subscriptionを購入してから3日以内に承認をしなかった場合、自動 返金される ➔ acknowledge方法 ◆ Androidクライアントライブラリ(PBL: Play Billing Library)経由 ◆ Google Play Developer API経由 acknowledge

Slide 14

Slide 14 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ユーザがSubscription購入を試行 acknowledge

Slide 15

Slide 15 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscriptionの購入に成功 acknowledge

Slide 16

Slide 16 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権の付与に成功 + acknowledgeする acknowledge

Slide 17

Slide 17 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権の付与に失敗 + acknowledgeしない acknowledge

Slide 18

Slide 18 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 購入から3日後に自動返金される acknowledge

Slide 19

Slide 19 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ IAB Subscriptionの購入(申し込み) + サービス側の役務提供の開始 (acknowledge)の2つを以って、定期購入開始とする acknowledge

Slide 20

Slide 20 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play IAB(In-App Billing)の対応 方針と設計 02

Slide 21

Slide 21 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 obfuscatedExternalAccountId

Slide 22

Slide 22 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 IAB Subscriptionとユーザの紐付け

Slide 23

Slide 23 text

#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とユーザの紐付け

Slide 24

Slide 24 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 サーバ側からSubscriptionの状態を取得する方法

Slide 25

Slide 25 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Play Developer API ➔ Androidクライアント経由でのレシート情報取得 ➔ Real Time Developer Notification サーバ側からSubscriptionの状態を取得する方法

Slide 26

Slide 26 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API

Slide 27

Slide 27 text

#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

Slide 28

Slide 28 text

#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の最新状態の取得

Slide 29

Slide 29 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscriptionの最新状態の取得

Slide 30

Slide 30 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 注意点 ◆ リクエスト時点のsubscription情報しか取得できない ● => 過去時点のsubscription状態を把握したいケースがある場合は、細かく記録しておく ことが重要 Subscriptionの最新状態の取得

Slide 31

Slide 31 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ gem 'google-apis-androidpublisher_v3' Google Play Developer API

Slide 32

Slide 32 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント経由でのレシート情報取得

Slide 33

Slide 33 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Play Billing Library(PBL)経由でレシート情報を取得可能 ◆ https://developer.android.com/reference/com/android/billingclient/a pi/Purchase Androidクライアント経由でのレシート情報取得

Slide 34

Slide 34 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント経由でのレシート情報取得

Slide 35

Slide 35 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ expiryTimeMillis (有効期限)の値を知るためにはGoogle Play Developer APIを 利用する必要がある Androidクライアント経由でのレシート情報取得

Slide 36

Slide 36 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Real Time Developer Notification

Slide 37

Slide 37 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Subscriptionの状態変化毎に通知を受け取ることが出来る機構 ◆ Google Cloud Pub/Subを利用する必要がある ◆ 受け取るメッセージにはsubscriptionの詳細情報は含まれていないため、 Google Play Developer APIを利用する必要がある ➔ 以降は、RTDNと略します Real Time Developer Notification

Slide 38

Slide 38 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 エンドポイント設計

Slide 39

Slide 39 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ サーバサイドの主な役割 ◆ 購入されたsubscriptionの状態に従って、ユーザに適切なコンテンツ/サービ スの利用権を付与する エンドポイント設計

Slide 40

Slide 40 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入 … Androidクライアント間 ➔ 新規購入以外 … RTDN間 エンドポイント設計

Slide 41

Slide 41 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入 … Androidクライアント間 ◆ 理由: subscriptionの新規購入はアプリ内での操作であるため(+ ユーザに同 期的にフィードバックをしたい) エンドポイント設計

Slide 42

Slide 42 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入以外 … RTDN間 ◆ 理由: subscriptionの新規購入以外はアプリ外での操作/状態変化であるた め(例: 解約, 再開, 月額更新, 猶予期間) エンドポイント設計

Slide 43

Slide 43 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 DB設計

Slide 44

Slide 44 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 DB設計

Slide 45

Slide 45 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 役割 ◆ サービスが提供するsubscriptionのマスタデータ ➔ fields ◆ package_name … Android app固有の一意な識別子 (別名: applicationId) ◆ product_id … サービスが提供するsubscription毎に一意な識別子(別名: SKU or subscriptionId) GooglePlayIabPackage

Slide 46

Slide 46 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 役割 ◆ 各subscriptionの管理用 ● ※subscriptionの有効期限等は関連のpaymentに同期させている ➔ fields ◆ purchase_token … ユーザが購入したsubscription毎の一意な識別子 ◆ google_play_iab_package_id ◆ payment_id GooglePlayIabReceipt

Slide 47

Slide 47 text

#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

Slide 48

Slide 48 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント間との処理 03

Slide 49

Slide 49 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 定期購入開始用エンドポイント

Slide 50

Slide 50 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 定期購入開始用エンドポイント ➔ 復元用エンドポイント エンドポイントの種類

Slide 51

Slide 51 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 定期購入開始用エンドポイント

Slide 52

Slide 52 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入のフロー

Slide 53

Slide 53 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Subscription購入後に、定期購入開始用エンドポイントへリクエストする 新規購入のフロー

Slide 54

Slide 54 text

#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() 定期購入開始用エンドポイント

Slide 55

Slide 55 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 主な処理の流れ ◆ 署名検証 ◆ subscriptionの最新状態の取得 + 検証 ◆ 利用権付与 + acknowledge処理 定期購入開始用エンドポイント

Slide 56

Slide 56 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証

Slide 57

Slide 57 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Androidクライアント経由でのレシート情報取得

Slide 58

Slide 58 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 定期購入開始用エンドポイント

Slide 59

Slide 59 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証

Slide 60

Slide 60 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証 LICENSE PUBLIC KEYはGoogle Play Consoleから取得出来る。 Base64エンコードされているため、デコードする。

Slide 61

Slide 61 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証 signatureもBase64エンコードされているため、デコードする。

Slide 62

Slide 62 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証 => true/false

Slide 63

Slide 63 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証の呼び出し側

Slide 64

Slide 64 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 署名検証の呼び出し側

Slide 65

Slide 65 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの最新状態の取得

Slide 66

Slide 66 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ gem 'google-apis-androidpublisher_v3' を拡張 Google Play Developer API

Slide 67

Slide 67 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ gem 'google-apis-androidpublisher_v3' を拡張 Google Play Developer API

Slide 68

Slide 68 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜

Slide 69

Slide 69 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API

Slide 70

Slide 70 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API

Slide 71

Slide 71 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API

Slide 72

Slide 72 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証

Slide 73

Slide 73 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 IAB Subscriptionの検証

Slide 74

Slide 74 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証

Slide 75

Slide 75 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証

Slide 76

Slide 76 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 subscriptionの検証

Slide 77

Slide 77 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜

Slide 78

Slide 78 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権付与 + acknowledge処理

Slide 79

Slide 79 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Developer API

Slide 80

Slide 80 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 復元用エンドポイント

Slide 81

Slide 81 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 利用権の付与に失敗 + acknowledgeしない 復元用エンドポイント

Slide 82

Slide 82 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Google Play側の購入状態とサービス側の利用権状態がズレているとき ◆ a) Google Play側の購入状態(有) + Quipperの利用権状態(無)の場合 ● a-1) 対応するGooglePlayIabReceiptが存在しない(≒ 1回も利用権が付 与出来ていない) ● a-2) 対応するGooglePlayIabReceiptが存在する(≒ 最低1回は利用権 が付与出来ている) 復元の定義

Slide 83

Slide 83 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Endpoint: POST /api/v1/android/iab/subscriptions/restore ➔ Request parameter: ◆ receipt … クライアントが取得可能な購入情報を含むデータ ◆ signature … 購入情報を含むreceiptを開発者用の秘密鍵で署名したもの ※定期購入開始用エンドポイントと同じ 復元用エンドポイント

Slide 84

Slide 84 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 主な処理の流れ ◆ 署名検証 ◆ GooglePlayIabReceiptの有無の確認 ◆ subscriptionの最新状態の取得 + 検証 ◆ 利用権付与 + acknowledge処理 復元用エンドポイント

Slide 85

Slide 85 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜

Slide 86

Slide 86 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 復元用エンドポイント

Slide 87

Slide 87 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subを用いたRTDNイベント処 理 04

Slide 88

Slide 88 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 新規購入以外 … RTDN間 ◆ 理由: subscriptionの新規購入以外はアプリ外での操作/状態変化であるた め(例: 解約, 再開, 月額更新, 猶予期間) エンドポイント設計 (思い出し)

Slide 89

Slide 89 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ フルマネージドのメッセージングサービス ➔ Real Time Developer Notificationを受け取るために利用が必要 Google Cloud Pub/Subとは

Slide 90

Slide 90 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Topic ◆ Publisherがメッセージ(≒ queue)を送信する窓口 ◆ 複数のsubscriptionを紐付けさせることが出来る ◆ 関連付けられたすべてのsubscriptionで対象メッセージがacknowledgeされた時点でメッ セージを破棄する ➔ Subscription ◆ Subscriberがメッセージ(≒ queue)を受け取る窓口 ◆ 対象メッセージがacknowledgeされた時点でメッセージを破棄する Google Cloud Pub/Sub TopicとSubscription

Slide 91

Slide 91 text

#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方法

Slide 92

Slide 92 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ At-Least-Once delivery ◆ 同じメッセージが1回以上配信されることを考慮する必要がある ● => 処理の冪等性 ➔ エラーの処理方針 ◆ Exponential Backoff ◆ Dead letter topic ● RTDNの場合は最悪メッセージが処理不可 or 欠如しても困らないため設定していない ○ => 想定内のエラー + リトライ不要な場合は acknowledgeする方針にしている Pub/Sub Subscriptionの注意点

Slide 93

Slide 93 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 RTDNを受け取る構成

Slide 94

Slide 94 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 RTDNを受け取る構成

Slide 95

Slide 95 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 RTDNを受け取る構成

Slide 96

Slide 96 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 メッセージはacknowledgeされない限り、リトライ対象となる RTDNを受け取る構成

Slide 97

Slide 97 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 メッセージはacknowledgeされると、subscriptionおよびtopicから破棄される RTDNを受け取る構成

Slide 98

Slide 98 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのpush型エンドポイント

Slide 99

Slide 99 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのpush型エンドポイント

Slide 100

Slide 100 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのpush型エンドポイント

Slide 101

Slide 101 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 主な処理 ◆ JWT認証 ◆ messageのRTDN種別に応じた処理 Cloud Pub/Subのpush型エンドポイント

Slide 102

Slide 102 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証

Slide 103

Slide 103 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ 認証ヘッダーにエンコードされたJWTが含まれている ◆ header.payload.signature と区切られている ● header ... 電子署名のアルゴリズムについて ● payload ... GCP サービスアカウントのemailクレームやaudクレームなど の情報 JWT認証

Slide 104

Slide 104 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ https://cloud.google.com/pubsub/docs/push/?hl=ja#authentication_and_a uthorization JWT認証

Slide 105

Slide 105 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証

Slide 106

Slide 106 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証

Slide 107

Slide 107 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証

Slide 108

Slide 108 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証

Slide 109

Slide 109 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証

Slide 110

Slide 110 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 JWT認証の呼び出し側

Slide 111

Slide 111 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message

Slide 112

Slide 112 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message

Slide 113

Slide 113 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message

Slide 114

Slide 114 text

#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

Slide 115

Slide 115 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのtopic message

Slide 116

Slide 116 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜

Slide 117

Slide 117 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜

Slide 118

Slide 118 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのmessage受け取り

Slide 119

Slide 119 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Handlerのbase処理

Slide 120

Slide 120 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのmessage受け取り

Slide 121

Slide 121 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Cloud Pub/Subのmessage受け取り

Slide 122

Slide 122 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 SUBSCRIPTION_RENEWD

Slide 123

Slide 123 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ notificationType … 2 ➔ 定期購入(≒月額課金)成功を意味する ➔ サーバ側はsubscriptionの状態に応じて、有効期限の延長処理を行う SUBSCRIPTION_RENEWED

Slide 124

Slide 124 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 - 更新の処理

Slide 125

Slide 125 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ IAB Subscriptionのacknowledgeは有り難い仕様 ➔ Google Play Developer API経由で取得できるsubscriptionは最新状態のみのた め、処理毎に履歴を保存しておくと良い ➔ Real Time Developer Notificationは便利 Conclusion

Slide 126

Slide 126 text

#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 参考資料

Slide 127

Slide 127 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Thank you

Slide 128

Slide 128 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 We’re hiring

Slide 129

Slide 129 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 付録

Slide 130

Slide 130 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Google Play Console

Slide 131

Slide 131 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscription毎の設定値

Slide 132

Slide 132 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Free trial ◆ 新規購入者向けの無料期間の設定。 ➔ Introductory price ◆ 新規購入者向けの特別価格の設定。 Subscription毎の設定値

Slide 133

Slide 133 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Grace Period ◆ 猶予期間の有効/無効設定 ● ユーザが定期購入の支払いに失敗した場合、猶予期間の間は有料状態としてサービス を使い続けることが出来る(ようにサービス側は対応しなければならない)。 ➔ Resubscribe ◆ アプリ外購入の有効/無効設定 ● 定期購入の有効期限切れ後、Google Play Store上(≒アプリ外)から新規購入が可能に なる。 Subscription毎の設定値

Slide 134

Slide 134 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscription毎の設定値

Slide 135

Slide 135 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 アプリ内全Subscriptionsへの共通設定値

Slide 136

Slide 136 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ Pause ◆ 定期購入の一時停止機能の有効/無効設定 ● 一時停止期間終了後に定期購入が再開する ➔ Free trial limit ◆ 無料期間の付与条件の設定 ● One per subscription ● One across all subscriptions アプリ内全Subscriptionsへの共通設定値

Slide 137

Slide 137 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 Subscriptionの購入検証

Slide 138

Slide 138 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 ➔ テスト購入が行える仕組みのこと ◆ https://developer.android.com/google/play/billing/test ➔ 注意点 ◆ テスト購入ではGoogle Play Store上、pauseやresubscribeが有効になって いる ● => そのため、subscriptionの設定値の反映確認は実購入で試した License Tester

Slide 139

Slide 139 text

#ginzarails Google Play IAB(In-App Billing) 〜Railsでのサーバサイド対応のすべて〜 監視

Slide 140

Slide 140 text

#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の監視