Android
課金
GooglePlay
定期購読
Subscription

GooglePlay定期購読でのアップグレード/ダウングレード Part2

GooglePlay定期購読のアップグレード/ダウングレードの仕様についてPart2です。
サーバ側でアップグレード/ダウングレードしたのかをどうやって判断するのかについてのまとめとなります。
Part1はこちら :arrow_right: GooglePlay定期購読でのアップグレード/ダウングレード Part1

サーバ側での課金状態取得

GoogleAPIを利用して現在の課金状態を取得します。
https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get

前提知識

Googleではアップグレード/ダウングレード時または再購読時にはpurchaseTokenとorderIdは新たに発行されます。

結果取得できるレスポンスの一部は以下の通りです。
(すべてのレスポンス内容は公式ドキュメントを参照)

Key 詳細
startTimeMillis 商品が購入された時間を1970年1月1日から始まるミリ秒で表す。
expiryTimeMillis 期限切れになるまでの時間(ミリ秒)。
autoRenewing 自動更新が有効かどうかを表す。trueの場合は自動更新購読が有効で、次の課金日に自動的に更新されます。falseの場合はユーザーが自動更新購読をキャンセルしたことを示します。
paymentState 注文の購入状況。
0:支払保留中
1:支払い済み
2:無料トライアル
自動更新がOFF(autoRenewing:false)かつ有効期限も切れている場合はKey自体ない。
orderId 購入に関連付けられた最新の定期注文の注文ID。
cancelReason 自動更新購読をキャンセルした or 有効期限が切れた理由。

0: ユーザーが定期購入をキャンセルした
1:システムによってキャンセルされた(請求ができなかった等)
2:新しいサブスクリプションに置き換えられた(アップグレード/ダウングレードや、再購読した等)
3:開発者によってキャンセルした
userCancellationTimeMillis cancelReasonが0の場合のみ入る。自動更新をキャンセルしたときの時間(ミリ秒)。
linkedPurchaseToken この購読に紐づく購読情報となる。パターンは2つ。
1. アップグレード/ダウングレードした場合、アップグレード/ダウングレード前のpurchaseTokenとなる。
2. ある購読を有効期限内にPlayストアでキャンセルする。その購読の有効期限内に再購読をするとキャンセルした購読のpurchaseTokenとなる。

アップグレード/ダウングレードかどうかを見極めるには

金額 アイテム 期間      
300円 アイテムA 1ヶ月      
600円 アイテムB 1ヶ月      

アイテムAからBに変更した場合とします。
:one: Aを4/1に登録すると、次の更新日は5/1となる。このときの課金状態は以下となる(purchaseTokenをAAAとする)

Key 詳細
startTimeMillis 2018/4/1 xx:xxをミリ秒で表す。
expiryTimeMillis 2018/5/1 xx:xxをミリ秒で表す。
autoRenewing true
paymentState 1
orderId 購入に関連付けられた最新の定期注文の注文ID。

:two: 4/10にBに乗り換える。この時点でBに変更となる。次の更新日は4/20となる。(Bで購入したpurchaseTokenをBBBとする※)
このときのAの課金状態は以下となる

Key 詳細
startTimeMillis 2018/4/1 xx:xxをミリ秒で表す。
expiryTimeMillis 2018/4/10 xx:xxをミリ秒で表す。乗り換えを実施した時間となる。
autoRenewing false
cancelReason 2

このときのBの課金状態は以下となる

Key 詳細
startTimeMillis 2018/4/10 xx:xxをミリ秒で表す。乗り換えを実施した時間となる。
expiryTimeMillis 2018/5/20 xx:xxをミリ秒で表す。
autoRenewing true
paymentState 1
linkedPurchaseToken アップグレード前のpurchaseTokenとなるので「AAA」となる。

linkedPurchaseTokenがある時点で、再購読かアップグレードかダウングレードは確定となる。
あとはlinkedPurchaseTokenとサーバ側で保持しているデータを参照してどのアイテムからどのアイテムへの変更なのかを検証できればよさそう。またlinkedPurchaseTokenの課金状態のcancelReasonを見てもわかりそうですね。

まとめ

linkedPurchaseTokenを使えばどういった課金の変更なのかを追えて便利ですね:sparkles: