LoginSignup
0

posted at

LaravelのCashierでwebhookをイベントリスナでアレコレしようとして困った話

■ はじめに

当記事は

↑この記事からの続きです。

Stripeのwebookのことについて書きますが、
Laravelでwebhookをどうやって使えるようにするかの詳細や、
ngrokでwebhookをテストできるよ、ということなどについては
既にたくさん良い記事がありますので
(記事を書いて下さった皆様大変お世話になりました🙇‍♀️)
当記事ではLaravelでStripeからwebhookを受けることができるようになったという前提で、
その後イベントリスナを活用しようとして
少し困ったことがあったので、そのときのことを備忘録的に残しておきたいと思います。

■ ありがとうCashier、ありがとうwebhook

LaravelのCashierではStripeからのwebhookを受けて色々な処理をしてくれます。
Cashierでwebhookを処理できるようにするには、

Laravel 8.x Laravel Cashier (Stripe)
Stripeコントロールパネルで有効にする必要があるすべてのWebフックの完全なリストは次のとおりです。
・ customer.subscription.created
・ customer.subscription.updated
・ customer.subscription.deleted
・ customer.updated
・ customer.deleted
・ invoice.payment_action_required

指定のwebhook6つをStripeのコントロールパネルで有効にする必要があるとのことで、
指示に従いそのように設定。
ちなみに

php artisan cashier:webhook

上記のコマンドを実行すると、.envAPP_URLで定義されているURLに対して
さきほど挙げた指定のwebhook6つをいっぺんにまとめてスコーンと通してくれます。
Stripeのコントロールパネルから地道にぽちぽちせずに済みます。親切!

そしてわたしはサブスクリプションの決済ができるようにしようとしていたところだったのですが、
Stripe上でサブスクリプションの決済が行われた結果をwebhookで受け取り、

  • subscriptionsテーブル
  • subscription_itemsテーブル
  • Stripeのcustomerを扱うテーブル(前回の記事でいうとcompaniesテーブルです)

受け取ったものがこれらのテーブルに入るようになっていました。
webhookを有効にしていさえすれば決済の結果を自動でテーブルに入れてくれるなんて
とってもありがたいですよね〜

■ webhookイベントで追加の処理をしたかった

さて、
webhookがとっても便利なので、webhookを受け取ったついでに他にもやりたいことを思いつきまして。

そのうちのひとつに、
webhookを受け取ったタイミングで、customerのサブスクリプション状態が有効かどうか?を取得したい
ということがありました。

Laravel 8.x Laravel Cashier (Stripe)
Cashierは課金の失敗やその他一般的なStripe Webフックイベントによる、サブスクリプションキャンセルを自動的に処理します。ただし、追加でWebフックイベントを処理したい場合は、Cashierが発行する以下のイベントをリッスンすることで可能です。
・ Laravel\Cashier\Events\WebhookReceived
・ Laravel\Cashier\Events\WebhookHandled

これ↑を読んだわたしは「よーし!リッスンしちゃお!」とウキウキで
リッスンするためのコードやらリッスンしたときにやりたいことのコードやらをせっせと書いたわけです。

...なのですが...

サブスクリプションが有効なのかどうかを全然正しく取得できません...困った...
なんでー??💦

結論を申し上げると、
Laravel\Cashier\Events\WebhookReceivedをリッスンしていたからなのでした!
これですと
受け取ったwebhookをまさしく受け取ったタイミング、かつ、それが処理される前に動いてしまっていました。

わたしはwebhookが処理された後、それが反映された状態を取得したかったため
このような場合は
Laravel\Cashier\Events\WebhookHandledをリッスンしなければならなかったのです〜

WebhookHandledのほうで書き直してみると、ようやく得たい結果を得ることができました。
ああスッキリ!

備忘録的な内容ではありますが、この記事がどなたかのお役に立ちましたら幸いです☀️
お読み頂きましてありがとうございました!

■ まとめ

LaravelのCashierでwebhookイベントをデフォルトの処理に追加してアレコレしたい場合は、
・ Laravel\Cashier\Events\WebhookReceived (webhookが処理される前)
・ Laravel\Cashier\Events\WebhookHandled (webhookが処理された後)
アレコレの内容にあわせて上記2つのうち適している方をリッスンする👂

■ 参考記事

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0