スマホ

GoogleInappBilling(Androidアプリ月額課金)のレシート検証について

前回、GooglePlay(Android)の都度課金についてまとめてみましたが、最近は月額課金のサービスが多くなり、都度課金以上に需要が増えてきています。

GoogleInappBilling(Androidアプリ都度課金)のレシート検証についてスマホのアプリ内課金は、ゲームのポイントのような都度課金や、音楽聞き放題のような月額のサブスクリプション含め当たり前の機能となってきまし...

シンプルに 1 種類だけの月額プランを提供しているサービスもあれば、値段別に複数のプランを用意している複雑なサービスもあります。

前者であれば実装や運用も少しは楽になりそうですが、後者の場合はプランのアップグレードやダウングレードなど考慮する点が増え煩雑になります。

今後の月額課金の実装に向けて、今回は事前調査した内容をまとめておきたいと思います。

設計や実装を進める中で、新しい内容で置き換えていきたいと思います

Androidアプリのガイド

今回はネイティブの実装には大きく触れませんが、まずは Android のネイティブアプリの実装向けのガイドラインや仕様です。。

プランのアップグレードとダウングレード

冒頭でも触れたように、複数のプランを用意する場合はアップグレードやダウングレードを考慮しておかなければいけません。

Google 側で、現在の定期購入の未使用分を新しい定期購入に柔軟に移行してくれるようですが、お問い合わせや FAQ など、ユーザへの説明の必要性も出てくるので運用する側もしっかりと理解しておく必要があります。

少しややこしいですが、例えば月額 500 円のコンテンツを購読していて、半月後に月額 1000 円のプランに変更したとします。

この時、現在の月額コンテンツは停止となり、残し半月分(250円相当)が新しいプランへ適用となります。

ただし 250 円相当なので、新しいプランが利用できるのは月額 1000 円の 4 分の 1 にあたる 7 日程度です。

この期間が過ぎると新しいプランの課金が継続となり、月額 1000 円でコンテンツが楽しめるようになります。

ユーザにとってもコンテンツ提供側にとっても損になっていないので、ここは GooglePlay のいいところですね。

月額課金のレシート検証

都度課金の時と同じく、月額のコンテンツを購入すると GooglePlay からレシートデータ発行されます。

これをネイティブアプリから受け取り、サーバサイド側で Google のレシート検証 API で整合性チェックと詳細な情報の取得を行います。

[レシート検証API]
Purchases.subscriptions

都度課金と被りますが、確認するのは大きく 4 つ。

  • 対象プロダクトコードの一致
  • 電子署名のチェック
  • レシート検証 API でレスポンスが返る
  • 購読状態が継続で有効期限内である

API のレスポンスとして返ってきた内容のうち、主に以下の項目が重要になってきます。

{
“kind”: “androidpublisher#subscriptionPurchase”,
“startTimeMillis”: long,
“expiryTimeMillis”: long,
“autoRenewing”: boolean,
“paymentState”: integer,
“cancelReason”: integer,
“userCancellationTimeMillis”: long,
“orderId”: string,
“linkedPurchaseToken”: string,
“purchaseType”: integer,
}

購読期間が startTimeMillis と expiryTimeMillis、自動購読のステータスが autoRenewing になります。

月額の更新処理の際には、この辺りの情報が参考になってきそうです。

paymentState については、0 の「支払い保留」になった時は決済に失敗している可能性が高いので、猶予期間を過ぎても決済が完了しない場合は購読停止とします。

1 の「支払済」や 2 の「無料トライアル」についてはスルーして大丈夫そうです。

以前はなかったようですが、3 で「保留中のアップグレード/ダウングレード」が追加されているので、これは別途考える必要がありそうですね。

また、都度課金と同じくテストユーザによる購入の場合は purchaseType が 0 になります。