【Google】アプリ内課金の保留決済(後払い)の保留中はorderIdがnullになる
以前、Google Play Billing のアプリ内課金の PurchaseState について、以下の 3 種類について紹介しました。
・Android(getPurchaseState)
・Android(originalJson)
・purchase.products(API)
それとは別に、保留中の決済において、「orderId」が入ってこないケースが見受けられたので調べてみました。
orderIdが入ってこない(nullになる)ケース
orderId が null になるケースと言えば、これまでもプロモーション購入の場合については言及がありました。
しかし、保留決済で同様の事象になるのは初耳です。
っと思って Android のドキュメントを確認してみたら、orderId の説明に書かれていますね。
The order ID will be
Purchase.getOrderId()null
if the purchase is in thePurchase.PurchaseState.PENDING
state and populated if the purchase has transitioned to thePurchase.PurchaseState.PURCHASED
state.
保留中のoriginalJson
ちなみに保留中の originalJson の中身を確認すると以下の状態でした。
購入状態(purchaseState)は「4」になっていることで保留中は判断できます。
(ただし、公式ドキュメントには情報がない)
{
"packageName": "[パッケージ名]",
"productId": "[アイテムID]",
"purchaseTime": [購入日時],
"purchaseState": [購入状態],
"purchaseToken": "[購入トークン]",
"quantity": [数量],
"acknowledged": [承認状態]
}
また、その時の purchase.products の API のレシート検証結果が以下。
purchaseState は「2」で保留状態ですが、やはり orderId はありません。
{
"purchaseTimeMillis": "[購入日時]",
"purchaseState": [購入状態],
"consumptionState": [承認状態],
"developerPayload": "",
"purchaseType": [購入タイプ],
"acknowledgementState": [承認状態],
"kind": "androidpublisher#productPurchase",
"regionCode": "JP"
}
まとめ
保留中の決済の扱いは、それぞれプロジェクトによって方針が異なると思います。
ただ、orderId が含まれている前提でバリデーションなどを行っていると、想定していない挙動になってしまう可能性がありますね。
保留中から購入中にステータスが切り替わると、orderId が含まれてくるようなので、その状態でネイティブアプリから最新のレシートを受け取るなり、デベロッパー通知をトリガーにサーバサイドで API 実行するなりしましょう。