LINE Messaging APIを利用して特定ユーザーにメッセージを送信する

AWSクラウド Spring Framework
AWSクラウド

LINE Messaging APIを利用して特定ユーザーに独自メッセージを送信する方法を解説します。
■実現する機能
サイト上に配置した『LINE連携』を押下すると、独自メッセージを対象ユーザーに対して送信する。

■処理イメージ
1. ユーザーが画面に表示された『LINE連携』ボタン押下
2. (LINEに未ログインの場合)LINEログイン画面に遷移
3. ユーザーはアカウント情報を入力しLINEにログインする
4. サーバーはLINEログインのコールバックを受け取り、LINEのユーザーIDを取得する
5. サーバーは取得したLINEのユーザーIDに対して独自メッセージを送信する

事前準備

LINE公式アカウントとMessaging APIの有効化

Messaging APIを利用するには、LINE公式アカウントとMessaging APIの有効化が必要です。

1.LINE公式アカウントを作成する。
  詳しくは、『Messaging APIドキュメント』の「1. LINE公式アカウントを作成する」を参照。

2.作成したLINE公式アカウントでMessaging APIの利用を有効にする。
  詳しくは、『Messaging APIドキュメント』の「2. LINE公式アカウントでMessaging APIを有効にする」を参照。

公式アカウントは無料プランがありますが送信可能なメッセージ数に制限があります。詳しくは以下料金プランを参照。
https://www.lycbiz.com/jp/service/line-official-account/plan/

「チャネルID」「チャネルシークレット」の取得

MessageAPIを利用するために必要な「チャネルID」「チャネルシークレット」を確認しメモしておきます。「LINE Developers」にログインし、チャネルの設定で確認できます。

Messaging APIの仕様、注意点

・Massaging API 仕様

Messaging API


・二重送信にならないようリトライキー(X-Line-Retry-Key)を用いて送信する。リトライキーはLINEからは提供されないのでシステム側で独自に付与する。

失敗したAPIリクエストを再試行する
メッセージの送信処理は失敗する可能性があり、その場合は500番台のエラーが発生したり、リクエストがタイムアウトしたりします。ただし、このようなエラーが発生した場合でも、メッセージは送信されている可能性があります。つまり、エラーが起きたからと...

・リクエスト内容によってレート制限がある。マルチキャスト系は特に注意。

Messaging APIリファレンス

実現方法

システム構成

以下の構成を前提で考えます。

サーバ名称用途補足
WEBWEBコンテンツを配置「LINE連携」ボタンを配置したコンテンツ
バックエンドLINEとのやりとりを行うMessaging API呼び出しとコールバック受付
セッションDBLINE認証で取得した情報を格納

処理の流れ

LINEとやりとりするエンドポイントは以下のように定義した前提で処理の流れを説明します。このURLはシステム独自に定義してください。

1./line/auth/start → 認証開始
2./line/auth/callback → コールバック
3./line/connection/status → 連携状態確認
4./line/connection/disconnect → 連携解除
No主体処理補足
1ユーザLINE連携ボタン押下/line/auth/start
2バックエンド認証用URLを生成し、LINEにリダイレクトhttps://access.line.me/oauth2/v2.1/authorize
※詳細は「認証用URL生成」参照
LINE認証画面を表示
4ユーザLINEログインLINEのアカウント情報入力。認証後システムが設定したコールバックURLが呼び出される。
5バックエンドコールバック処理codeとstateパラメータ受信
アクセストークン取得
セッション保存
・メッセージ送信
 https://api.line.me/v2/bot/message/push
・リダイレクト(任意のURL)

認証用URL生成

LINEの認証用URL「https://access.line.me/oauth2/v2.1/authorize」にパラメータを付与して呼び出します。必須パラメータは以下になります。

パラメータ説明
response_type認証フロータイプcode(固定)
client_idLINEログインチャネルIDチャネルID
redirect_uri認証後のリダイレクト先URLシステムのコールバックURL(システムでユニーク)
stateCSRF対策トークンセッション単位でランダムな英数字文字列
scope取得する権限ユーザーに付与を依頼する権限。メッセージ送信のみであれば「openid」のみでOK.

その他オプションパラメータについては「https://developers.line.biz/ja/docs/line-login/integrate-line-login/#making-an-authorization-request」参照。

処理シーケンス詳細

シーケンス図はMermaid Live Editorで作成。Mermaid Live Editorのテキストも記載しておきます。

sequenceDiagram
    participant Browser as ブラウザ
    participant Web as WEBサーバー<br/>(複数台)
    participant Backend as バックエンド<br/>サーバー<br/>(複数台)
    participant Redis as Redis<br/>(Valkey)
    participant LINE as LINE

    Note over Browser,LINE: 1. ログイン
    Browser->>Web: POST /login
    Web->>Redis: セッション作成<br/>sessionId: ABC123<br/>userId: user_demo
    Web->>Browser: Set-Cookie:  JSESSIONID:  ABC123

    Note over Browser,LINE: 2. LINE連携開始
    Browser->>Web: GET /line/auth/start<br/>Cookie: ABC123
    Web->>Redis: セッション取得
    Redis-->>Web: userId:  user_demo
    Web->>Web: state生成 (xyz789)
    Web->>Redis: state保存<br/>line:state:xyz789: user_demo<br/>TTL: 5分
    Web->>Web: LINE認証URL生成
    Web->>Browser: 302 Redirect<br/>https://access.line.me/oauth2/v2.1/authorize<br/>?state: xyz789

    Note over Browser,LINE: 3. LINE認証
    Browser->>LINE: GET https://access.line.me/oauth2/v2.1/authorize
    LINE->>Browser: LINE認証画面表示
    Browser->>LINE: ログイン・認可
    LINE->>LINE: 認可コード生成<br/>code: abc123

    Note over Browser,LINE:  4. コールバック & 独自メッセージ送信
    LINE->>Browser: 302 Redirect<br/>https://example.com/line/auth/callback<br/>? code: abc123 & state:  xyz789
    Browser->>Web: GET /line/auth/callback<br/>? code: abc123 & state:  xyz789<br/>Cookie: ABC123

    Note over Web,Redis: State検証
    Web->>Redis: GET line:state: xyz789
    Redis-->>Web: user_demo
    Web->>Redis: GET session:ABC123
    Redis-->>Web: userId: user_demo
    Web->>Web: 照合: user_demo 一致 ✅
    Web->>Redis:  DEL line: state:xyz789

    Note over Web,LINE: アクセストークン & LINE USER ID取得
    Web->>LINE: POST /oauth2/v2.1/token<br/>code: abc123
    LINE-->>Web:  access_token, id_token

    Web->>Web: IDトークンから<br/>LINE USER ID抽出<br/>(sub: U1234567890abcdef)

    Note over Web,Redis: セッション保存
    Web->>Redis: session.setAttribute<br/>lineUserId: U1234567890abcdef

    Note over Web,LINE: システムが独自メッセージ送信
    Web->>Backend: メッセージ送信リクエスト<br/>lineUserId: U1234567890abcdef<br/>message: 独自メッセージ
    
    Backend->>LINE: POST /v2/bot/message/push<br/>Authorization: Bearer CHANNEL_TOKEN<br/>to: U1234567890abcdef<br/>text: 独自メッセージ
    LINE-->>Backend: 送信成功
    
    Backend-->>Web:  送信完了

    Web->>Browser: 302 Redirect /

    Note over Browser,LINE: 5. ログアウト
    Browser->>Web: GET /logout<br/>Cookie: ABC123
    Web->>Redis: DEL session: ABC123
    Web->>Browser: 302 Redirect /login<br/>Cookieクリア
タイトルとURLをコピーしました