Stripeを用いてサブスク周りを設計したので、メモとして記します
ざっくりとした仕様としては、以下です
・ 事前に登録したカードでサブスク登録できる
・ 事前にカードを登録してない場合にサブスク登録ボタンを押した際、カード登録画面に遷移させカード登録終了直後にサブスクも登録させる
・ カードは複数登録できて、支払いに使用するカードを選択できる
・ 無料トライアルあり
・ 解約は即時(解約しても期間が残っている間は使える仕様ではない)
・ サブスク課金更新に失敗したら即解約
spaでデザインもオリジナルにしたかったので、checkout(https://stripe.com/docs/payments/checkout )ではなくelements(https://stripe.com/docs/payments/elements )とstripe apiを用いて実装しました
DB設計
stripeへのアクセスを減らすために頻繁にアクセスされる情報はdbに保存するようにすべきなのですが、toB向けサービスで登録企業数も少なく頻繁にアクセスされる情報はなかったので、ユーザー(企業)にstripeのcustomerIdを紐づけるようにしたのと、ユーザーがどのサブスクに登録していてそのサブスクが有効かどうかくらいしかdbに保存させないようにしました
解説
サブスク課金更新に失敗したら即解約の仕様を実現するために、ダッシュボードの設定>サブスクリプションおよびメール>失敗した支払いの管理から、リトライスケジュールを無しにして、サブスクリプションのステータスがキャンセルになるように設定しました
ただ支払い失敗のwebhookでも権限剥奪の処理を一応入れてます
事前にカードを登録してない場合のサブスク登録のフローはhttps://stripe.com/docs/billing/subscriptions/build-subscriptions?ui=elements のやり方もあるのですが、事前に登録したカードでサブスク登録できるという仕様もあるので、今回のようなカード登録してサブスク登録するという同期的なやり方にしました
所感
Stripeは全体の情報量は多いもののユースケースに対する見本コードが少ないので、シークエンス図を考えるのが大変でした
実際に事前に登録したカードを用いてサブスクを登録するというユースケースに対して見本コードがなかったので、自分でstripeのapiやreactのsdkやダッシュボードを動かしてみたりサポートに問い合わせたりしてこのやり方になりました
24時間体制でサポートしてるので、深夜でもすぐに返答が来たのは助かりました