LoginSignup
16

More than 3 years have passed since last update.

iOS定期購読課金 アップグレード/ダウングレード Part2

Last updated at Posted at 2018-11-29

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

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

レシート検証を行い、レシートからなにが行われたのかを見ます。
https://developer.apple.com/jp/documentation/General/ValidateAppStoreReceipt/Introduction.html#//apple_ref/doc/uid/TP40010573-CH105-SW1

レシート検証についてはこちらの記事がとてもわかりやすくて参考にしました。
Apple月額課金について【Productionレシート】

前提知識

レシート検証した場合、取得できるレシートは指定アプリケーションで今まで購入したものすべてのレシートです。つまり、Aを購読しBにアップグレードした場合などは両方のレシートが取得できます。また更新毎にレシートは発行されます。

結果取得できるレシートデータの一部は以下の通りです。
公式ドキュメントはこちら

注目すべきはlatest_receipt_infoとpending_renewal_infoです。
receipt-data(base64エンコードを施したレシートデータ)をつかってレシートを取得しますが、
latest_receipt_infoにはこれまで購入したすべてのレシートデータが入っています。in_appにはreceipt-dataに対するレシートのみ入っています。

latest_receipt_info
Key 詳細
product_id 購入したアイテムのproductId
original_transaction_id Appleアカウントで一意となる購入ID
purchase_date 購入日もしくは更新された日。(GTM)
expires_date 有効期限が切れる日。(GTM)
pending_renewal_info
Key 詳細
auto_renew_product_id 購入状態の優先されるproductId
product_id 購入したアイテムのプロダクトID。有効期限切れの場合もある。最後に購入したproductId。
original_transaction_id Appleアカウントで一意となる購入ID
auto_renew_status 自動更新型購読について現在の更新ステータス
expiration_intent 購読期限切れの理由
※期限切れの場合のみ
is_in_billing_retry_period 期限切れになった購読についてAppleがなお自動更新を試みているか否か
※期限切れの場合のみ

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

レベル アイテム 期間      
1 アイテムA 1ヶ月      
2 アイテムB 1ヶ月      

アイテムA→Bがダウングレード、B→Aがアップグレードです。
iOS定期購読課金のレシートに追加された「pending_renewal_info」をみてみる を使います。

アップグレード(アイテムBからAに変更した場合)

:one: Bを4/1に登録すると、次の更新日は5/1となる。
このときレシート検証して得られるレシートは以下となる

latest_receipt_info
レシート Key 詳細
1 product_id アイテムBのproductId
1 original_transaction_id Appleアカウントで一意となる購入ID
1 purchase_date 4/1
1 expires_date 5/1
pending_renewal_info
Key 詳細
auto_renew_product_id アイテムBのproductId
original_transaction_id Appleアカウントで一意となる購入ID
product_id アイテムBのproductId
auto_renew_status “1” - 自動更新ON状態

:two: 4/10にAに乗り換える。この時点でAに変更となる。次の更新日は5/20となる。
このときレシート検証して得られるレシートは以下となる

latest_receipt_info(2つのレシートとなります)
レシート Key 詳細
1 product_id アイテムBのproductId
1 original_transaction_id Appleアカウントで一意となる購入ID
1 purchase_date 4/1
1 expires_date 5/1
2 product_id アイテムAのproductId
2 original_transaction_id Appleアカウントで一意となる購入ID
2 purchase_date 4/10
2 expires_date 5/10
pending_renewal_info(変更あり)
Key 詳細
auto_renew_product_id アイテムAのproductId
original_transaction_id Appleアカウントで一意となる購入ID
product_id アイテムAのproductId
auto_renew_status “1” - 自動更新ON状態

現在購読中である商品を確認する場合はpending_renewal_info.product_idをみればよい。またその購読が有効かどうかはpending_renewal_info.expiration_intentがないことを確認すればよさそう。
またアップグレードしたかについては、レシートの状態(latest_receipt_info)を確認することとなる。
2つのレシートが存在しているが、これを購入日(purchase_date)でソートする。
次に有効期限内かどうかを確認する。ここで有効期限内なレシートは2つとなる。今現在有効な商品はpending_renewal_info.product_idのAとなるため、BからAに変更したことがわかる。アップグレードは即座、ダウングレードは現在購読中のものの有効期限がきれるときにきりかわる仕様なのでアップグレードとわかる。
また、サーバ側で保持しているデータと合わせてみてもよさそうです。
サーバ側で保持している現在購読中の商品はBである。
レシート検証を行うとAになっていた。AとBのランクをみてアップグレードと判断する。

ダウングレード(アイテムAからBに変更した場合)

:one: Aを4/1に登録すると、次の更新日は5/1となる。
このときレシート検証して得られるレシートは以下となる

latest_receipt_info
レシート Key 詳細
1 product_id アイテムAのproductId
1 original_transaction_id Appleアカウントで一意となる購入ID
1 purchase_date 4/1
1 expires_date 5/1
pending_renewal_info
Key 詳細
auto_renew_product_id アイテムAのproductId
original_transaction_id Appleアカウントで一意となる購入ID
product_id アイテムAのproductId
auto_renew_status “1” - 自動更新ON状態

:two: 4/10にBに乗り換える。この時点ではまだAのままとなる。Aの有効期限日(5/1)にBに変更となる。
このときレシート検証して得られるレシートは以下となる

latest_receipt_info(なにも変わらない)
レシート Key 詳細
1 product_id アイテムAのproductId
1 original_transaction_id Appleアカウントで一意となる購入ID
1 purchase_date 4/1
1 expires_date 5/1
pending_renewal_info(変更あり)
Key 詳細
auto_renew_product_id アイテムBのproductId
original_transaction_id Appleアカウントで一意となる購入ID
product_id アイテムAのproductId
auto_renew_status “1” - 自動更新ON状態

アップグレード時同様、現在購読中である商品を確認する場合はpending_renewal_info.product_idをみればよい。またその購読が有効かどうかはpending_renewal_info.expiration_intentがないことを確認すればよさそう。
またダウングレードしたかについては、pending_renewal_info.auto_renew_product_idで確認ができる。
購読中商品はAだが、次に予定されている商品はBであることから判断ができそう。
しかしこれはあくまで予約されているだけなので、設定画面等で自動更新をOFFにするとBに変更されることはないので注意。

:three: 5/1にレシート検証してみる。Bに変更となる。

latest_receipt_info(2つのレシートとなります)
レシート Key 詳細
1 product_id アイテムAのproductId
1 original_transaction_id Appleアカウントで一意となる購入ID
1 purchase_date 4/1
1 expires_date 5/1
2 product_id アイテムBのproductId
2 original_transaction_id Appleアカウントで一意となる購入ID
2 purchase_date 5/1
2 expires_date 6/1
pending_renewal_info(変更あり)
Key 詳細
auto_renew_product_id アイテムBのproductId
original_transaction_id Appleアカウントで一意となる購入ID
product_id アイテムBのproductId
auto_renew_status “1” - 自動更新ON状態

現在購読中なのは、pending_renewal_info.product_idをみるとBに変わっている。
この時点でダウングレードかどうかをレシートだけで判断するのはなかなかむずかしそう。
サーバ側で保持しているデータと合わせてダウングレードかを判断するしかなさそうです。

サーバ側で保持している現在購読中の商品はAである。
レシート検証を行うとBになっていた。AとBのランクをみてダウングレードと判断する。

まとめ

手探り感はありますがなんとか判断はできそうですね:sparkles:
Auto-renewable Subscriptionの購読ステータスの状態変更をサーバで受け取る機能などもあるようですがアップグレードかダウングレードかを判断する用途としては使えなさそうです。(レシート検証と変わらない)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16