前回の続き。課金状態の確認の仕方(*´ω`*)
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されてるっぽい。
- EntitlementInfos class - entitlement_infos_wrapper library - Dart API
- EntitlementInfo class - entitlement_info_wrapper library - Dart API
Checking If A User Is Subscribed
CustomerInfo
とEntitlementInfo
を使った確認の仕方
// 対象の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 }
購入もトランザクションの同期もされていない場合、
CustomerInfo
がnull
になるので注意
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は無効になる
オフライン動作に関しては、以下のブログで詳しく書かれているっぽい。
以上!! 課金状況の確認は簡単だけど、考えることがいっぱいだ。。(*´ω`*)