LaravelでMailChimpのWebhookを利用する方法を解説します。
メルマガ申し込み・解約・変更等がが起こった時にMailChimpからLaravel側に情報を通知し、Laravel側で処理を実行できます。
「さくっとできるかな」と思ったものの、HTTPリクエストに癖があったりと、わりと手こずりました^^;
手こずりポイントを含めて、ひとつひとつ手順を解説していきますね。
LaravelでMailChimpのWebhookを利用してsubscribe, unsubscribe, updateを通知する方法
次の想定で説明していきます。
- MailChimpのアカウントには既に顧客リスト(Audience)がある
- 連携させたいLaravelのプロジェクトもある
まずはMailChimp側でWebhookの設定からスタートしましょう。
MailChimpにWebhookの設定をする
①MailChimpにログインし、左側からAudienceを選択
②右側の【Manage Audience】プルダウンから【Setting】選択
③Settingメニュー一番下のWebhooks選択
④【Create New Webhook】ボタンをクリック
⑤【Create New Webhook】フォームに入力
下記のように入力します。
1.Callback URL には、ドメイン/mailchimp/webhook としておきます。
2.”What type of updates should we send?”の部分では、Webhookを通じて提供してほしい情報を選択
3.”Only send updates when a change is made …” の部分では、誰が行った変更について通知するかを選択
【Create new webhook入力例】
上記例では、Unsubscribeが起こった場合に通知する、ということにしています。
ちなみに本番URLではなくテストURLを使用したい場合には、NGROKというツールを使うと便利ですよ。ローカル環境でHTTPSテスト環境を手軽に構築できます。
⑥Saveボタンを押して保存します。
Laravel側でMailChimpのWebhookの通知を受け取る設定をする
次にLaravel側の設定をします。
① CSRFの例外設定を行う
Laravelでは最初にCSRFの例外設定を行っておきましょう。
Middleware/VerifyCsrfToken.php ファイルに、下記のようにmailchimpを加えます。
【VerifyCsrfToken.php】
1 2 3 4 5 6 7 8 9 10 11 |
class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'mailchimp/*', ]; } |
これで “ドメイン/mailchimp” で始まるURLの場合には、CSRFルールを無視できます。ここをいれておかないと、CSRFルール違反ということでエラーになってしまいます。
CSRFルールと違反については、下記の記事で詳しく解説しています。詳しく知りたい場合は、併せて読んでくださいね。
② ルート設定を行う
次にルート設定です。resources/routes/web.phpファイルに、下記を加えます。
今回はMailChimpControllerに処理をいれておくことにします。
【web.php】
1 2 3 |
// MAILCHIMPのwebhook処理 Route::get('/mailchimp/webhook', 'MailChimpController@getdata'); Route::post('/mailchimp/webhook', 'MailChimpController@postdata'); |
ここで、getとpost、2つのルート設定を作っておくのがポイント。
実際にはpostしか必要ないのですが、getも入れておかないとエラーになります。
③コントローラに処理を記述
下記コマンドを実行して、MailChimpControllerを作成します。
1 |
php artisan make:controller MailChimpController |
作成したMailChimpControllerに処理をいれていきます。
まずはwebhookを通じて取得した値を取り出します。Unsubscribeの場合には、次のようなデータが送信されます。
【Webhook response: Unsubscribes】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "type": "unsubscribe", "fired_at": "2009-03-26 21:40:57", "data": { "action": "unsub", "reason": "manual", "id": "8a25ff1d98", "list_id": "a6b5da1054", "email": "api+unsub@mailchimp.com", "email_type": "html", "ip_opt": "10.20.10.30", "campaign_id": "cb398d21d2", "merges": { "EMAIL": "api+unsub@mailchimp.com", "FNAME": "Mailchimp", "LNAME": "API", "INTERESTS": "Group1,Group2" } } } |
上記の中からEMAILの値を取り出していきましょう。このEMAIL情報を持つユーザーを探し出し、このユーザーに処理を実行する、というコードを書いていきます。
書き方としては、次のようになります。
【MailChimpController・処理例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; class MailChimpController extends Controller { public function getdata() { // mailchimpのテスト用 return "ok"; } public function postdata(Request $request) { // 送られたデータからEMAILを抽出 $email=array_column($request->input('data'), "EMAIL"); // 同じEMAILをもつユーザーを取り出す $user=User::where('email', $email)->first(); if($user) { // 処理を記述 } return "ok"; } } |
④テストする
最後にテストを行います。
さいごに
ルート設定や値の取り出し方がちょっと面倒ですが、このあたりがクリアできれば、難しくはありません。
Laravelと連携可能なメールシステム、という意味では、MailChimpは最強だと思います。
MailChimpについては別記事でも色々解説しているので、ご興味があれば、関連記事も見てみてくださいね。
MailChimp、実はまだ登録していないという場合は、下記からご登録いただけます。
MailChimpの登録はこちらをクリック
↓↓↓
ページの真ん中あたりに【Sign Up Free】という青緑色のボタンが表示されますが、ここをクリックすると、無料版を登録できます。