とある担当サービスの料金プランの改定作業に伴い、StripeのCheckoutをマイグレすることにしました。覚えているうちに出していい範囲で情報をまとめようと思います。
前提
- Stripe(カード決済システム)をある程度わかってる人向け
- サーバサイドはPython+Django、フロントはJS
きっかけ
料金プランの改定に伴い、今までのCheckout API(Legacyと言われる)ものだと表現できないパターンがあったためです。具体的には、1つのsubscriptionで複数のplanをお買い上げ頂くような内容です。他にもLegacy Checkout APIから移行した方がいい理由はあると思いますが、これが一番大きい。あとはStripeの画面の見え方もModalから1枚の支払いページに変わる(ここ)ので、なんか料金プランリニューアルした感が出るというのも個人的なポイント。
新旧Checkout でどう変わるか
Legacy Checkout の流れ
めっちゃシンプル。①と②の実装を書くだけです。簡単に述べると①でCheckoutのセッションを作り、モーダルダイアログを出します。②は決済内容に基づいて、購読アイテムの処理をさせます。この中でsubscriptionとcustomerオブジェクトを作って紐付けてあげる必要があります。
Modern(?) Checkout の流れ
実装箇所が4つに増えました。①では契約するplanのitemを作り、②はそれを受けてCheckout sessionを作ります。③はStripe Webhookの処理で、購読アイテムの処理をさせてます。④では、ユーザの画面をリダイレクトしています。③の処理は④でもできるのですが、この方がセキュアだと判断しました。
しかしまぁ、複雑だなぁ
よかったところ
- 意図してたので当然ですけど、複数の組み合わせのplanを購読できるようになった
- 画面が変わったのでリニューアル感が出る
- StripeのJSのロジックが軽くなった気がする
- Legacy版では、サーバサイドでstripe の subscription オブジェクトとcustomerオブジェクトを用意しなければならなかったが、Modern版では必要なくなった。
- Legacy版で取れてた
stripeToken
というパラメータもなくなってるっぽい
- Legacy版で取れてた
ちょっと微妙なところ
- クレジットカード情報をどうやってとるのかがよくわからない
- 今まではLIST ALL CARDS API で取れていたが、とれなくなった
- おそらくDefaultの支払い方法(?)になるように設定してあげないといけないのだが、CREATE A CARD APIを叩くのかなぁ、ぐらいでよくわからなくなった
- subscriptionの請求開始日を指定できなくなった
- Legacy版では、subscriptionを自前で作ってたので、
billing_cycle_anchor
を指定して、1日始まりに変えることができてました - が、Modern版ではStripe 側でよしなに作られるのですが、Checkout Session API にそういう口はなさそうです。
- 既存のsubscriptionに対する請求開始日の変更は制限があるようです
- Legacy版では、subscriptionを自前で作ってたので、
その他、注意が必要だったところ
- 動作確認してるとStripeのcustomerがとても増える。Dashboardから消せる
- 新旧のデータ構造の違いでよく処理が落ちた。
- 例えば、単数のplan(Legacy版はこのパターンしかない)を購読するか複数のplanを購読するかでsubscriptionオブジェクトのデータ構造が違う
- 単数なら
subscription['plan']
- 複数なら
subscription['items']['data'][INDEX]['plan']
- 新旧の料金プラン改定がスムーズに進むよう、コールバックを作るような感じで作業した
おわりに
割とスムーズに進められたかとは思いますが、細かいところがちょっと惜しかったなぁという印象。マイグレによる影響で、既存機能が提供できない、または変更を余儀なくされる部分が出そうです。実はLegacy Checkoutでも複数Planの設定ができるとか、そういう見落としがないことを願うばかりです笑
追伸
「Legacy Checkout では複数のplanを購読することができない」そう思っていた時期もあったのですが、何か違う気がしてきました。Legacy Checkoutはあくまでクレジットカード情報を入力させるための口に過ぎず(購読内容の金額は出ない)、具体的な購読内容はCREATE A SUBSCRIPTION APIで組み立てる、ということかなと。前提が音を立てて崩れ去る、とはこういうことか。私は間違っていたかも。