Stripe APIとWebhookで、キャンセル済みのサブスクを再開させる方法がわかりにくかった
カスタマーポータルでは無理(これ使えたらどんなにいいことか)
まず、一番最初に、
- キャンセル待ち
- キャンセル済み
が全然違うことを覚えとかないといけない。普通のStripeのキャンセルボタン押した後はキャンセル待ち
になるからそこ注意。
キャンセル済み
は例えば、
1日スタートのサブスクを15日にキャンセル → キャンセル待ち
30日になってようやく → キャンセル済み
になる
なぜ大事かというと、
カスタマーポータルでキャンセル待ち
は復活できるけど、キャンセル済み
は復活できない!!
ちなみに、カスタマーポータルはユーザーがStripeのWeb画面でカード変更やら色々できるから導入するのは絶対おすすめ(自分で作ってもいいけどめんどくさい)
じゃあどうやってキャンセル済みのサブスクを復活させるかというと...
無理!!
...正確には新しいサブスクを作成する必要がある
(でもこれは顧客を2つ作るということじゃなくて、同じ顧客の中にもう一つサブスク作る感じ。なんか変な感じだけど、Stripeのサブスクのキャンセル済みはほぼ削除みたいなイメージかも)
ちなみに、カスタマーポータルで、サブスクの新規追加は無理らしい
顧客はポータルを通じて新しいサブスクリプションを作成できますか?
いいえ。顧客には既存のサブスクリプションの更新またはキャンセルのみが許可されます。まったく新しいサブスクリプションを作成することはできません。カスタマーポータルにリダイレクトする前に、API または Checkout を通じてサブスクリプションを作成できます。
ということで新規追加してあげないとダメ
とは言ってもそんな難しくない
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.
Webhookで注意
invoice.payment_succeeded
とかinvoice
系イベントは来るけど、checkout.session.completed
はこないので注意
checkout.session.completed
だけででstatusをactiveしてたりすると、キャンセル済みからのアップデートでstatusが変わらなかったりする
timestampだけで管理してる人は特に問題ないかな?もちろんどっちのイベントにも入れてると思うし