Laravel × StripeCLIでWebhookをする手順【Mac|超簡単】
こんにちは、シロウです。
今回はLaravelとStripeCLIでWebhookを試す手順を解説していきます。
Stripeを使うなら、Webhookは必ず使う必要が出てきます。
Webhookを使わないと適切なタイミングで処理を実行できないですからね。
ということで、この機会にぜひWebhookの使い方を学習してください!
それでは早速ですが、見ていきましょう。
[box04 title=”Webhookとは?”]ちなみにWebhookとは、特定のイベントが発生した際に外部のアプリに通知する仕組みのことです。
今回の場合は、Stripe側であるイベントが発生した際に、Laravel側に「こんなイベントが発生したよ〜」と教えてくれる感じになります。[/box04]
そもそも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
もっと凝ったリクエストを送りたい場合などは「こちらのドキュメント」などを参考にしてみるのが良きです!