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】
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】
// MAILCHIMPのwebhook処理
Route::get('/mailchimp/webhook', 'MailChimpController@getdata');
Route::post('/mailchimp/webhook', 'MailChimpController@postdata');
ここで、getとpost、2つのルート設定を作っておくのがポイント。
実際にはpostしか必要ないのですが、getも入れておかないとエラーになります。
③コントローラに処理を記述
下記コマンドを実行して、MailChimpControllerを作成します。
php artisan make:controller MailChimpController
作成したMailChimpControllerに処理をいれていきます。
まずはwebhookを通じて取得した値を取り出します。Unsubscribeの場合には、次のようなデータが送信されます。
【Webhook response: Unsubscribes】
{
"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・処理例】
<?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】という青緑色のボタンが表示されますが、ここをクリックすると、無料版を登録できます。






コメント