Androidアプリ定期購読のGrace Period（猶予期間）の利用方法

##〇概要
Androidアプリで定期購読の管理を行っていると、ユーザーのクレカが有効期限切れなどでユーザーが意図しない定期購読停止になってしまうことがあります。
その際に、支払い方法変更の猶予期間を与えるGrace Periodという機能があり、最大で~~7+1日~~7日間ユーザーに追加で有料機能を利用してもらい、その間にGoogleから支払い方法変更の催促プッシュ、メールが送られ、ユーザーになるべく継続して有料機能を利用してもらうということができます。
しかし、実際にどのような期限の伸び方をして、どのような内容のプッシュやメールが送られるのか等、公式情報を読むだけでは不明な点が多いので、テスト環境での結果とGoogleに問い合わせた結果、過去の経験からの予想を踏まえての記事となります。その点はご注意ください。~~（実際どうなったかは後日書こうかと思います）~~

###・本番環境結果 追記
https://qiita.com/KIRIN3qiita/items/0114cfc4008625e5013c


###・[2019/07/04追記]
<font color="red"> Android Developers Blogなどで情報を見つけることはできませんでしたが、機能がアップグレードしてますね。</font>
<font color="red"> また、Google Play Consoleで詳細情報が見れるようになっています。</font>
https://android-developers.googleblog.com/2019/04/optimize-your-subscriptions-with-new.html
<font color="red"> 動画も公開されています。</font>
https://www.youtube.com/watch?v=OBhipUSngkY
<font color="red"> ユーザーに猶予期間中ですよ！とプッシュで通知するなどをすると、より効果的とのこと。</font>

##〇設定方法
Google Play Consoleの[アプリ内サービス]、定期購入アイテムをクリックして、[猶予期間]にて設定。

##〇設定できる期間
~~・週単位の定期購入: 3 日間~~
~~・その他の単位の定期購入: 7 日間~~

<font color="red"> 新しい定期購入商品については、次の猶予期間がデフォルトで設定されます。</font>
<font color="red"> 週単位の定期購入: 3 日間</font>
<font color="red"> その他の単位の定期購入: 7 日間</font>

<font color="red"> 個々の定期購入について猶予期間（3 日間、7 日間、14 日間、30 日間）を変更したり、猶予期間を無効にしたりできます。</font>

##〇期限の伸び方
・実はGrace Periodは設定しなくてもデフォルトで1日が設定されており、ユーザーが意図しない停止時は1日有効期限が延長される。（プッシュ、メールは送られない）
・その後設定した猶予期間分１日ずつ？期限が伸びていく。
・猶予期間内に支払い方法を変更すると、本来の期限から有効期限が伸びる。そのためたとえば4日Grace Periodで伸びてもその分は引かれる。
・（たまにバグ？で期限がちょこちょこ伸びたり、縮んだりすることもある・・・）

##〇Purchases.subscriptions APIの値の変化
Purchases.subscriptions
https://developers.google.com/android-publisher/api-ref/purchases/subscriptions

・autoRenewing
　　- 猶予期間中もtrueのまま。猶予期間が終わるとfalseになる。
・expiryTimeMillis
　　- 支払いできない状態になると期限に近づくたびに１日分ずつ伸びていき、猶予期間が過ぎると、テスト環境ではなぜか支払いを停止した日時に戻った。
　　- 本番環境では、猶予期間分が引かれてユーザーが購入した期間に戻る可能性があると思われる。（というかそうでないとおかしいかと・・・）
・paymentState
　　- 猶予期間中は0。
・autoRenewing
　　- 猶予期間中もtrue,完全停止でfalse。

##〇ユーザー現れる変化
・期限更新日に支払いが完了できないとプッシュとメールが送られる。

【プッシュ例】
![push1.png](https://qiita-image-store.s3.amazonaws.com/0/252283/8c6c13f8-e81a-54ad-f168-9ee9a98323d2.png)
【メール例】
![mail1.png](https://qiita-image-store.s3.amazonaws.com/0/252283/71ce5d0b-2e6f-fb86-dfbe-071e0dba7d4f.png)

・ユーザーのGoogle Play Storeの[定期購入の管理]に「△対応が必要です」が追加され支払い方法を変更できるようになる。
![store1.png](https://qiita-image-store.s3.amazonaws.com/0/252283/26d46e89-4a9f-8a2f-ac1e-72933534c4e1.png)

##〇テスト方法
アプリ内課金のテスト
https://developer.android.com/google/play/billing/billing_testing?hl=ja
Faster Renewals for Test Subscriptions
https://android-developers.googleblog.com/2018/01/faster-renewals-for-test-subscriptions.html
![t2wothw8.jpg](https://qiita-image-store.s3.amazonaws.com/0/252283/98d3250f-b45e-6856-c06f-8cecfb31eeab.jpeg)

アプリ内課金の基本的なテスト方法は割愛。（上のURLを参考に）
Google Play Consoleで[アプリ内サービス]から定期購読の猶予期間を設定。
アプリにて定期購読を購入。
アプリにてGoogle Play Storeの[定期購入の管理]にある[更新]を押して「常に認証」「常に不認証」を切り替え挙動を確認。
不承認にし、購入した有効期限に近付くとexpiryTimeMillis（有効期限）が数十秒づつ伸びて、「常に認証」に戻さないと5分で停止し、autoRenewingがfalseになり、cancelReasonが1になります。
途中で戻せば、そのまま定期購読が再開されます。
認証、不認証は複数回繰り返しても正常に動作しました。

##〇まとめ
特殊な事情がない限り、定期購読ユーザーを逃がさないためにも設定しておいたほうがよいと思われます。
サーバーで有効期限を管理している場合は、有効期限がちょこちょこ伸びたり、いきなり縮んだりするので対応するのが若干面倒です。

##〇参考URL
・定期購入の作成[お支払いが承認されなかった場合の猶予期間とアカウントの保留]
https://support.google.com/googleplay/android-developer/answer/140504
・Purchases.subscriptions
https://developers.google.com/android-publisher/api-ref/purchases/subscriptions
・アプリ内課金のテスト
https://developer.android.com/google/play/billing/billing_testing?hl=ja
・Faster Renewals for Test Subscriptions
https://android-developers.googleblog.com/2018/01/faster-renewals-for-test-subscriptions.html
<font color="red">・定期購入固有の機能を追加する</font>
https://developer.android.com/google/play/billing/billing_subscriptions