LaravelとStripeを連携させ、StripeのWebhookを利用する方法を解説します。
Webhookを利用するにはHTTPS通信が必要です。
Stripeではローカル環境でもWebhookをテストできるよう、【Stripe Cli】というツールを用意してくれています。
ただ設定などメンドウなので、今回は 【NGROK】を利用してStripeのWebhookのテストをする方法を紹介します。
NGROKを使えば、手軽にHTTPS通信が可能になります。
LaravelでStripeのWebhookを手っ取り早く使う方法
下記の手順で進めていきますね。
- NGROKのアカウントを開設
- STRIPEでWebhookを設定
- Stripeの署名シークレットをLaravelに設定
- Laravelのルート設定
- Laravelのコントローラー設定
- LaravelのCSRF除外設定
- 実際にテストしてみる
①NGROKのアカウントを開設
NGROKのアカウント開設は、こちらの記事をご覧ください。
順調にいけば、10分程度で設定できます。
アカウント作成後、HTTPSのURLを取得しておいてください。
②STRIPEでWebhookを設定
STRIPEにログインし、左側のメニューから 開発者/Webhook をクリックします。
エンドポイントを追加をクリックし、NGROKで取得したURLを入力します。
そのあとに/stripe/webhookと入れておきます。
送信イベントは上記のとおりでもよいですし、ご希望のものがあれば、選んでください。
③Stripeの署名シークレットをLaravelに設定
ここからは、Laravelの設定をガンガン進めていきましょう。
意外とメンドウですが。
どれか設定し忘れるとエラーになっちゃいます。
最初にStripeの署名シークレットをLaravelに設定し、連携をすすめます。
Stripeにログインし、開発者/Webhookより、先ほど設定したWebhookをクリックします。
【署名シークレット】という項目があるので、クリックして表示し、コピーしてください。
Laravelの.envファイルに貼り付けます。
さらにapp/config/services.phpファイルに、この情報を入れておきます。
1 2 3 4 |
'webhook' => [ 'secret' => env('STRIPE_WEBHOOK'), 'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300), ], |
細かい書き方は人によって違うと思います。
上記は一例ということで、ご覧ください。
④Laravelのルート設定
Laravelのルート設定を行います。
routes/web.phpファイルに下記を追加してください。
1 2 |
// webhook処理 Route::post('stripe/webhook', 'WebhookController@handleWebhook'); |
⑤Laravelのコントローラー設定
次にコントローラーです。
下記のコマンドで、webhook用コントローラーを作成します。
1 |
php artisan make:controller WebhookController |
コントローラーファイルの上部に、下記を入れておきます。
1 2 3 4 5 6 7 8 |
<?php namespace App\Http\Controllers; use Laravel\Cashier\Http\Controllers\WebhookController as CashierController; use Illuminate\Http\Request; class WebhookController extends CashierController { |
次に、②で設定したイベントごとに、public functionで始まる処理をいれていきます。
ここで、ひとつ注意点があります。
webhook処理のメソッド名には、実はルールがあります。
Laravelの公式マニュアルには、下記のように書かれています。
とくにメソッドはhandleのプレフィックスで始まり、処理したいStripeのWebフックの名前を「キャメルケース」にします。
*参考元:Laravelマニュアル 【Cashier 8.x Laravel】
たとえば customer update 時に処理を行いたい場合、メソッド名は【handleCustomerUpdated】とする必要があります。
コントローラーには、次のように記述します。
1 2 3 |
public function handleCustomerUpdated($payload){ 処理を記述 } |
【処理を記述】部分に、イベントが実施されたときに自動的に行われる処理を入れてください。
⑥LaravelのCSRF除外設定
さいごに忘れてはいけないのが、CSRF除外の処理。
Laravelでは、POSTで送信される際には、必ずCSRF対策を入れなければいけません。
「CSRFってなんだっけ?」と思ったら、こちら。
分かりやすく解説したので、気軽に読んでみてください。
Webhookの処理は【POST】メソッドを使いますが、CSRF対策を入れられません。
そこで、「こういう時は例外にしておいて」とLaravelに設定する必要があります。
app/Http/Middleware の VerifyCsrfToken.phpを開き、下記を追加しておきましょう。
1 2 3 |
protected $except = [ 'stripe/*', ]; |
ドメイン名/stripe/ で始まるURLでは、CSRF対策は行われない、という意味になります。
⑦ 実際にテストしてみる
設定した処理が行われるかテストをしてみましょう。
Laravelのプロジェクトをブラウザに表示させます。
送信するボタンを押した後、Stripeにログインし、開発者/Webhook をクリック。
作成したWebhook名をクリックすると、処理がうまくいったかどうかが表示されます。
成功した場合には、下記のように表示されます。
失敗した場合には、クリックすると、エラーの詳細を確認できます。
NGROKについて補足説明
最後に、NGROKについて、補足で2点説明を入れておきますね。
使い慣れていない方は、ぜひこちらも読んでおいてください。
NGROKについて、補足説明 ①
なお上記のような形でNGROKを使う場合、ローカルで使うURLは、NGROKによって生成されたものでも、通常の【http://127.0.0.1/】でもOK。
NGROK側で 【NGROKによるURL=デフォルトのローカルアドレス】と設定しているからです。
NGROKについて、補足説明 ②
なおNGROKは、起動させるたびに違うURLが生成されます。
一度閉じて再度起動させたら、それに応じて、STRIPEのエンドポイントに設定したURLも変更しておきましょう。
なおWebhookのおすすめendpointsは下記記事で紹介しています。
悩んだら、読んでください。
StripeとLaravelの連携は、関連記事でも解説しているので、併せて参考にしてくださいね。
コメント
参考にさせて頂きました。
Cashierはバージョンによっていろいろ違うみたいですね。
ありがとうございました。
イマイさん、
コメントありがとうございます!
バージョンによって変えねばいけないのは、面倒ですね^^;
記事が少しでもお役にたったならうれしいです。
追伸:
本記事を見返して、1点、間違いに気づきました。
当初はNGLOKはポート番号80しかダメかと思っていましたが、8000でも大丈夫でした。
記事を書きなおしました。
コメントのおかげで修正できました。ありがとうございますm(__)m