以下のQiitaで課金するまでの流れはなんとなくわかりましたが、その後に使うこれらのメソッドが良くわからないので、少し調べました。
簡単なGoogle Play Billing Libraryの課金の流れ
queryPurchases()とqueryPurchaseHistoryAsync()などはBillingClientクラスのメソッドです。
これらを使うと課金したもの(Purchase)についての情報を課金後に取得する事ができます。
ちょっとドキュメント読んでもピンとこなかったので調べてみました。
課金でトラブルがあっても責任はおえないため、自分で検証して確認してください
何かこうしたほうが良いなど、コメントあればください
それぞれの特徴
メソッド | 同期、非同期 | 未消費のPurchaseが"ない"とき | 未消費のPurchaseが"ある"とき | 同じアカウントの他の端末での変更 |
---|---|---|---|---|
queryPurchases(sku) : Purchase |
同期 | 何も取得できない | 消費していないPurchaseを取得できる | 反映されない |
queryPurchaseHistoryAsync(skuType) : List<Purchase> |
非同期 | Sku毎に最後に消費したPurchaseが取得できる | 消費していないPurchaseも含め、Sku毎にPurchaseを取得できる | 反映される |
課金したもの(Purchase)は消費(consume)することができます。課金後にconsumeAsync()を呼ぶことで、Purchaseを消費することができます。
消費していない間、PurchaseをGoogle Playが保持してくれていて、自社サービスのサーバーにちゃんと課金の反映できるまで消費しないということができます。
取得できるPurchaseの情報の違い
launchBillingFlow後のonPurchasesUpdated()で取得できるPurchase(危なそうなものは..で省略しています)
Purchase. Json: {"orderId":"GPA.33..46","packageName":"com.github.takahirom.hogehoge","productId":"item1","purchaseTime":1542021978243,"purchaseState":0,"purchaseToken":"gd..Ze"}
queryPurchases()で取得できるPurchase ("launchBillingFlow後のonPurchasesUpdated()で取得できるPurchase"と全く同じ)
Purchase. Json: {"orderId":"GPA.33..46","packageName":"com.github.takahirom.hogehoge","productId":"item1","purchaseTime":1542021978243,"purchaseState":0,"purchaseToken":"gd..Ze"}
queryPurchaseHistoryAsync()で取得できるPurchase
取得できている情報がぜんぜん違う。orderId
やpackageName
がない代わりに、productId
(SKU)やdeveloperPayload
がある。purchaseTokenはあるので、それは使える。
Purchase. Json: {"productId":"item1","purchaseToken":"gd..Ze","purchaseTime":1542021978243,"developerPayload":null}
データ削除して起動した時の挙動した時
未消費のPurchaseがないとき かつ アプリのデータ削除した時も、未消費のPurchaseがあるとき かつ アプリのデータ削除した時も、同じように取得可能。
まとめ
queryPurchases()
はカジュアルに未消費のPurchaseがあるかどうかを確認するのに使って消費を行い、
端末を変えたり、データ削除後の履歴を辿りたい時にqueryPurchaseHistoryAsync()
を使うと良さそうです。