技術系TIPS
PR

【Google】AndroidとAPI(purchases.products)のPurchaseStateについて

saratogax
記事内に商品プロモーションを含む場合があります

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」という扱いですね。

内容
0UNSPECIFIED_STATE
1PURCHASED
2PENDING

公式のドキュメントも紹介しておきます。

Purchase.OriginalJson.purchaseState

次に購入の情報を表す「originalJsonString

以下のメソッド実行で取得することができます。

Purchase.getOriginalJson

もしかすると、こちらのデータの方が馴染みがある方が多いかもしれません。

JSON 文字列を整形したのが以下の内容です。

{
  "orderId": "GPA.xxxx-xxxx-xxxx-xxxxx",
  "packageName": "[パッケージ名]",
  "productId": "[アイテムID]",
  "purchaseTime": [購入日時],
  "purchaseState": [購入状態],
  "purchaseToken": "[購入トークン]",
  "quantity": [数量],
  "acknowledged": [承認状態]
}

ここにも「purchaseState」があるのですが、取りうる値は以下の通り。

内容
0Purchased
1Canceled
2
3
4Pending

Purchased と Canceled は上記で間違いないと思うのですが、Pending 状態の originalJson の中身を確認すると purchaseState が「4」になっているのですよね。

てっきり保留中の決済は「2」になると思っていたのですが、実際に「2」と「3」が割り当てられるケースがあるのでしょうか。

Google Billing Library5 までは保留中の時も 0 が入ってきていると思うのですが、この辺の正しい情報が欲しいところですね。

こちらは、過去にはドキュメントで見た気がするのですが、現在はドキュメントに詳細の記載がありません。

現在は、以下の内容のみ。

Returns a String in JSON format that contains details about the purchase order.

念のため、スクリーンショットも残しておきましょう。

AndroidとAPI(purchases.products)のPurchaseStateについて Purchase.OriginalJson.purchaseState

purchases.products – purchaseState

購入情報を取得する GooglePlay の API です。

Android で取得できる情報よりも少し詳細な情報まで確認できます。

こちらの「purchaseState」は、Android の getOriginalJson で取得できる文字列の中にあるものと同じようです。

内容
0Purchased
1Canceled
2Pending

以前から API リファレンスにも書かれている通りです。

AndroidとAPI(purchases.products)のPurchaseStateについて purchases.products - purchaseState

どのpurchaseStateを判定に使うべきか

購入中なのか保留中なのか、それともキャンセルされたのか。

どのタイミングで、どの値を使ってチェックするか悩みますよね。

ちなみに保留中については、Google のドキュメントに以下の記載があります。

You should grant entitlement only when the state is PURCHASED. Use getPurchaseState() instead of getOriginaljson() and make sure to correctly handle PENDING transactions.

Integrate the Google Play Billing Library into your app

originalJson ではなく、getPurchaseState を使えということですね。

ただ API の結果を元にサーバサイドで保留中の状態を確認する時は、originalJson と同じ「purchaseState」になるので、ややこしいですね。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました