PHP
laravel
linebot

[PHP] Laravel 5.7 と LineBot を連携するのにすごく苦労した話

概要

heroku にデプロイした Laravel アプリを Line Bot と連携したくて四苦八苦したお話

環境情報

  • PHP 7.2
  • Laravel 5.7

連携までの主な流れ

Laravel と Line Bot の連携に必要な流れは主に以下の通り

  1. Laravel に line-bot-sdk を入れる
  2. webhook 用のルートを用意する
  3. ルート用の処理を書く(コントローラー用意など)
  4. Laravel アプリケーションを公開ウェブサーバーに置く
  5. LINE Developers コンソールから Webhook の設定を行う
  6. 接続確認を行う

1 と 3 は大体公式サンプル通りでよく
4 は今回は heroku を利用したためそこまで問題ではなかったです
5 も route 指定するだけ、、、
それ以降は流れに身を任せて、、、

ということで 2 の部分で詰まってました(という初歩的な感じ ... ??)

2 以外の部分を軽く

sdk を入れる

$ composer require linecorp/line-bot-sdk 

ルート用の処理(今回は callback コントローラーを用意)
hoge なら ok, それ以外なら ng を返すだけのやーつです

<?php

...
...

class CallbackController extends Controller
{
    /**
     * @param Request $request
     */
    public function index(Request $request)
    {
        $httpClient = new CurlHTTPClient(env('CHANNEL_ACCESS_TOKEN'));
        $bot        = new LINEBot($httpClient, ['channelSecret' => env('CHANNEL_SECRET')]);

        $signature = $request->header(LINEBot\Constant\HTTPHeader::LINE_SIGNATURE);
        $events    = $bot->parseEventRequest($request->getContent(), $signature);

        /** @var LINEBot\Event\MessageEvent\TextMessage $event */
        foreach ($events as $event) {
            // todo: event は TextMessage だけじゃないので後で分岐処理
            $msg = $event->getText();

            if ('hoge' === $msg) {
                $bot->replyText($event->getReplyToken(), 'ok');
            } else {
                $bot->replyText($event->getReplyToken(), 'ng');
            }
        }
    }
}

Laravel アプリケーションを公開ウェブサーバーに置く
heroku でごにょごにょ(今回は設定部分は省略)

$ git push heroku master

どういうエラーが起きたのか?

こういう 419 エラーが来ました

2018-10-11T13:42:40.861203+00:00 heroku[router]: at=info method=POST path="/callback" host=zaikok.herokuapp.com request_id=25d43ef7-f3e0-4f8d-80be-4435e805a704 fwd="203.104.156.74" dyno=web.1 connect=0ms service=60ms status=419 bytes=10842 protocol=https

なぜ

2 の部分ですが、 web.phpRoute::post('/callback', 'CallbackController@index') という指定をしたのですが、、、

Laravel の場合、web.php に指定した GET 以外のルートでは、csrf トークン用のヘッダーを必須としています(設定でなしのルートも作れる...?)
なので、ヘッダー情報を付与できない LINE コンソールからだと、エラーが status 200 が返りません

そのため、status 200 かえらんやで !! って怒ってたみたいです
api.php に認証ミドルウェアを挟まず登録することで上記を回

終わり

ユーザーの判別とかは webhook の処理の中で分岐する感じでしょうか ...
なんかマニュアルに書いてたような気もするので熟読してきます

Screenshot_20181011-230856.png

ひとまずは連携が上手くできて一安心しました:thumbsup: