Stripeテストクロックで、サブスクリプションを期間途中でプラン変更・解約した場合の差額計算をテストしよう

顧客にサブスクリプションを提供する場合、**契約・プラン変更タイミングによる差額調整**や**解約処理**の進め方など、**時間経過を伴うデータの変化**を考慮する必要があります。

## 考慮が必要なケースの例

- 月額プランを、月の途中で上位 or 下位プランに変更した場合に、差額をどう処理するか
- 「契約期間終了後に解約」設定のサブスクリプションで、Webhookの解約イベントが意図したタイミングで発火発火するか
- 請求サイクルを固定したサブスクリプションを提供する場合、初回の請求額がどう変わるか

## Stripeテストクロックで、顧客の時間経過をシミュレートしよう

Stripeでは、「顧客の時間」をテスト環境でシミュレートする「テストクロック」機能が用意されています。

この機能を使うことで、時間経過を伴う状態変化やWebhookイベントの発火をシミュレートできます。

![test-clock-lifecycle.5ccbe48040e88de447cb08eea433d91b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/852cdb51-fd83-8445-0ee4-4cd6755c0f11.png)

https://stripe.com/docs/billing/testing/test-clocks

## ダッシュボードから、テストクロックの利用を開始する

### Step1: シミュレーションを作成しよう

ダッシュボードから利用する場合、[支払い > サブスクリプション]に移動しましょう。

![スクリーンショット 2022-10-20 15.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/aae4c881-800d-1389-9f5c-9bf3aaeb17b2.png)

[テストクロックの時間を使用して組み込みをテストし、請求書のシナリオをシミュレーション。]のリンクをクリックしましょう。

![スクリーンショット 2022-10-20 15.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/5ab6ed96-1425-1925-0d25-d034887b6bbc.png)

[新しいシミュレーション]ボタンをクリックして、シミュレーションの準備を開始します。

![スクリーンショット 2022-10-20 15.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ffddc761-7a5c-bf5a-e847-8d1a63cc558b.png)

シミュレーションでは、[名前]と[開始日時]を設定できます。

![スクリーンショット 2022-10-20 15.12.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/89249b72-176a-5a8b-fba9-199cf3071209.png)

過去の日付を指定することもできます。

設定が終われば、[作成]をクリックしましょう。

![スクリーンショット 2022-10-20 15.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1c53ea63-646e-c12c-f638-905a09ffc447.png)

これで準備完了です。

![スクリーンショット 2022-10-20 15.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ba4faa68-83cf-c565-817b-714f9d7b3ede.png)


テストクロック一覧ページから、複数のテストクロックを作成したり、別のテストクロックを開いたりもできます。

### Step2: シミュレーション用の顧客データを作成しよう

シミュレーションを始めるには、シミュレーションに紐づいた顧客データが必要です。


![スクリーンショット 2022-10-20 15.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1c53ea63-646e-c12c-f638-905a09ffc447.png)

[最初の顧客を追加]をクリックしましょう。

![スクリーンショット 2022-10-20 15.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/6453cb3f-1fe9-b6ef-0715-f20f62e39692.png)

顧客データを登録します。

![スクリーンショット 2022-10-20 15.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/0f2a7048-4ad9-ea6a-cabc-96f877262927.png)

作成に成功すると、テストクロック詳細ページに顧客データが表示されます。

### Step3: 顧客をサブスクリプションに登録しよう

最後に、作成した顧客を、シミュレートしたいサブスクリプションに登録しましょう。

[クロックオブジェクト]セクション右側にある、[追加]ボタンをクリックして、[サブスクリプションを追加]を選びます。
![スクリーンショット 2022-10-20 15.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/a419eacc-9e49-e922-4571-53733c66d9dd.png)


[顧客]を選択すると、選択中のテストクロックに紐づいた顧客のみ表示されます。
![スクリーンショット 2022-10-20 15.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/fb577843-d7d6-3274-9885-f8948af43620.png)

商品・料金を選択した後、トライアルの日数や決済用のテストカードの登録を済ませましょう。
![スクリーンショット 2022-10-20 15.18.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/af9e3fa0-5609-aa6a-b269-fdd42775ce26.png)

テスト用のカード番号は、こちらから確認できます。

https://stripe.com/docs/testing

作成に成功すると、クロックオブジェクトにサブスクリプションが表示されます。

![スクリーンショット 2022-10-20 15.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/a166714e-41fd-d5f8-3db9-89b3130f9e2f.png)

## テストクロックで、時間経過をシミュレートする

シミュレーションの準備が完了すれば、いよいよ時間経過をシミュレートします。

テストクロック詳細ページから、[時間を進める]ボタンをクリックしましょう。

![スクリーンショット 2022-10-20 15.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/3c0ea74c-8818-b52a-d76d-8dd2ed8aab04.png)

どの時間まで進めるかを指定するモーダルが表示されます。

![スクリーンショット 2022-10-20 15.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/5ab24028-4022-a043-a4f2-00b293b25533.png)

年月日のフォームを選択すると、カレンダーと入力支援ボタンのある画面が立ち上がります。

![スクリーンショット 2022-10-20 15.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/bf01901f-bb6b-74ce-162c-63404bc75d83.png)

日時を指定後、[進める]をクリックすると、時間経過のシミュレーションを開始します。

「クロック時間はXXXX年XX月XX日〜」のテキストが、指定した日時に変わればシミュレート完了です。

![スクリーンショット 2022-10-20 15.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/f04915fa-25c7-b216-1e3d-b99577e71d4f.png)

サブスクリプションの詳細ページに移動すると、インボイスやイベントログが、指定した時間分発行・記録されていることがわかります。

![スクリーンショット 2022-10-20 15.25.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/36c3f35e-d3dc-55a7-810f-745ac32c0738.png)

## サブスクリプションを更新して、その変化をシミュレートする

サブスクリプションや顧客の状態を変化させて、再度シミュレートしてみましょう。

画像のサンプルでは、サブスクリプションを更新して、プランの数量や終了日の指定を追加しています。

![スクリーンショット 2022-10-20 15.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/0be92837-462c-5ce6-efec-f6fbb59698e6.png)

テストクロックに紐づいた顧客やサブスクリプションの場合、それぞれの詳細ページでもテストクロックの操作ができます。

![スクリーンショット 2022-10-20 15.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d7ef9645-ac72-8749-37f8-7152a73cbea4.png)


[時間を進める]で解約予定日以降に時間を動かしてみましょう。

![スクリーンショット 2022-10-20 15.29.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/459e6e81-b802-3540-b5d8-c994c4f25177.png)

契約期間を満了したため、サブスクリプションが解約されています。

![スクリーンショット 2022-10-20 15.30.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/42c79995-e786-c470-590b-65e7e56c9fae.png)


プラン変更時や解約時の差額調整（比例配分）も、インボイスで確認できます。

![スクリーンショット 2022-10-20 15.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/10de2f91-c612-9276-bfb3-8b067bfe511e.png)

### Webhookイベントは、「シミュレート中の日時」でデータを送信

Webhookイベントも送信されるため、システム連携のテストも可能です。

![スクリーンショット 2022-10-20 15.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8bb8f1fd-ca33-9ea2-c1a5-b7bb6f8bd8b5.png)

送信されるデータの日時（UNIXタイムスタンプ）は、シミュレート内の日時です。

そのため、Webhookイベントを受信する側のシステムは、「未来または過去の日付」でデータを処理することになる点に、注意しましょう。


## Stripe APIとSDKで、シミュレーションをコード化する方法

テストクロックは、APIやSDKからも利用できます。

Node.jsでのサンプルコードを、以下の記事で紹介していますので、こちらも併せてご覧ください。

https://qiita.com/hideokamoto/items/5c7332bce3d5537992df


## [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)