Stripeの新旧Checkoutを比較

とある担当サービスの料金プランの改定作業に伴い、StripeのCheckoutをマイグレすることにしました。覚えているうちに出していい範囲で情報をまとめようと思います。

前提

  1. Stripe(カード決済システム)をある程度わかってる人向け
  2. サーバサイドはPython+Django、フロントはJS

きっかけ

料金プランの改定に伴い、今までのCheckout API(Legacyと言われる)ものだと表現できないパターンがあったためです。具体的には、1つのsubscriptionで複数のplanをお買い上げ頂くような内容です。他にもLegacy Checkout APIから移行した方がいい理由はあると思いますが、これが一番大きい。あとはStripeの画面の見え方もModalから1枚の支払いページに変わる(ここ)ので、なんか料金プランリニューアルした感が出るというのも個人的なポイント。

新旧Checkout でどう変わるか

Legacy Checkout の流れ

Legacy Checkout

めっちゃシンプル。①と②の実装を書くだけです。簡単に述べると①でCheckoutのセッションを作り、モーダルダイアログを出します。②は決済内容に基づいて、購読アイテムの処理をさせます。この中でsubscriptionとcustomerオブジェクトを作って紐付けてあげる必要があります。

Modern(?) Checkout の流れ

Modern Checkout

実装箇所が4つに増えました。①では契約するplanのitemを作り、②はそれを受けてCheckout sessionを作ります。③はStripe Webhookの処理で、購読アイテムの処理をさせてます。④では、ユーザの画面をリダイレクトしています。③の処理は④でもできるのですが、この方がセキュアだと判断しました。

しかしまぁ、複雑だなぁ

よかったところ

  1. 意図してたので当然ですけど、複数の組み合わせのplanを購読できるようになった
  2. 画面が変わったのでリニューアル感が出る
  3. StripeのJSのロジックが軽くなった気がする
  4. Legacy版では、サーバサイドでstripe の subscription オブジェクトとcustomerオブジェクトを用意しなければならなかったが、Modern版では必要なくなった。
    • Legacy版で取れてたstripeTokenというパラメータもなくなってるっぽい

ちょっと微妙なところ

  1. クレジットカード情報をどうやってとるのかがよくわからない
    • 今まではLIST ALL CARDS API で取れていたが、とれなくなった
    • おそらくDefaultの支払い方法(?)になるように設定してあげないといけないのだが、CREATE A CARD APIを叩くのかなぁ、ぐらいでよくわからなくなった
  2. subscriptionの請求開始日を指定できなくなった
    • Legacy版では、subscriptionを自前で作ってたので、billing_cycle_anchorを指定して、1日始まりに変えることができてました
    • が、Modern版ではStripe 側でよしなに作られるのですが、Checkout Session API にそういう口はなさそうです。
    • 既存のsubscriptionに対する請求開始日の変更は制限があるようです

その他、注意が必要だったところ

  1. 動作確認してるとStripeのcustomerがとても増える。Dashboardから消せる
  2. 新旧のデータ構造の違いでよく処理が落ちた。
    • 例えば、単数のplan(Legacy版はこのパターンしかない)を購読するか複数のplanを購読するかでsubscriptionオブジェクトのデータ構造が違う
    • 単数なら subscription['plan']
    • 複数なら subscription['items']['data'][INDEX]['plan']
  3. 新旧の料金プラン改定がスムーズに進むよう、コールバックを作るような感じで作業した

おわりに

割とスムーズに進められたかとは思いますが、細かいところがちょっと惜しかったなぁという印象。マイグレによる影響で、既存機能が提供できない、または変更を余儀なくされる部分が出そうです。実はLegacy Checkoutでも複数Planの設定ができるとか、そういう見落としがないことを願うばかりです笑

追伸

「Legacy Checkout では複数のplanを購読することができない」そう思っていた時期もあったのですが、何か違う気がしてきました。Legacy Checkoutはあくまでクレジットカード情報を入力させるための口に過ぎず(購読内容の金額は出ない)、具体的な購読内容はCREATE A SUBSCRIPTION APIで組み立てる、ということかなと。前提が音を立てて崩れ去る、とはこういうことか。私は間違っていたかも。