技術系TIPS
PR

【Google】アプリ内課金の保留決済(後払い)の保留中はorderIdがnullになる

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

以前、Google Play Billing のアプリ内課金の PurchaseState について、以下の 3 種類について紹介しました。

・Android(getPurchaseState)
・Android(originalJson)
・purchase.products(API)

それとは別に、保留中の決済において、「orderId」が入ってこないケースが見受けられたので調べてみました。

あわせて読みたい
【Google】AndroidとAPI(purchases.products)のPurchaseStateについて
【Google】AndroidとAPI(purchases.products)のPurchaseStateについて

orderIdが入ってこない(nullになる)ケース

orderId が null になるケースと言えば、これまでもプロモーション購入の場合については言及がありました。

あわせて読みたい
【Google】アプリ内アイテムの購入と消費状態の取得をPHPとKotlinで実現する
【Google】アプリ内アイテムの購入と消費状態の取得をPHPとKotlinで実現する

しかし、保留決済で同様の事象になるのは初耳です。

っと思って Android のドキュメントを確認してみたら、orderId の説明に書かれていますね。

The order ID will be null if the purchase is in the Purchase.PurchaseState.PENDING state and populated if the purchase has transitioned to the Purchase.PurchaseState.PURCHASED state.

Purchase.getOrderId()

保留中の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 実行するなりしましょう。

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