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

LaravelとStripe API連携

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

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

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

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

面倒レベル

(◎→らくちん)

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

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

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

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

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

①Laravelにボタンを設置する

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

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

$userはコントローラーで定義して受け渡してください。

②ルート設定を入れる

ルート設定例はこちら。

③コントローラーに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上で行っておき、データベースに情報が記録されている必要があります。

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

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

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

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

ルート設定例はこちら。

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

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

$userはコントローラーで定義して受け渡してください。

これで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とStripe API連携

【Laravelの教科書・プレゼント】

Junko
Laravelの使い方を覚えたい!と思ったら、ぜひ、役立ててほしいです。 基礎編は無料でプレゼント中です♪
ひつじプログラマ
会員制サイトをいちから作っていくよ。ボタンをクリックして詳細を見てね。
Laravelの教科書の詳細を見る

最新のLaravel11版テキストに加え、Laravel8版・Laravel9版・Laravel10版もご用意しています♪

【無料プレゼント】

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

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

詳細はこちらをクリック

最新のLaravel11版テキストに加え、Laravel8版・Laravel9版・Laravel10版もご用意しています♪

Laravelの教科書限定コミュニティ【Laravelの教科書ラボ】はじめました。

デプロイ講座とVue.js講座付

StripeやChatGPT連携など過去10回分のセミナー動画視聴可能。

Laravel実践スキルをのばしたい方におすすめです。

ラボの案内を見てみる

【AWS関連・Webアプリ開発・生成AIのAPI活用のご相談承ってます】
お気軽にお声がけください。
御社にとって、最善の方法をご一緒に考えてまいります。
Zoomミーティング実施中。サンプルアプリご利用可能です。

お問合せフォーム

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。
Laravel10対応。Laravel11サポートガイドもご用意しています。詳しくは下記ボタンをクリック♪

書籍の詳細を見てみる

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

最新版Laravel11用のサポートガイドご用意しています。

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。

書籍の詳細を見てみる
Twitter始めました。
40代からプログラミング!

コメント

  1. 佐藤樹 より:

    はじめまして、拝見させていただきました。
    【Laravel8にSTRIPEでサブスクリプション機能を付ける10ステップ】
    から
    【LaravelでStripeのサブスクキャンセル処理をする3つの方法】
    をやらせてもらいました。
    ① ② ③を実施するとUndefined variable: user
    になります。

    • Junko Junko より:

      $userが定義されていないためだと思われます。

      記事では省略していましたが、記事を修正し、
      「$userはコントローラーで定義して受け渡してください。」
      の一文追記しました。

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