【Laravel】Googleマップのクチコミ施策をビアバー50件回って考えてみた

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、ビール醸造所を累計 50件以上回ったことがある私が、ITを活用してこんな施策をやったらどうだろう?と思うものがあります。

それは、特に飲食店のような実店舗ビジネスに重要なのですが、この名前を聞いたことはあるでしょうか。

MEO(マップ・エンジン・オプティマイゼーション)

つまり「Googleマップに特化して」自分のお店を優位にする施策のことです。というのも、飲食店を探すときよく使われるのが「Googleマップ」だからなんですね。

そして、「飲食店はMEOゲー(MEOが最も大事なゲーム)」と解説しているマーケターさんもいるぐらい影響が大きいので、ここを攻略することが飲食店にとっても売上につながるわけです。

そして、MEOでは評価のいいクチコミが重要な指標になっていると言われています。

そこで❗

今回はLaravelを使って「クチコミを増やす施策」を実装してみたいと思います。

ぜひ最後まで読んでくださいね。😊✨

「ウェストコースト系
のクラフトビール🍺
うまいよねぇ!!!」

開発環境: Laravel 11.x

【前提として】Google マップのクチコミ施策には LINE Messaging API を使う

今回の施策は以下の流れで実装します。

  1. 会計のとき LINE公式アカウントでお友達になってもらう
  2. 帰宅したぐらいを見計らってアフターフォロー
  3. Google マップへのレビュー投稿を依頼する

※ ただしタイマーを実装すると複雑すぎるので、今回はリアルタイムで返信するようにします。

そのため、LINE Messaging APIが使えるようになっていることが前提です。

以下のページを見て、準備しておいてください。

  • LINE Messaging API を有効にする
  • ウェブフックを有効にする
  • パッケージ「linecorp/line-bot-sdk」をインストールする
  • CSRFトークンのチェックを解除

📝 参考ページ1: Line Messaging API で画像つき通報システムをつくる(神戸市に影響されて)

📝 参考ページ2: おまけ: ngrok について

📝 参考ページ3: CSRFトークンのチェックを解除する

※なお、Laravel 11.xからCSRFトークン解除の設定方法が変わっていますので注意してください。

Google マップのクチコミ URL を取得しておく

まず、特定のお店のレビュー投稿がすぐできるURLを先に取得しておきましょう。

手順は以下のとおりです。

Google マップで対象のお店をクリックする

クチコミを投稿させたいお店をGoogleマップで検索し、詳細を表示する

「共有」をクリック

詳細の中にある「共有をクリック」する

クチコミリンクをクリック

「地図を埋め込む」タブを選択し、口コミのリンクをクリック。

クチコミを書くボタンをクリック

すると、クチコミのポップアップが出るので右上の「クチコミを書く」をクリック。

URLを取得

表示が変わったら、その状態でブラウザのURLを取得してください。
このURLにアクセスするといきなりレビューフォームが表示されることなります。

※ただし、Googleにログインする必要があります。

では、忘れないように.envへ以下のようにセットしておきましょう。

GOOGLE_MAP_REVIEW_URL="(ここにあなたのURL)"

Google マップのクチコミを返信するコントローラーをつくる

では、LINEからウェブフックが来たら自動でGoogleマップのURLを返信するコントローラーをつくりましょう。

以下のコマンドを実行してください。

php artisan make:controller LineWebhookController

そして、作成されたファイルを以下のように変更してください。

app/Http/Controllers/LineWebhookController.php

<?php

namespace App\Http\Controllers;

use GuzzleHttp\Client as GuzzleClient;
use Illuminate\Http\Request;
use LINE\Clients\MessagingApi\Configuration;
use LINE\Clients\MessagingApi\Api\MessagingApiApi;
use LINE\Clients\MessagingApi\Model\ReplyMessageRequest;
use LINE\Clients\MessagingApi\Model\TextMessage;
use LINE\Parser\EventRequestParser;
use LINE\Webhook\Model\FollowEvent;

class LineWebhookController extends Controller
{
    private $channel_secret, $access_token;

    public function __construct()
    {
        $this->channel_secret = env('LINE_CHANNEL_SECRET'); // 本来は config から取得すべきです
        $this->access_token = env('LINE_ACCESS_TOKEN'); // 本来は config から取得すべきです
    }

    public function receive(Request $request)
    {
        logger($this->channel_secret);
        $request_body = $request->getContent();
        $hash = hash_hmac('sha256', $request_body, $this->channel_secret, true);
        $signature = base64_encode($hash);

        if($signature === $request->header('X-Line-Signature')) {

            $client = new GuzzleClient;
            $config = new Configuration();
            $config->setAccessToken($this->access_token);

            $this->api = new MessagingApiApi(
                client: $client,
                config: $config,
            );

            try {

                $event_parser = EventRequestParser::parseEventRequest($request_body, $this->channel_secret, $signature);

                foreach($event_parser->getEvents() as $event) {

                    if($event instanceof FollowEvent) { // お友達の登録したとき

                        $reply_token = $event->getReplyToken();
                        $line_id = $event->getSource()->getUserId();
                        $mode = $event->getMode();
                        $profile = $this->api->getProfile($line_id);
                        $display_name = $profile->getDisplayName();

                        if(is_null($line_id) || is_null($mode)) {

                            continue;

                        }

                        $google_map_review_url = env('GOOGLE_MAP_REVIEW_URL');
                        $text = view('line_webhook.google_map_review', [
                            'display_name' => $display_name,
                            'google_map_review_url' => $google_map_review_url,
                        ])->render();
                        $this->replyText($reply_token, $text);

                    }

                }

            } catch (\Exception $e) {}

        } else {

            abort(404);

        }
    }

    private function replyText(string $reply_token, string $text)
    {
        $message = new TextMessage([
            'type' => 'text',
            'text' => $text,
        ]);
        $request = new ReplyMessageRequest([
            'replyToken' => $reply_token,
            'messages' => [$message],
        ]);

        $this->api->replyMessage($request);
    }
}

この中ではLINEウェブフックの基本的な返信をしているだけです。

Google マップのクチコミをうながす返信テキストをつくる

では、先ほどのLineWebhookControllerでセットした「クチコミを促す文章」をbladeでつくります。

以下のコマンドを実行してください。

php artisan make:view line_webhook.google_map_review

すると、ビューファイルが作成されるので中身を以下のように変更します。

resources/views/line_webhook/google_map_review.blade.php

{{ $display_name }} さん、本日は「ビアバーすこひ」へご来店いただきありがとうございます!

お店独自で醸造しているビールのお味はいかがでしたか?
ぜひ、Googleマップにてお店のクチコミを投稿していただけると嬉しいです!

Google マップに感想を書き込む
 ↓↓↓
{{ $google_map_review_url }}

また、当店公式のオンラインショップもございますので、お気軽にご利用ください。
オンラインショップはこちら
 ↓↓↓
https://sukohi-beer-bar.example.com

今後とも「ビアバーすこひ」をよろしくお願いいたします!

ちなみに、この中の$google_map_review_urlの部分が先ほどGoogleマップで取得したURLになります。

Google マップのクチコミ返信するためのルートをつくる

では、先ほどのコントローラーがウェブフックとしてアクセスできるようにルートを登録しておきましょう。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LineWebhookController;

Route::post('line_webhook', [LineWebhookController::class, 'receive']);

Google マップのクチコミ返信するウェブフックの CSRF ブロックを解除する

Laravelは初期状態ではCSRF攻撃ができないように必ずトークン付きでしかフォーム送信できないようになっています。

しかし、これだとウェブフックも拒否されてしまうのでウェブフックのURLを解除しておきます。

bootstrap/app.php

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->validateCsrfTokens(except: [ // 👈 ここを追加しました
            'line_webhook',
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Laravel 11.xから設定が変更になりましたね。
気をつけてください!

これで作業は完了です。
お疲れ様でした!😊✨

テストしてみる

では、実際にテストしてみましょう❗

では、実際にLINEでお友達になってみましょう。

すると・・・・・・

では、マップのURLにアクセスしてみます。

どうなるでしょうか・・・・・・

はい❗
レビューフォームが表示されました。(ダークモードですみません!)

成功です😊✨

Google マップのクチコミを施策として考えている企業様へ

今回の機能を実際に使うとしたら以下のようにするとよりプラスになるんじゃないかと考えてます。

  • 会計時にお友達登録してもらうわけですが、評価を低くしそうな人には話を振らない(触らぬ神にたたりなしです)
  • 今回はリアルタイムで返信しましたが、本当は家に帰って「あのビールうまかったな」ぐらいのタイミングが一番かもしれません。なので、タイマー実行で、帰宅のタイミングか数日後にプッシュ送信してもいいかもしれません。
  • GoogleマップのURLは長いので短縮URLを使った方がいいかもですね。
  • もしプッシュ通知も実装するなら、新しい商品が出たときとか、あまりお客さんがいないときに「割引情報」とかを送信してもいいかもですね。

もしこういった施策をお考えの方はぜひお問い合わせからご相談ください。
お待ちしております。😊✨

おわりに

ということで、今回はLaravelGoogleの口コミ施策を実装してみました。
LINEを使ってリストをとっておくと、いろいろな広がりをもったマーケティングに繋げられますね。

ちなみに実際のビール醸造所であった例では、以下のような流れにしているところもありました。

  1. 注文フォームへ移動する QRコードを読み取る
  2. 読み取ったら、まずは LINE の友達登録をお願いする(←うまい!)
  3. 友達になる、ならない関係なくウェブサイトで注文
  4. 数日後アンケート依頼
  5. 回答したら割引クーポンゲット(←リピーター施策!!)

こんなふうに見てみるとやはりご商売する人はいろんなアイデアを考えているんだな、と感心します。

ということで、今後もビールを飲みに行って頭の中で「ここのお店はこうすればもっと…」みたいなトレーニングを続けたいと思います。

いや、ビールが飲みたいだけじゃなくて。
いやいや、ホントのホントに。

ではでは〜🍻

「Twitter マスター講座の影響で
趣味アカウントのいいね数が
増えてきた!」

このエントリーをはてなブックマークに追加       follow us in feedly  
開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ