はじめに
本記事は、Flutterの公式の課金ライブラリである in_app_purchase の restorePurchases メソッドを、Androidで使った際のハマリポイントをご紹介します。
restorePurchases メソッドとは
いわゆる「復元処理」の際に使えるメソッドで、未消費の課金データを取得できます。
Android側の実装は下記のところで行っています。
ちらっと中身を見てみると、Androidで BillingClient を使ったことがある人は見たことがあるであろう queryPurchases が使われているだろうことがわかります。
// 138行目
responses = await Future.wait([
billingClient.queryPurchases(SkuType.inapp),
billingClient.queryPurchases(SkuType.subs)
]);
ステータスが PurchaseStatus.restored に上書きされて返却される
そんな restorePurchases メソッドですが、意図的なのかバグなのかわかりませんが、通知される PurchaseDetails(購入情報のクラス)のステータスがすべて restored となっています。
↓ status に PurchaseStatus.restored を上書きしている箇所
Androidの場合、消費アイテムの後払い購入が可能なため、 restored になっていると、
- 購入が成功したもの(
purchased)が復元されたのか - 後払いのもの(
pending)が復元されたのか
が判断付かないことになってしまいます。
in_app_purchase の作り上、restorePurchases メソッドを呼んだ場合と、通常の購入フローで使う buyConsumable メソッドを呼んだ場合どちらも purchaseStream にイベントが流れてくるようになっているため、本来あるべきステータスで処理ができず問題になるケースもあるでしょう。
InAppPurchaseAndroidPlatformAdditionの queryPastPurchases メソッドを使う
上記の問題を回避しつつ復元を行う場合、InAppPurchaseAndroidPlatformAdditionの queryPastPurchases メソッドが有効です。
コードを見てみるとわかりますが restorePurchases メソッドとほぼ同じようなコードになっています。
主な違いとしては、
- ステータス(
status)を上書きしていない(※ 重要) QueryPurchaseDetailsResponseを返却する
というところでしょうか。
ステータスが上書きされていないので、購入が成功したもの( purchased )なら報酬の付与、後払いのもの( pending )ならその旨をUIで表示する、といった処理が可能となります。 ![]()
まとめ
restorePurchases メソッドではステータスが restored に上書きされること、その代わりとして InAppPurchaseAndroidPlatformAdditionの queryPastPurchases メソッドが使えることをご紹介しました。
この記事がなにかの参考になれば幸いです。