プログラミング

Laravel × StripeCLIでWebhookをする手順【Mac|超簡単】

こんにちは、シロウです。

今回はLaravelとStripeCLIでWebhookを試す手順を解説していきます。

Stripeを使うなら、Webhookは必ず使う必要が出てきます。
Webhookを使わないと適切なタイミングで処理を実行できないですからね。

ということで、この機会にぜひWebhookの使い方を学習してください!

それでは早速ですが、見ていきましょう。

 

Webhookとは?

ちなみにWebhookとは、特定のイベントが発生した際に外部のアプリに通知する仕組みのことです。

今回の場合は、Stripe側であるイベントが発生した際に、Laravel側に「こんなイベントが発生したよ〜」と教えてくれる感じになります。

そもそもStripeCLIとは?

公式ドキュメントには下記のようにあります。

Stripe CLIは、ターミナルから直接Stripeとの統合を構築、テスト、および管理するのに役立つ開発者ツールです。Stripe CLIはインストールが簡単で、macOS、Windows、およびLinuxで動作し、Stripeの開発者エクスペリエンスを向上させるためのさまざまな機能を提供します。 ストライプCLI

要するに、『Stripe CLIを使えばターミナルからWebhookのテストをできて簡単だよ』って感じかなと思います。

もしStripeCLIを使わずにWebhookを試したいなら、「StripeのダッシュボードでWebhookの設定をする」→「ngrokなどを使ってHTTPS接続を可能にする」→「テストする」という流れになり、少し面倒ですからね。

StripeCLIを使ってWebhookする手順

Webhook用のルーティングとコントローラーを追加

Webhookを試すためにはルーティングを追加する必要があります。

web.phpを開いて、ルーティングを追加してください。

皆さんが好きなように設定してもらって良きですが、今回は下記のようにしました。

//web.php

Route::post('/stripe/webhook',[StripeWebhookController::class,'webhook']);

 

次に対応するコントローラー(今回はStripeWebhookController)も作成してきます。

php artisan make:controller StripeWebhookController

これでapp/Http/Controllers/StripeWebhookController.php ができたはずです。

この中にWebhookを受け取るようのアクションも記述しておきます。

//app/Http/Controllers/StripeWebhookController.php

public function webhook(){
  //ここで受け取りたい処理を記述。
}

これでOK。

次にStripeCLIをインストールしていきます。

CSRF保護を外しておく

csrf保護を外しておかないと、エラーになってしまうので、app/Http/Middleware/VerifyCsrfToken.php に下記のように記述してください。

protected $except = [
        'stripe/*',
    ];

HomebrewでStripeCLIをインストール

Homebrewを使って、StripeCLIをインストールしていきます。

ターミナルで下記コマンドを実行してください。

brew install stripe/stripe-cli/stripe

これでStripeCLIをインストールすることができました。

Stripeにログイン

次にStripeにログインする必要があるので、ターミナル上で下記コマンドを実行します。

stripe login

//下記の表示が出るで、エンターキーを押す。
Press Enter to open the browser (^C to quit)

stripe login を実行すると、エンターキーを押すように求めらるので、指示通りエンターキーを押しましょう。

すると、ブラウザ上でタブが開いて、ログインを許可するかどうかを求めらるので、許可してあげましょう。

Stripeで発行されたイベントをリッスンし、Laravelに転送する

次にStripeでイベントが発行されたらリッスン(通知を受け取ること)して、Laravel側に転送できるようにします。

ただ単にリッスンしたいだけなら、下記コマンドでOK。

stripe listen

ただ、これだとイベントが発行されたらターミナルでその情報がわかるだけです。

そのため、下記のコマンドを実行して、リッスンしたらLaravel側にもその情報を転送するようにします。

stripe listen --forward-to localhost:8000/stripe/webhook

localhost:8000/stripe/webhook の部分は自分でwebhookを受け取りたいエンドポイント(web.phpで決めたURL)を指定してください。

イベントをトリガーする

あとはイベントをトリガーしてあげればOKです。

stripe trigger payment_intent.created

例えば、上記のようにコマンドを実行すれば、ターミナルでは下記のように表示されるはずです。

Ready! Your webhook signing secret is '{{WEBHOOK_SIGNING_SECRET}}' (^C to quit)
  YYYY-MM-DD HH:MM:SS  -->  payment_intent.succeeded [{{WEBHOOK_EVENT_ID}}]
  YYYY-MM-DD HH:MM:SS  <--  [200] POST http://localhost:8000/stripe/webhook [{{WEBHOOK_EVENT_ID}}]

これはターミナル上でイベントのリッスンに成功し、それをLaravel側のエンドポイントに転送しているよ〜ということ。

なので、Laravel側で記述した処理も実行されているはずです。

ちなみに他にも、下記のようなトリガーコマンドが用意されているので、状況に応じて使い分けてみましょう。

 balance.available
  charge.captured
  charge.dispute.created
  charge.failed
  charge.refunded
  charge.succeeded
  checkout.session.async_payment_failed (NOTE: needs to be run with a UK Stripe account)
  checkout.session.async_payment_succeeded (NOTE: needs to be run with a UK Stripe account)
  checkout.session.completed
  customer.created
  customer.deleted
  customer.source.created
  customer.source.updated
  customer.subscription.created
  customer.subscription.deleted
  customer.subscription.updated
  customer.updated
  invoice.created
  invoice.finalized
  invoice.payment_failed
  invoice.payment_succeeded
  invoice.updated
  issuing_authorization.request
  issuing_card.created
  issuing_cardholder.created
  payment_intent.amount_capturable_updated
  payment_intent.canceled
  payment_intent.created
  payment_intent.payment_failed
  payment_intent.succeeded
  payment_method.attached
  plan.created
  plan.deleted
  plan.updated
  product.created
  product.deleted
  product.updated
  setup_intent.canceled
  setup_intent.created
  setup_intent.setup_failed
  setup_intent.succeeded
  subscription_schedule.canceled
  subscription_schedule.created
  subscription_schedule.released
  subscription_schedule.updated

 

もっと凝ったリクエストを送りたい場合などは「こちらのドキュメント」などを参考にしてみるのが良きです!