Open3

Stripe APIとWebhookで、キャンセル済みのサブスクを再開させる方法がわかりにくかった

FBD TechFBD Tech

カスタマーポータルでは無理(これ使えたらどんなにいいことか)

まず、一番最初に、

  • キャンセル待ち
  • キャンセル済み

が全然違うことを覚えとかないといけない。普通のStripeのキャンセルボタン押した後はキャンセル待ちになるからそこ注意。
キャンセル済みは例えば、
1日スタートのサブスクを15日にキャンセル → キャンセル待ち
30日になってようやく → キャンセル済み
になる

なぜ大事かというと、
カスタマーポータルでキャンセル待ちは復活できるけど、キャンセル済みは復活できない!!
ちなみに、カスタマーポータルはユーザーがStripeのWeb画面でカード変更やら色々できるから導入するのは絶対おすすめ(自分で作ってもいいけどめんどくさい)

じゃあどうやってキャンセル済みのサブスクを復活させるかというと...

無理!!

...正確には新しいサブスクを作成する必要がある
(でもこれは顧客を2つ作るということじゃなくて、同じ顧客の中にもう一つサブスク作る感じ。なんか変な感じだけど、Stripeのサブスクのキャンセル済みはほぼ削除みたいなイメージかも)

ちなみに、カスタマーポータルで、サブスクの新規追加は無理らしい

顧客はポータルを通じて新しいサブスクリプションを作成できますか?

いいえ。顧客には既存のサブスクリプションの更新またはキャンセルのみが許可されます。まったく新しいサブスクリプションを作成することはできません。カスタマーポータルにリダイレクトする前に、API または Checkout を通じてサブスクリプションを作成できます。

FBD TechFBD Tech

ということで新規追加してあげないとダメ

とは言ってもそんな難しくない

customer_id='cus_00000000' # これはDBでUserと紐付けとかないとダメ
payment_methods=stripe.PaymentMethod.list(
    customer=customer_id,
)
stripe.Subscription.create(
    customer=customer_id,
    items=[{
        'price': 'price_000000000', # 管理画面からコピペ(サブスクの価格のところに書いてる、環境変数にしたほうがいいと思う)
    }],
    default_payment_method=payment_methods.data[0].id, # これないとエラー出る
)

このdefault_payment_methodないとエラー出るから注意

This customer has no attached payment source or default payment method. Please consider adding a default payment method.
FBD TechFBD Tech

Webhookで注意

invoice.payment_succeededとかinvoice系イベントは来るけど、checkout.session.completedはこないので注意
checkout.session.completedだけででstatusをactiveしてたりすると、キャンセル済みからのアップデートでstatusが変わらなかったりする
timestampだけで管理してる人は特に問題ないかな?もちろんどっちのイベントにも入れてると思うし