Stripeでクレジットカード期限切れなどによる定期課金失敗に対応
決済サービスのStripeで、定期課金が登録されたクレジットカードの期限切れ等で課金失敗した場合の対応をやりました。
定期課金の決済失敗時の処理
デフォルト機能
[設定] > [サブスクリプションおよびメール] のページで「顧客のメール」の「顧客にメールを送信して、失敗したカードの決済手段を更新してもらいます」をONにすると、画像のようなメールが送信されます。
これで十分ならそのまま使えますが、独自にメールを送る場合は決済失敗のイベントを受け取って自前で処理を実装します。
イベント
決済失敗時は Stripe より Webhook にinvoice.payment_failedイベントが飛びます。
カスタマーポータル
Stripe が提供するカスタマーポータルでは、ユーザーが自身のクレジットカード情報を更新できます。定期課金失敗のイベントを受け取ったら、カスタマーポータルのリンクを案内して有効なクレジットカード情報の登録を促すと良いと思います。
カスタマーポータルのリンクの作成は以下の記事をご参照ください。
リトライ中かどうか(最後のリトライかどうか)を判定する
最後のリトライ後、設定に沿ってサブスクリプションのステータスが変更になります。
ステータスをキャンセルにする設定の場合、最後のinvoice.payment_failed
イベントの直後にキャンセル処理が行われます。
キャンセル後のタイミングでカード更新されてもサブスクリプションは復活しないので、再度サブスクリプションを申し込んでもらう必要があります。(※Stripe ではいったんキャンセルサブスクリプションのステータスを元に戻せない)
そのため、最終リトライ時のinvoice.payment_failed
イベントではカード更新の案内を送らないように処理を分けた方が良いと思います。
invoice.payment_failed
イベントで送信される invoice オブジェクトのnext_payment_attempt
に値が入っていれば次回リトライ予定あり、null
なら最終リトライと判断できます。
事前にカード期限を取得し、更新を促す
デフォルト機能
[設定] > [サブスクリプションおよびメール] で、登録されている顧客のカードの有効期限が切れる 1 カ月前にカード情報のアップデートを促す上記メールが送信されます。
こちらもこれで十分ならそのまま使えばよいですが、カスタマイズするなら以下の要領で実装できます。
カード期限の取得
PaymentMethod オブジェクトにカード期限が保存されています。
PaymentMethod の取得には PaymentMethod ID が必要です。PaymentMethod ID は、以下より取得できます。他にもあるかもです。
- Invoice オブジェクトの default_payment_method から取得する
- customer オブジェクトの invoice_settings->default_payment_method から取得
- customers->allPaymentMethodsで取得
イベント
バッチ処理で月初に処理する他、請求が確定したタイミングで次回請求の案内とともに期限切れを通知してクレジットカード情報の更新を促すこともできます。
この場合、invoice.upcoming
イベントを利用すると、[設定] > [サブスクリプションおよびメール] の「次回の更新イベント」で何日前に通知するかを設定できるので便利です。
まとめ
以上、クレジットカードの期限切れ等で Stripe の定期課金に失敗場合の対応をまとめました。Stripe は多機能なのでドキュメント掘るのが大変ですが、やりたいことがだいたい自前で実装できて便利です。決済失敗時もスムーズなカード情報の更新導線を確保して、顧客が離れてしまうのを防ぎたいものです。では。