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

0pt   2018-10-11 23:44
IT技術情報局

概要

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(LINEBotConstantHTTPHeader::LINE_SIGNATURE); $events = $bot->parseEventRequest($request->getContent(), $signature); /** @var LINEBotEventMessageEventTextMessage $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.php に Route::post('/callback', 'CallbackController@index') という指定をしたのですが、、、

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

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

終わり

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

68747470733a2f2f71696974612d696d6167652d

ひとまずは連携が上手くできて一安心しました1f44d.png?resize=20%2C20&ssl=1

Source: php

   ITアンテナトップページへ
情報処理/ITの話題が沢山。