【GooglePlayアプリ内課金】定期購入のライフサイクル

# はじめに

google play アプリのアプリ内課金(以下、IAB)を実装したので、まとめてみました。
私はバックエンド担当のため、バックエンドの、また、1回限りのアイテムではなく定期購入についてのまとめとなります。
いくつかのトピックごとに記事にしているので他の記事もどうぞ。
初回となる本記事では、定期購入のライフサイクルについて書きたいと思います。

### まとめ記事一覧

1. 定期購入のライフサイクル
1. [購入と解約のシーケンス](https://qiita.com/s_nishizawa/items/fb87834c409052ec7770)
1. [Subscriptions and In-App Purchases API](https://qiita.com/s_nishizawa/items/5bce6f50b5dfafa0150b)
1. [RTDN](https://qiita.com/s_nishizawa/items/b193d878458bd56de283)
1. [テスト](https://qiita.com/s_nishizawa/items/c0d1873c55c8d5b66ae3)

# ライフサイクルについて

定期購入の契約から解約までのライフサイクルを解説します。また、定期購入の一時停止やユーザが支払いに失敗した際の状態遷移についてもまとめました。
参考： https://developer.android.com/google/play/billing/subscriptions#lifecycle

## 一般的な購入フロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224207/6cdc3f76-b3c8-cc25-52c1-1592d820d585.png)

定期購入は、ユーザが解約するまで、自動的に更新され、更新時にユーザに請求されます。
IAB では、請求サイクルが終了するまでサービス提供することが期待されており、解約後も期限が切れるまではサービス提供期間となります。
更新時の請求に失敗すると、設定した猶予期間ののち、アカウント保留となり、サービス適用は打ち切られます。
アカウント保留中は、google で自動的に請求の再試行が行われ復帰するか、ユーザが手動で決済方法を修正することでアクティブに復帰します。
また、自動更新を一時的に停止する一時停止機能があります。

## 状態遷移

```plantuml
@startuml

state "Active(承認待)" as Pending
state "Active" as Active
state "Canceled(解約済)" as Canceled
state "Expired(期限切れ)" as Expired

hide empty description

[*] --> Pending: 購入
Pending --> Active: 定期購入の Acknowledge
Active --> Canceled: 解約
Canceled --> Expired: 有効期限の終了
Pending --> Expired: Acknowledge されないまま\n48時間経過

Active --> Renewed: 自動更新の失敗
Renewed --> Active: ユーザの支払い成功
state "支払い失敗時" as Renewed {
  state "In grace period(猶予期間)" as InGracePeriod
  state "On hold(アカウントの保留中)" as OnHold
  [*] --> InGracePeriod
  InGracePeriod --> OnHold
  OnHold --> [*]
}
Renewed --> Expired: 保留期間の終了

Active --> Pausing: 一時停止予約
state "定期購入の一時停止" as Pausing {
  state "Pause scheduled(一時停止予約)" as PauseScheduled
  state "Pause(一時停止)" as Pause
  [*] --> PauseScheduled
  PauseScheduled --> Pause
  Pause --> [*]
}
Pausing --> Active: 再開
Pausing --> Renewed: 再開時の支払い失敗

@enduml
```

* アクティブ
  * サービスを利用中の状態
* 解約済
  * ユーザが解約後、自動更新が止まった状態
  * サービス提供は即時に停止されません
* 期限切れ
  * サービス提供していない状態
* 猶予期間
  * 自動更新が失敗したが、まだサービス提供している状態
* アカウント保留中
  * 自動更新の支払い失敗によりサービス提供が停止している状態
  * 支払いが復旧し次第アクティブに戻る
  * 一定期間支払いが復旧ができないと期限切れとなる
* 一時停止予約
  * 一時停止は、停止するとその場でサービス提供が停止するため、基本的には次回更新日から一時停止させることになり、その予約中の状態
* 一時停止
  * ユーザは一時停止中はサービスを利用することができなくなります
  * 手動で再開するか、一時停止時に指定した、1週間から3か月の停止期間終了後に自動で再開します
  * 再開時にユーザに請求が行われます

## 定期購入の設定

定期購入の商品として設定できるものです

### 請求サイクル

* 週単位、1か月、3か月、6か月、1年が選択可能
* 週単位はキャリア決済だと利用不可

### 価格

* 期間単位の価格を設定する
* 99円 ～ 48,000円で設定しなければならない
    * https://support.google.com/googleplay/android-developer/answer/10532353
* 消費税は含んだ形で設定する
  * 内税設定

#### お試し価格

* 一定の期間の安価な初期価格、または、特定回数の定期購入額の減額を設定できる
* 定期価格より安くなければならない
* お試し価格が利用できる期間は、3日 ~ 1年

#### 無料試用

* 一定期間無料で利用できる
* 請求期間への切り替えは自動で行われる
* 商品ごとに1回の無料期間を設定できる
  * デフォルトでは、ユーザはアプリで1回(いづれかの定期購入商品で1度)しか利用できない
  * 商品ごとに1回に設定変更可能
* 期間は3日以上
  * 試用期間は変更可能ですが、適用されるのは設定後の購入者から

[Play Console ヘルプ 定期購入の作成](https://support.google.com/googleplay/android-developer/answer/140504)

### アップグレード・ダウングレード

購読中のプランをアップグレードないしはダウングレードする機能。基本的にアプリ側で実装する
変更時の配分プランをパラメータとして渡す必要がある
設定できる比例配分モードをは下記の通り

* 日割り調整（デフォルト
* 差額請求
* 次回更新時から
* 更新時のみ切り替え可能

挙動としては、定期購入を再購入する形となり、購入中の定期購入が期限切れになり、新しい定期購入と新しい購入トークンが作成される形となる

https://developer.android.com/google/play/billing/subscriptions#change

### 価格変更

購入済みの価格を変更する機能が提供されている

* 値上げの場合
  * 新規ユーザは変更後価格
  * 既存ユーザは価格変更通知が飛び、一定期間内の同意が必要
    * 同意後の請求から自動で切り替えられる
    * 同意しなかった場合、期限経過後の請求日で自動解約される
* 値下げの場合
  * 変更されたことが通知されるが、変更後の請求から自動で切り替えられる

https://developer.android.com/google/play/billing/subscriptions#price-change