LaravelでStripeのサブスクキャンセル処理をする3つの方法【Laravel上、Stripe上、Webhook利用】

Laravel上の決済機能
スポンサーリンク

Laravel上でStripeのサブスクプランのキャンセル方法を紹介します。

次の3つに分けて解説していきますね。

  1. Laravel上にキャンセルボタンを作る
  2. Stripeのカスタマーポータル上でキャンセルできるようにする
  3. 2.の方法+Webhookを利用

下記のようにメリット・デメリットが異なります。

面倒レベル

(◎→らくちん)

Laravelテーブルへの反映 カスタマイズしやすさ
①Laravel上
画面作りがメンドウ
②Stripeカスタマーポータル上 × ×
③Webhook利用
連携が最初メンドウ

状況に応じて、使い分けてくださいね。

なおLaravelとStripeを連携させてサブスク申込フォームを作る方法は、別記事にまとめてあります。

スポンサーリンク

LaravelでStripeのキャンセル処理をする:Laravel上で実施

まずはLaravel上で処理を行う方法を解説します。

①Laravelにボタンを設置する

たとえば、次のようなキャンセルボタンを設置します。

blade.phpファイルには、次のように記述します。

②ルート設定を入れる

ルート設定例はこちら。

③コントローラーにcancelメソッドを入れる

コントローラーはこちら。

cancelメソッドを使います。

$user->subscription(‘プラン名’)->cancel();

解約に伴って実施したい処理があれば、コントローラー内に入れておきましょう。

④テストをしてみる

それではテストをしてみます。

実際にLaravel上でキャンセルボタンを押して解約手続きをします。

キャンセル後、usersテーブルをチェックしてみてください。

次のように ends_at カラムにサブスク終了予定日が入力されていれば成功!

Stripe側もチェックしておきましょう。

Stripeにログインし、左側のメニューから顧客/定期支払情報をチェックすると、次のように表示されます。

⑤今すぐ解約の場合はcancelNowメソッドを使う

cancelメソッドは次の解約日に更新しないようにできます。

「今すぐキャンセルにしたい」場合には、cancelNowメソッドが使えます。

Laravel上での処理のメリット・デメリット

Laravel上で処理するメリットは、StripeにもLaravelのテーブルにも処理を反映させられます。

色々とカスタマイズも可能です。

デメリットとしては、Laravelのプロジェクト内にStripeのキャンセルボタンを設置したりする手間が増えること。

Stripe側にすべてお任せしたほうが、ラクですよね。

LaravelでStripeのキャンセル処理をする:カスタマーポータル上

次に、Stripeのカスタマーポータルを利用して行う処理を解説します。

Stripeに処理を任せられるので、ラクです。

①カスタマーポータル用リンクを設置する

Laravel上にカスタマーポータルへのリンクを置いておきます。

redirectToBillingPortalメソッドで、ユーザー用のカスタマーポータルにリンクが貼れます。

コントローラーには、次のように記述します。

ルート設定例はこちら。

ビューファイルへは、次のようなボタンを設置しておきます。

blade.phpファイル記述例はこちら。

これでLaravel側の処理は終わりです。

②Stripe側の設定をする

Stripe側でもカスタマーポータルの設定をしておきましょう。

Stripeにログインし、左側の設定メニューをクリック。

Billingメニューの中の【カスタマーポータル】を選択します。

ここで、「定期支払いをキャンセル」を有効にしておくと、カスタマーポータルを通じて、顧客がキャンセル処理を行えるようになります。

じゅんこ
じゅんこ

デフォルトでは有効になっていたかと思いますが、チェックしておいてくださいね。

③ テストをしてみる

ではテストをしてみます。

顧客としてサブスク申込後、カスタマーポータルボタンをログインしてみます。

すると、次のような画面が表示されます。

「プランをキャンセル」をクリックすると、次のような確認画面が表示されます。

再度「プランをキャンセル」を押すと、キャンセルが実行されます。

サブスクなので、次回更新日までは使用できますが、その後に自動更新はされなくなります。

Stripeにログインし、顧客/定期支払情報をチェックしてみましょう。

次のように記録されていれば成功。

ただし残念なことに、Laravel側のテーブルには処理が反映されていません。

subscriptionテーブルを見てみると、stripe_statusは【active】のままです。

カスタマーポータルでの処理のメリット・デメリット

このようにカスタマーポータル上で処理するとラクです。

ただし、Laravelのテーブル上に履歴が残せませんし、カスタマイズできないのが難点。

この不便さを補うには、次に解説するwebhookを利用する手があります。

LaravelでStripeのキャンセル処理をする:Webhookを利用

Webhookを利用する際には、次の流れで処理を行っていきます。

  1. Stripeのカスタマーポータル上で処理を実行(前項)
  2. Webhookを使ってLaravel側に通知
  3. Laravel側で処理を発動させる

1は前項で解説済みなので、そのあとの手順から説明していきます。

①Webhookの設定をする

まずはWebhookのキーをLaravelに入れ込んでおきましょう。

テスト環境の場合には、Stripe CliまたはNglokなどの設定も必要です。

このあたりは、下記の記事をご覧ください。

Webhookのエンドポイントで「customer subscription deleted」を選択しておきます。

②ルート設定をする

次のルート設定を追加します。

なお、Webhookのルート設定に制限がかかっているとエラーになります。

ミドルウェアや認証の影響がないようにしておきましょう。

③コントローラーを追加する

新しくWebhook用のコントローラーを作成します。

この中に処理をいれていきます。

たとえば、LaravelのSubscriptionテーブルにキャンセルの処理を反映させるようにしてみます。

【status_status】をcanceledにし、【ends_at】にCarbonを使って日付をいれてみましょう。

use宣言は次のようにします。

ひとことメモ

ここでは【Carbon】を使います。Carbonは時間・日付操作のためのライブラリ。下記のコマンドでインストールできます。

コントローラーはこちら。

④テストをしてみる

それでは実際にテストしてみます。

Stripeのカスタマーポータル上でユーザーがキャンセル処理を実施します。

Stripe側の顧客/定期支払情報でキャンセル済になっているはずです。

さらにLaravelのSubscriptionテーブルにも処理が反映されていれば成功!

うまくいかない場合

もしうまくいかない場合には、Stripeにログインし、開発メニュー/Webhookから、Webhookをチェックしてみてください。

画面下部の【Webhook】で失敗した履歴をクリックすると、失敗の原因が表示されます。

HTTPステータスコードが500となっていれば、Laravel側の処理に問題がある可能性あり。

コントローラーの記述などチェックしてくださいね。

じゅんこ
じゅんこ

レスポンスの部分にエラーの原因がより詳細に記述されているので、参考になります。

Webhook処理のメリット・デメリット

Webhookは難易度的には一番メンドウ。

ただ、方法としては一番スマートな方法だと思います。

さいごに

LaravelとStripeの連携は一筋縄でいかないときもあります。

エラーが起こったら、それが連携部分にあるのか、Laravelのコントローラーの記述にあるのか。

原因を探りあてて、ひとつずつ解決していきましょう。

ハッキリ言って手間がかかりますが><

Stripeの需要は高まっていくと予想されるので、試行錯誤の経験はきっと役に立ちます。(←と、自分に言い聞かせ中)

じゅんこ
じゅんこ

LaravelとStripeの連携は他でもがっつり紹介中です。

下記がまとめ記事です。あわせてお役立てください。

Laravel上の決済機能

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中!
会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

【個別サポート実施中】

「本ブログに記載の方法を試してみたけれど、うまくいかない」「コードを見てほしい」という方のために、有償でメールサポートいたします。以下のボタンをクリックして相談フォームにアクセスして下さい。

詳しく見る

Twitter始めました。
スポンサーリンク
40代からプログラミング!

コメント

タイトルとURLをコピーしました