【Laravel】LINE Messaging APIを使用してLINE通知実装

えび

Laravelプロジェクトにて、LINE Messaging APIを使用して
LINEを用いた通知を実装した

ざっくり流れ

  1. LINEのアカウント設定で、Messaging APIを「利用する」に設定する
  2. 利用開始したMessaging APIのチャンネルシークレットキー.envに設定する
  3. Messaging APIのaccess tokenを発行 & .envに設定する
  4. .envの値を使用するためconfigファイルに追記する
  5. LINE Auth認証時に友達追加を行えるようにする (Linked OA & URL変更)
  6. LINEメッセージ送信処理実装

アカウント設定で、Messaging APIを「利用する」に設定する

  • サイドバーの「設定」 > 「Messaging API」をクリックして、
    Messaging APIを利用する」をクリック

利用開始したMessaging APIのチャンネルシークレットキーを.envに設定

  • 上記「利用開始」後表示される「Channel secret」の値をコピー
  • .envに記載する
LINE_CHANNEL_SECRET=XXXXXXXXXXX

Messaging APIのaccess tokenを発行 & .envに設定する

  • コンソールのサイドバーの「Providers」から、対象のプロバイダー画面に移動
  • Messaging APIのチャンネルをクリック
  • Messaging API」タブをクリックして設定画面に移動
  • Channel access token」のissueボタンを押下してアクセストークンを発行
  • 値をコピーして.envに記載する
LINE_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXX

.envの値を使用するためconfigファイルに追記する

.envの値を直接利用するとキャッシュなどの弊害があるので、configファイルを噛ませる

  • config/services.phpに記載
 'line' => [
    'channel_secret' => env('LINE_CHANNEL_SECRET'),
    'access_token' => env('LINE_ACCESS_TOKEN'),
],

これで、config('services.line.channel_secret') config('services.line.access_token')で各値を取得可能になった

LINE Auth認証時に友達追加を行えるようにする (Linked OA & URL変更)

LINE Messaging APIを利用したLINEメッセージ送信には、
前提として相手と「友達」になっていることが必須条件となる
そのためサイト上で友達追加を行えるようにしてあげる

  • LINE Loginのチャンネルをクリック
  • 基本設定のLinked OAで、今回のbotを選択して紐付ける
  • Auth認証のURL (https://access.line.me/oauth2/v2.1/authorize) にパラメータを追記
bot_prompt=normal

(追記例)

 protected function getAuthUrl($state)
 {
        $this->parameters['nonce'] = (string)uniqid('PREFIX', true);
        session()->put(['nonce' => $this->parameters['nonce']]);

        return $this->buildAuthUrlFromBase('https://access.line.me/oauth2/v2.1/authorize', $state)
          . "&prompt=consent&bot_prompt=normal"; // ⭐️ 追加
 }

これでLINE認証ポップアップに友達追加ボタンが表示されるようになる

LINEメッセージ送信処理実装

ここから本題の送信処理

  • パッケージインストール
composer require linecorp/line-bot-sdk

  • 送信処理
    /**
     * @param string $lineUserId
     */
    public function sendMessage(string $lineUserId)
    {
        $http_client = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(config('services.line.access_token'));
        $bot = new \LINE\LINEBot($http_client, ['channelSecret' => config('services.line.message_channel_secret')]);

        $message = "LINE送信テスト";
        $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($message);
        $response = $bot->pushMessage($lineUserId, $textMessageBuilder);

        if ($response->isSucceeded()) {
            Log::info('送信成功');
        } else {
            Log::error('送信失敗: '. $response->getHTTPStatus(). ' '. $response->getRawBody());
        }
    }