くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

RevenueCat入門 その11 | 課金状態を確認する

前回の続き。課金状態の確認の仕方(*´ω`*)

Checking Subscription Status

Get User Information

基本的に、CustomerInfoに現在の顧客情報が詰まっているっぽい。

取得の仕方はこんな感じ。キャッシュされているので、
ほとんどの場合、インタネット経由で取得しないっぽい。

try {
  CustomerInfo customerInfo = await Purchases.getCustomerInfo();
  // access latest customerInfo
} on PlatformException catch (e) {
  // Error fetching customer info
}

WORKING WITH THE CACHE

キャッシュの動作。基本的にキャッシュから取得し、
以下の場合、5分以上の古いキャッシュのときは更新する

  • getCustomerInfo()を呼び出したとき
  • 購入(purchase)をおこなったとき
  • 購入の復元(restore purchases)をおこなったとき

基本的には、プランの機能にある権限チェックをする場合は、
getCustomerInfo()を呼び出す形がよい

CustomerInfoのなかみ

  • Request Date
    • サーバからの取得日時
  • Original App User ID
    • 元のApp User ID
    • aliasがあると異なる?
  • First Seen
    • RevenueCatで最初に確認された日付
    • ほとんどの場合は、インストール日付
  • Original Application Version(iOS only)
    • インストールしたアプリの最初のバージョン番号
    • 購入や復元されるまでnil、sandboxでは常に1.0
    • 既存のサブスクからRevenueCatへの移行時用?
  • Original Purchase Date(iOS only)
    • 最初の購入日。レシートがない場合はnil
    • 既存のサブスクからRevenueCatへの移行時用?
  • Management URL
    • ユーザ自身のサブスク管理のURL
    • App StoreもしくはPlay Storeを表示
    • Stripeの場合は、管理URLはなし
    • 有効なサブスクがない場合はnull
  • All Purchased Product Identifiers
    • ユーザが購入したProduct IDの一覧
    • 有効期限は考慮しない
  • Non Consumable Purchases
    • ユーザが購入した非消耗型のProduct IDの一覧
  • Active Subscriptions
    • 有効なサブスクのProduct IDの一覧
    • entitlement経由での取得が必要
  • Entitlements
    • サブスクの状態など、Entitlement(権限)情報
    • EntitlementInfoオブジェクトを使う

CustomerInfoクラスを見てみると、
latestExpirationDateなどドキュメントにないのもあるよう

EntitlementInfoの中身

  • Identifier
    • entitlementのID
  • Product Identifier
    • 権利を解除したもととなるProductのID
  • Is Active
    • entitlementが有効かどうか
  • Will Renew
    • 自動更新かどうか。ストアの状態と数時間ずれる場合も
  • Period Type
    • 期間のタイプ(Normal/Trial/Introなど)
  • Latest Purchase Date
    • 最新の購入日、もしくは、更新日
  • Original Purchase Date
    • 最初の購入日
  • Expiration Date
    • entitlementの有効期限
    • 永久の場合はnull
    • トライアルの場合は、トライアルの有効期限日
  • Store
    • entitlementを有効にしたストア(App Store/Play Storeなど)
  • Is Sandbox
    • sandboxでの購入で有効になったかどうか
  • Unsubscribe Detected At
    • 購読の解除が検出された日
    • entitlementの無効になった日ではない
    • ストアの状態と数時間ずれる場合も
    • Platform Server Notificationsの設定でズレが減る
  • Billing Issue Detected At
    • 支払い/請求の問題が検出された日付
    • 問題が解消されるとnullになる
    • entitlementの無効になった日ではない
    • ストアの状態と数時間ずれる場合も
    • Platform Server Notificationsの設定でズレが減る

該当のクラスは以下。EntitlementInfosでwrapされてるっぽい。

Checking If A User Is Subscribed

CustomerInfoEntitlementInfoを使った確認の仕方

// 対象のentitlementが有効かどうか
if (customerInfo.entitlements.all[<my_entitlement_identifier>].isActive) {
  // Grant user "pro" access
}

// 複数のentitlementがある場合、1つでもentitlementが有効かどうか
if (customerInfo.entitlements.active.isNotEmpty) {
  //user has access to some entitlement
}

購入もトランザクションの同期もされていない場合、
CustomerInfonullになるので注意

Listening For CustomerInfo Updates

CustomerInfoの更新をListenする(受け取る)方法はこんな感じ。
RevenueCatサーバ側からはpushされないので注意。
キャッシュが更新されたときにだけ、受け取るっぽい?

Purchases.addCustomerInfoUpdateListener((info) {
    // handle any changes to customerInfo
}

Getting subscription status via the REST API

REST APIもあるので、バックエンドサーバなどからでも取得できる
Cloud Functionとかだとこっち?

curl --request GET \
  --url https://api.revenuecat.com/v1/subscribers/app_user_id \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer PUBLIC_API_KEY'

Handling Refunds

返金対応。
RevenueCatでは、定期購読/非定期購読の課金アイテムの払い戻しに対応しているらしい。
返金を検出すると、CustomerInfoが更新される。

以下の質問スレッドが参考になるとのこと

この記事を見ると、各ストアで異なる。

  • Apple
    • Appleで返金処理(開発者は返金できない)
    • RevenueCatが検知、CustomerInfoを更新
  • Play Store
    • RevenueCatの管理画面上で返金を実行
    • ストアからもできるが、おすすめではないっぽい
  • Stripe
    • Stripeの管理画面から返金を実行
    • RevenueCatが検知、CustomerInfoを更新

「RevenueCatバックエンドからSDKにpushしない」
とあるので、即時反映させるにはFCMなど別の手段が必要かも

Offline Entitlements

RevenueCatサーバが応答しない場合でも、
SDKがストアの購入を検証し、一時的にEntitlementsを付与するらしい。

RevenueCatサーバがエラーになると、オフラインで動作するように切り替わり、
RevenueCatサーバが復旧すると、オンライン動作に戻るよう。

オフラインでも動作するように、 ProductsやEntitlementsは、SDKでキャッシュしている。

Some things to note

いくつかの注意点

  • オフライン動作後、オンラインに戻ると自動で同期される
  • オフライン中の購入は、同期されるまでチャートなどに表示されない
  • オフライン中の購入は、その端末のみ有効
  • オフライン中の購入は、非定期購読には対応していない
  • Ovserver Modeを使用するとオフラインEntitlementsは無効になる

オフライン動作に関しては、以下のブログで詳しく書かれているっぽい。


以上!! 課金状況の確認は簡単だけど、考えることがいっぱいだ。。(*´ω`*)