決済サービスStripeの備忘録 〜Proration（日割り）編〜

Progate Advent Calendarの14日目です。

ここでは、Stripeという決済サービスについて書きたいと思います。

今回のテーマは「日割り」です。

ここでは定期課金導入のための全体像の話はしません。
細部の仕組みで結構読み込まないとわからなかった部分について備忘録的にまとめていきます。

実装でつまずいた時に参考にしてもらったり、「日割りってなんなん？」と社内から言われた時にこいつを共有してもらったり、してもらえたら嬉しいです！

## Stripeとは？

Stripeとは、クレジットカード決済などを簡単に導入できるプラットフォームサービスです。

現在は英語ドキュメントしかありませんが、素晴らしい設計で使いやすく、便利な機能も多数あるので、Progateでも利用しています。
なお、最近ダッシュボードが日本語化されたり、日本にも支社があって日本語の通じる開発サポートの方もいらっしゃるなど、日本ローカライズが進められているようなので、今後Stripeを導入される方も増えるのではないでしょうか。

## そもそも、定期課金ってなに？

定期課金は毎日とか毎月とか毎年とか、一定期間ごとに自動更新されていくタイプの契約形態です。
ネットフリックスとか、アマゾンプライム会員とかのあれです。

ECサイトのように、一回一回完結する決済であれば、物事はもう少しシンプルなんですが、定期課金というのは曲者です。
繰り返し行われる決済を積み重ね、ミスなく、粛々と働いてくれるシステムが必要です。
Stripeという大きな枠組みの中で、一糸乱れぬ歯車を自分たちの側に作らなければなりません。。

決済関係では、ほんの小さな誤解が大きな問題に発展しかねません。
全体像の理解だけでなく、細部の理解も欠かせません。

ちなみに、Stripeはドキュメントが英語ですが、夜安眠するために、英語と嫌でも格闘することになるでしょう。
英語の勉強にもなるかも、、？

さて話しを本題に戻します。

## 一応ライフサイクルの確認を
せっかくなので、ライフサイクルの確認をしておきましょう。
![スクリーンショット 2017-12-10 17.36.34.png](https://qiita-image-store.s3.amazonaws.com/0/56995/b00c1bd5-1c7f-f9d0-f680-b2ea073498df.png)

上の図のように、課金を開始したら、その後はぐるぐるぐるぐると、定期課金のサイクルをまわります。
そして、その中でプラン変更や、従量課金であれば数量の変更が行われたり、キャンセル手続きが行われて、期間が終了して定期課金が完全に終了したりするわけです。

## 日割りについて

>The most confusing aspect to changing subscriptions is how existing payments are factored into the amount to be invoiced. By default, Stripe prorates subscription costs.

（定期課金を変更するときの最も紛らわしいことは、すでに行った支払いが、請求される金額にどう影響するのか、ということです。Stripeはデフォルトで、定期課金額を日割りにします。）


## もう少し前提の話

まず前提として、Stripeでは、定期課金のプロパティの１つとして、quantity、すなわち「数量」を持たせることができます。
このquantityは、決済サービスによっては持たせることができないものもあります。
Stripeの場合はこれが可能なので、例えばプレミアムプランを10人分、などのように、数量を指定して定期課金することが可能になっています。

日割りは、上でも書かれているように、「changing subscriptions」、つまりユーザーがプランや人数を変更したときに発生します。

Stripeでは、月次の定期課金のプランAから、同じ月次の定期課金プランBに変更した場合、課金サイクルは維持されます。
どういうことかというと、4月1日にプランAの課金を開始し、4月15日にプランBに変更した場合、4月15日から再び1ヶ月の課金サイクルが始まるわけではなく、4月1日から開始した課金サイクルを維持し、5月1日に定期課金が更新されます。

## 日割りを理解しよう

プランAからプランBのように、同じ課金サイクルを維持する場合、プランを変更した時点では決済は行われません。
さて、問題はこの、同じ課金サイクルを維持した場合に発生する「日割り」についてです。
日割りで注意すべき3つのパターンについて、４つの事例をもとに紹介します。

以下では、

- ベーシックプラン・・・2000円/月/人
- プレミアムプラン・・・3000円/月/人

という２つのプランがあるとします。

## アップグレード・ダウングレードしたとき

### Case Study1 ~ベーシックから、プレミアムにアップグレード~ 
|日付                |イベント            |備考                 |
|:------------------|:------------------|:------------------|
|4/01              |ベーシックプランに登録   |定期課金は前払いなので、このとき2,000円を支払います。|
|4/15（ちょうど期間の真ん中だとします）           |プレミアムプランにアップグレード |定期課金のサイクルは4/15~5/14になるわけではなく、5/1のまま維持されます|
|5/01              |定期課金更新        |決済が行われます       |


最初に支払ったのは、ベーシックプランの2,000円ですが、4/15からの15日間は「プレミアムプラン」を使っています。
ここで本来払うべき金額と、実際に払った金額の「差額」が発生しています。

Stripeでは、自動で「日割り計算」をして、差額を出してくれます。

差額
= (4/15~4/30までのプレミアムプラン15日分) - (4/1~4/15のベーシックプラン15日分)
= (3,000 * 15 / 30) - (2,000 * 15 / 30)
= 500
で500円となります。

このように、1ヶ月30日で2,000円だから、15日使ったなら1,000円だよね、といったように「割り当て」てくれるのが「日割り」です。

この日割り計算された未払いの差額は、次の課金日（5/1）に「まとめて」決済されます。
何と「まとめて」かというと、次の課金サイクル（5/1~5/31）の利用料金とまとめて、ということになります。

よって、
5/1の支払い金額
= (4/1~4/31までに発生した差額) + (次の期間の利用料金)
= 500 + 3,000
= 3,500
で、3,500円となります。

### Case Study2 ~プレミアムから、ベーシックにダウングレード~

上とは反対に、プレミアムプランからベーシックプランに変更した場合は、差額がマイナスになります。
差額がマイナスの場合は、次の決済日に差額分が割引されます。
さらに、全額割引しても差額が残っている場合（※）は、さらに次の決済日にも割引されます。

※ 例えば差額がマイナス4,000円、5/1に「ベーシックプラン（2,000円/月）」で更新した場合、マイナス2,000円の差額が残ります。これはさらに6/1の課金日にも割引されることとなります。

## だいたいこんな感じ

ここまでは、単純なプランの変更で説明しましたが、BtoBのサービスで従量課金などを扱っている場合は、quantityの変更も加わって、このような日割りがよく発生します。

例えば、ベーシックプランを10人で使っていたが、15人で使うように変更になったといった場合も、上記と同じような日割り計算が行われ、次の課金日に請求金額に反映されます。

数量の変更などは頻繁に起こりえるので、毎回請求するのではなく、pending prorationという形でプランや人数の変更履歴がStripeに残っています。
そしてそれらをすべて取りまとめて、次の支払い日にまとめて精算されるという仕組みです。


## 定期課金終了時に未払いの差額が残っていたら？

### case study3 ~未払いの差額が残った状態で、課金終了~

|日付                |イベント            |備考                 |
|:------------------|:------------------|:------------------|
|4/01              |ベーシックプランに登録   |2,000円支払い|
|4/15              |プレミアムプランにアップグレード ||
|                  |キャンセル手続き|| 
|5/01              |定期課金終了        |本来なら、更新時にまとめて請求されるはずの差額が残っている！|

安心してください。
この場合、定期課金が終了する際に、差額分はStripeによって自動で決済されます。

## 定期課金の途中で退会したときに、差額が残っていたら？
### case study4 ~差額が残った状態で、定期課金の終了も待たずに退会した~

このあたりは決済システムの実装経験がある方しかイメージが湧きづらいかもしれません。

定期課金の期間がまだ残っているときに、アカウント自体を解約（すなわち退会）する場合があります。
その場合、契約していた定期課金は、自然なライフサイクルに任せるのではなく、こちらで手動で削除する場合が多いでしょう。
Stripeでは、case3と異なり、定期課金を手動で削除した場合は、未払いの差額をこちらで手動で決済しなければならない仕組みとなっています。


|日付                |イベント            |備考                 |
|:------------------|:------------------|:------------------|
|4/01              |ベーシックプランに登録   |2,000円支払い|
|4/15              |プレミアムプランにアップグレード ||
|(5/1より前のいつか)   |退会|本来なら、更新時にまとめて請求されるはずの差額が残っている！| 

退会時に、定期課金も削除しますが、このときは差額は自動では決済されません。
この差額を決済するためには、定期課金を削除する際に、APIで、Invoiceという請求書オブジェクトを作成し、決済を行います。

----------

日割りについては以上になります。日割りが発生する3パターンについてお話しました。

下記あたりを参考にしましたので、よかったら参考にしてみてください。
https://stripe.com/docs/subscriptions/upgrading-downgrading#understanding-proration
https://stripe.com/docs/subscriptions/canceling-pausing#invoices-and-invoice-items
https://stripe.com/docs/api#pay_invoice

日割りはけっこう複雑で不安になりますが、少しでも参考になれば幸いです！