【Google】AndroidとAPI(purchases.products)のPurchaseStateについて
Google のアプリ内課金において、後払いが可能な保留決済があります。
アイテム購入時にコンビニ決済などを選択すると、後からコンビニで決済したタイミングでアイテムが付与されるというものです。
決済手段が増えることはいいことなのですが、Google の購入状態を示す「PurchaseState」について気になることがあったので備忘録として残しておきます。
購入状態を表すオブジェクト
Google のアプリ内課金において、購入状態を表すオブジェクトがいくつか存在します。
Android のネイティブアプリ側では以下の 2 つ。
Purchase.PurchaseState
Purchase.OriginalJson.purchaseState
GooglePlay の Developer API に 1 つ。
purchases.products – purchaseState
それぞれについて見ていきましょう。
Purchase.PurchaseState
こちらは Android の「Purchase」オブジェクトにある PurchaseState。
以下のメソッド実行で取得することができます。
Purchase.getPurchaseState
結果は購入状況によって以下の通り。
購入中の場合は「1」、保留中は「2」という扱いですね。
値 | 内容 |
---|---|
0 | UNSPECIFIED_STATE |
1 | PURCHASED |
2 | PENDING |
公式のドキュメントも紹介しておきます。
Purchase.OriginalJson.purchaseState
次に購入の情報を表す「originalJsonString」
以下のメソッド実行で取得することができます。
Purchase.getOriginalJson
もしかすると、こちらのデータの方が馴染みがある方が多いかもしれません。
JSON 文字列を整形したのが以下の内容です。
{
"orderId": "GPA.xxxx-xxxx-xxxx-xxxxx",
"packageName": "[パッケージ名]",
"productId": "[アイテムID]",
"purchaseTime": [購入日時],
"purchaseState": [購入状態],
"purchaseToken": "[購入トークン]",
"quantity": [数量],
"acknowledged": [承認状態]
}
ここにも「purchaseState」があるのですが、取りうる値は以下の通り。
値 | 内容 |
---|---|
0 | Purchased |
1 | Canceled |
2 | |
3 | |
4 | Pending |
Purchased と Canceled は上記で間違いないと思うのですが、Pending 状態の originalJson の中身を確認すると purchaseState が「4」になっているのですよね。
てっきり保留中の決済は「2」になると思っていたのですが、実際に「2」と「3」が割り当てられるケースがあるのでしょうか。
こちらは、過去にはドキュメントで見た気がするのですが、現在はドキュメントに詳細の記載がありません。
現在は、以下の内容のみ。
Returns a String in JSON format that contains details about the purchase order.
念のため、スクリーンショットも残しておきましょう。
purchases.products – purchaseState
購入情報を取得する GooglePlay の API です。
Android で取得できる情報よりも少し詳細な情報まで確認できます。
こちらの「purchaseState」は、Android の getOriginalJson で取得できる文字列の中にあるものと同じようです。
値 | 内容 |
---|---|
0 | Purchased |
1 | Canceled |
2 | Pending |
以前から API リファレンスにも書かれている通りです。
どのpurchaseStateを判定に使うべきか
購入中なのか保留中なのか、それともキャンセルされたのか。
どのタイミングで、どの値を使ってチェックするか悩みますよね。
ちなみに保留中については、Google のドキュメントに以下の記載があります。
You should grant entitlement only when the state is
Integrate the Google Play Billing Library into your appPURCHASED
. UsegetPurchaseState()
instead ofgetOriginaljson()
and make sure to correctly handlePENDING
transactions.
originalJson ではなく、getPurchaseState を使えということですね。
ただ API の結果を元にサーバサイドで保留中の状態を確認する時は、originalJson と同じ「purchaseState」になるので、ややこしいですね。