Postman Flowを使って、Stripeのサブスクリプションをシミュレーションする仕組みを作ってみた

:::note
この記事は、[Postman Advent Calendar 2024](https://qiita.com/advent-calendar/2024/postman) 3日目の投稿です。
:::

こんにちは、Stripe Developer Advocateの岡本です。Qiitaでは、Stripeに関する記事を大体年に40-50本投稿したり、開発者コミュニティへの参加や登壇などにも携わっています。

Postmanでは、[APIコレクション](https://www.postman.com/stripedev/stripe-developers/overview)を公開している他、[YouTubeチャンネル（英語）](https://www.youtube.com/watch?v=oviFGXrwYIQ)でも使い方の紹介なども行っています、PostmanでStripe APIを試されたい方は、ぜひ[公式のガイド記事](https://quickstarts.postman.com/guide/stripe/index.html?index=..%2F..index#0)などもお試しください。

今回はPostman Flowを使ったシミュレーターの作成に挑戦した時のことを紹介したいと思います。

## サブスクリプションの時間経過を伴うテストには、複数のAPIリクエストが必要

Stripeには、サブスクリプションの時間経過をシミュレーションできる仕組み([テストクロック](https://docs.stripe.com/billing/testing/test-clocks?locale=ja-JP))があります。この機能を使うことで、契約期間途中でのプラン変更における差額計算や、長期間の未払いが発生した時の処理について事前にテストできます。この手続きをAPIで行う場合、次のようなステップを踏みます。

- テストクロックオブジェクトを作成する
- テストクロックに紐づいた顧客と支払い情報を作成する
- サブスクリプションを作成する
- テストクロックの時間を進める
- サブスクリプションを更新する

おおまかに書き出しただけでも、５つ６つのStripe APIを呼び出し、それぞれのレスポンスを引き回す実装が必要です。プログラム言語で実装することが大変・・・というほどではありませんが、それでもスクリプトのダウンロードやAPIキーの設定など、新しく参加したメンバーがシミュレーションを開始するには少し手間が残ります。

そこで今回はワークフローを簡単に作成、実行できるPostman Flowを使ってみました。

## 今回作成したFlow

作成したFlowがこちらです。かなり大きなフローになってしまったため、何枚かのスクリーンショットに分割してご紹介します。

初めのステップでは、シミュレーション期間や対象のプランIDなどの設定と、テストクロックのセットアップを行います。**Date & Time**のレコードで設定した日時を、**Evaluate**でUNIX　TIMESTAMPへの変換処理（`$floor(input.start_at/1000)`）にかけ、**Send Request**で`frozen_time`としてStripe APIリクエストで送信します。

![スクリーンショット 2024-11-28 14.01.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/bb786235-2754-9439-60cf-7a2dc0f76e3b.png)

次のステップではStripe上にCustomerと支払い情報の設定を行っています。Customerを作成するAPIリクエストで、`payment_method`パラメータに`pm_card_visa`を設定しています。

![スクリーンショット 2024-11-28 14.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/57dc0e48-66b4-8e46-74fd-cf031a67c088.png)

その後サブスクリプションを作成し、時間のシミュレーションを開始します。Stripeのテストクロックによるシミュレーション実行が完了するまですこし時間を必要とすることがあります。そのため、**Delay**で15000msほどの遅延を入れるようにしました。プラン変更のシミュレーションとその後の時間経過についても、ほぼ同様の手順で行います。

![スクリーンショット 2024-11-28 14.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/931fd87c-b6e0-0600-d39e-7b56a5907fe4.png)

最後に日割り計算のシミュレーション結果を出すため、InvoiceのAPIを呼び出して明細を表示させています。


![スクリーンショット 2024-11-28 14.02.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4179fe85-fa5f-1dcf-e671-b067f678202b.png)


:::note warn
**Flowそのものを共有しない理由**
お恥ずかしながら、作成完了後にPrivate WorkspacesでFlowを構築してみまいました・・・
そのため、完全に同じものを作り直す以外にFlowを公開することが難しく、今回はスクリーンショットでの共有といたします。
:::

このFlowを実行すると、途中でプラン変更した場合と、そうでない場合の請求内容を比較してチェックできます。今回のサンプルでは、契約期間途中に新しく追加されたプラン分の価格が新しい請求内容に反映されています。

![スクリーンショット 2024-11-28 14.14.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/fe00e0a7-5d31-b7b8-5ae0-e4c145dbd927.png)

## Postman Flowを作成してみて

Private Workspaceに作ってしまったため、公開や共有が難しい状態になるハプニングはありました。ただしその部分さえ回避すれば、Postman Flowで定義したテストシナリオを、Flowにアクセスできる人が簡単に実行できるようになるのは魅力的です。Recordを使って更新タイミングや更新内容を変更できるようにすることで、APIパラメータを差し替えるタイプのテストシナリオ変更は簡単に実現できそうでした。

もしPostman Flowを使ってAPIリクエストを組み合わせる際、意図しないエラーが発生した場合は、StripeのダッシュボードにあるAPIログ機能も調査に活かせます。PostmanがどのようなAPIリクエストを送信しようとしているか、そしてStripeがどのようなエラーを返しており、それがどんな原因かなども簡単にチェックできます。

![スクリーンショット 2024-11-28 14.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4a390219-5d1b-1987-c25c-8fd05b2ec5db.png)

Postman FlowとStripeダッシュボードを組み合わせて、ぜひ決済処理や請求管理に関するテストシナリオの作成を、2025年はみなさん挑戦してみてください。

## Stripe x Postmanに興味がある方はこちら

Stripeが公開しているPostmanコレクションについては、Stripe Docsでも紹介しています。

![スクリーンショット 2024-11-28 14.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/31ec4a33-b9e1-52df-f87e-29215650e603.png)
https://docs.stripe.com/test-mode#postman-collection

インポート方法やテストケースのヒントなども紹介されていますので、ぜひご覧ください。