【Google】無効(返金やチャージバック)となった購入の情報をリアルタイムに通知で取得する
GooglePlay のアプリ内課金で無効扱いになった購入。
「voidedpurchases」の API を利用すると取得できるのですが、発生頻度が少ないのに定期的にチェックするのはリソースがもったいない。
っとみんな思っていたと思いますが、2023 年 11 月に、ついにデベロッパー通知に対応されました。
今回は、デベロッパー通知の内容とハンドリングを紹介していきます。
voidedPurchaseNotification
新しくデベロッパー通知に追加されたのは「voidedPurchaseNotification」で、無効な購入が発生した場合は、既存の通知メッセージの最初の階層に設定されます。
{
"version": string,
"packageName": string,
"eventTimeMillis": long,
"oneTimeProductNotification": OneTimeProductNotification,
"subscriptionNotification": SubscriptionNotification,
"voidedPurchaseNotification": VoidedPurchaseNotification,
"testNotification": TestNotification
}
VoidedPurchaseNotification オブジェクトの中身は以下の通りで、無効となった理由などは含まれないので、詳細を知りたい場合は voidedpurchases の API 実行が別途必要です。
{
"version": string,
"packageName": string,
"eventTimeMillis": string,
"voidedPurchaseNotification": {
"purchaseToken": string,
"orderId": string,
"productType": integer
}
}
voidedpurchases API
voidedpurchases API では以下の情報が取得できますが、取得時のリクエストパラメータに orderId や purchaseToken を指定できないので面倒です。
{
"kind": string,
"purchaseToken": string,
"purchaseTimeMillis": string,
"voidedTimeMillis": string,
"orderId": string,
"voidedSource": integer,
"voidedReason": integer
}
基本的には、一定期間に発生した無効な購入情報を取得してきてデータベースなどに蓄積しておき、それを検索できるようにしておくのが楽でしょうか。
この voidedpurchases API はバッチのような形で、特定の期間に発生した無効な購入を定期的するだけの役割にしておくのがベターでしょう。
定期購入(サブスクリプション)は、無効となった場合にサブスクリプションのデベロッパー通知で検知できるので、ここで無理に取得しなくてもいいかなと思います。
まとめ
GooglePlay のアプリ内課金で無効となった購入について紹介してきました。
ようやくデベロッパー通知に対応しましたが、詳細な情報は API を実行しないと取得できないので少し手間ですが、プル型の仕組みから卒業できることと、リアルタイム性が出たのはいいことでしょう。
発表があったタイミングで既に送られてくるようになっていましたが、通知メッセージの JSON パース結果を厳密に見ていたら危ないところでした。
今後も他の通知パターンが追加されることを念頭に置いて設計しておきたいですね。