Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LINEミニアプリからサービスメッセージを送信してみよう
Search
るおん
March 14, 2026
420
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LINEミニアプリからサービスメッセージを送信してみよう
るおん
March 14, 2026
More Decks by るおん
See All by るおん
「見せて決める」要件定義 Claude Design × Claude Code × Figma
ryu20202
0
2.5k
20260401_blog_training.pdf
ryu20202
0
400
20260325_backlog_completion_notifier.pdf
ryu20202
0
370
全てのコンテキストを集約し真の仕様駆動を実現。プロジェクト全体の開発を高速化する方法
ryu20202
4
3.1k
【本日リリース】LINE Touchの詳細と使い方について世界最速で解説!LINE Touchの世界を体験してみよう!
ryu20202
0
18k
LINEミニアプリでのJPKIユースケースのご紹介
ryu20202
0
550
LINE Messaging API × OpenAI APIで入力音声の文字起こしBot作ってみた
ryu20202
0
590
クイック入力で実現するシームレスな会員登録
ryu20202
0
600
CDKコマンド誤用による環境リソースの損失を防ぐ方法
ryu20202
0
540
Featured
See All Featured
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
300
Speed Design
sergeychernyshev
33
1.8k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
960
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
My Coaching Mixtape
mlcsv
0
140
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
250
Transcript
LINEミニアプリでサービスメッセージを送信してみよう 2026/03/13 LINEミニアプリ Tech Meetup #4 クラスメソッド株式会社 リテールアプリ共創部 高垣 龍平
自己紹介 2
1. サービスメッセージとは 2. LINE公式アカウントからの配信との違い 3. 全体像 4. 実装してみた 5. 注意点・まとめ
今日お話しすること 3
サービスメッセージとは
ユーザーの操作に対する確認・応答として 送信される通知機能 例えば... 予約完了の通知 リマインド 会員登録完了のお知らせ 表示場所 LINEアプリ内の専用トークルーム 「LINEミニアプリ お知らせ」に表示される
認証済みのLINEミニアプリ専用の機能 サービスメッセージとは 5
LINE公式アカウントからの配信との違い
項目 サービスメッセージ LINE公式アカウントからの 配信 料金 無料 従量課金制 送信回数制限 同一操作に対して最大5回まで プランに応じた制限
メッセージ形 式 テンプレート形式のみ 自由形式 表示場所 専用トークルーム(LINEミニアプリ お知ら せ) 公式アカウントのトーク 対象 認証済みLINEミニアプリのみ LINE公式アカウント LINE公式アカウントからの配信との比較 7
サービスメッセージ LINE公式アカウントからの配信 専用トークルーム「LINEミニアプリ お知らせ」 公式アカウントのトーク 配信先の違い 8
1. 無料で利用可能 LINE公式アカウントからの配信は送信数に応じ て課金されるが、サービスメッセージは無料 2. 送信回数の制限 同じ操作に対して最大5回まで。スパム的な利 用を防止 3. テンプレート形式
LINEヤフー社が提供する審査済みテンプレート を使用。ユーザー体験の一貫性を担保 4. ブロック中でも送信可能 LINE公式アカウントがブロックされていても、 専用トークルーム「LINEミニアプリ お知らせ」 に配信可能 サービスメッセージの4つの特徴 9
全体像
フロントエンド:React + TypeScript(S3 + CloudFront) バックエンド:Express.js + TypeScript(Lambda + API
Gateway) データベース:DynamoDB フロントエンドのLINEミニアプリからLIFFアクセストークンを含めてAPIリクエストを送信し、バ ックエンドでサービス通知トークンの発行とサービスメッセージの送信を行う システムアーキテクチャ 11
実装してみた
Step 1 チャネルアクセストークンの 発行 POST /oauth2/v3/token → Step 2 サービス通知トークンの発行
POST /message/v3/notifier/token → Step 3 サービスメッセージの送信 POST /message/v3/notifier/send 事前準備 1. LINE DevelopersコンソールでチャネルID・チャネルシークレットを取得 2. サービスメッセージテンプレートを登録 3. LIFFアプリの設定確認 サービスメッセージ送信の3ステップ 13
サービスメッセージの送信には、ステートレスチャネルアクセストークンとLIFFアクセストークン の2つが必要 処理の流れ(公式ドキュメントより) 14
LINE Developersコンソールでの設定 手順 1. 対象チャネルの「サービスメッセージ」タブを開く 2. 「テンプレートを追加」をクリック 3. テンプレートカテゴリを選択 4.
テンプレートの言語を選択(6言語対応) 5. テンプレート名を設定 ポイント テンプレートはLINEヤフー社が用意したものを使用 テンプレート内の変数( ${number} , ${reg_date} 等)に はAPI呼び出し時に任意の値を設定可能 事前準備:テンプレートの登録 15
LIFFアクセストークンをバックエンドに送信 const sendServiceMessage = async (params: Record<string, string>) => {
const liffAccessToken = liff.getAccessToken(); if (!liffAccessToken) { throw new Error("LIFF アクセストークンが取得できませんでした"); } const response = await fetch("https://your-api-endpoint.com/send-message", { method: "POST", headers: { "Content-Type": "application/json", "X-LIFF-Access-Token": liffAccessToken, }, body: JSON.stringify({ params }), }); return response.json(); }; ポイント liff.getAccessToken() で取得したLIFFアクセストークンを X-LIFF-Access-Token ヘッダーに設定 フロントエンド実装(React) 16
Lambda関数のハンドラー概要 export const handler = async (event: APIGatewayProxyEvent) => {
const liffAccessToken = event.headers["x-liff-access-token"]; const { userId, params } = JSON.parse(event.body || "{}"); // 1. チャネルアクセストークンを発行 const channelAccessToken = await getChannelAccessToken(); // 2. サービス通知トークンを発行 const tokenResponse = await issueServiceNotificationToken( channelAccessToken, liffAccessToken ); // 3. サービスメッセージを送信 const sendResponse = await sendServiceMessage( channelAccessToken, tokenResponse.notificationToken, TEMPLATE_NAME, params ); // 4. サービス通知トークンをDB に保存(再利用のため) await tokenRepository.save({ userId, notificationToken: sendResponse.notificationToken, remainingCount: sendResponse.remainingCount, }); }; バックエンド実装:全体の流れ 17
LINE APIを呼び出すために必要なトークンを発行 POST https://api.line.me/oauth2/v3/token const getChannelAccessToken = async (): Promise<string>
=> { const response = await fetch("https://api.line.me/oauth2/v3/token", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, body: `grant_type=client_credentials&client_id=${CHANNEL_ID}&client_secret=${CHANNEL_SECRET}`, }); const data = await response.json(); return data.access_token; }; ポイント チャネルIDとチャネルシークレットは環境変数から読み込み Step 1:チャネルアクセストークンの発行 18
LIFFアクセストークンとチャネルアクセストークンで発行 POST https://api.line.me/message/v3/notifier/token const issueServiceNotificationToken = async ( channelAccessToken: string,
liffAccessToken: string ) => { const response = await fetch("https://api.line.me/message/v3/notifier/token", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${channelAccessToken}`, }, body: JSON.stringify({ liffAccessToken }), }); return await response.json(); }; レスポンスの内容 notificationToken :メッセージ送信に使用するトークン expiresIn :トークンの有効期限(最大1年間有効) remainingCount :残り送信可能回数(最大5回) Step 2:サービス通知トークンの発行 19
サービス通知トークンを使用してメッセージを送信 POST https://api.line.me/message/v3/notifier/send?target=service const sendServiceMessage = async ( channelAccessToken: string,
notificationToken: string, templateName: string, params: Record<string, string> ) => { const response = await fetch( "https://api.line.me/message/v3/notifier/send?target=service", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${channelAccessToken}`, }, body: JSON.stringify({ notificationToken, templateName, params }), } ); return await response.json(); }; ポイント templateName :LINE Developersコンソールで設定したテンプレート名を指定 params :テンプレート内の変数に渡す値を設定 Step 3:サービスメッセージの送信 20
送信後のレスポンスに含まれるトークンをDynamoDBに保存 なぜ保存するのか? 同じLIFFアクセストークンで issueServiceNotificationToken を呼べるのは1回だけ。 次回以降のメッセージ送信では、保存した notificationToken を再利用する必要がある。 保存する情報 userId
:ユーザーの識別子 notificationToken :次回送信に使うトークン remainingCount :残り送信可能回数 Step 4:サービス通知トークンの保存 21
認証済みミニアプリと未認証ミニアプリ
本番環境(認証済み) LINEヤフー社による審査が必要 審査には数日〜数週間 実際のユーザーに送信可能 テンプレートも審査通過が必須 開発環境(未認証) 審査なしで実装・テスト可能 開発者・テスターにのみ送信 本番リリース前に動作確認 テンプレートのテストも可能
開発環境では未認証でもテスト可能 23
審査を待たずに、先に実装を完了させることが可能 1. 開発環境で実装・テスト(未認証ミニアプリ) └─ 審査なしで動作確認 2. 実装完了後に審査を申請 3. 審査通過後に本番環境へデプロイ 「審査に通るまで実装できない」という心配は不要
開発の進め方 24
注意点
1. 本番環境では認証済みが必須 実際のユーザーへの送信には審査通過が必須。開発 環境では未認証でも動作確認は可能 2. テンプレートの事前登録 使用するテンプレートはLINE Developersコンソー ルで事前登録・審査通過が必要。チャネルごとに最 大20個まで
3. 送信回数の制限 同一操作に対して最大5回まで。 remainingCount を確認して残り送信可能回数を把握 4. サービス通知トークンの再利用 同じLIFFアクセストークンでトークン発行APIを呼 べるのは1回だけ。レスポンスのトークンを再利用 5. ユーザーアクションが起点 ユーザーがミニアプリ上で行った操作に対してのみ 送信可能。バッチ処理や外部からの一方的な通知に は使用不可 6. プロモーション送信は禁止 値下げやプロモーション情報の送信は禁止。ユーザ ー操作に対する確認・応答のみ 実装時の注意点 26
サービスメッセージは無料で送信できる通知機能 LINE公式アカウントの従量課金メッセージと比べ、無料で利用可能。ブロック中でも配信できる 3ステップで実装可能 チャネルアクセストークン → サービス通知トークン → メッセージ送信 の流れで実装 用途に応じた使い分けが重要
テンプレート形式のみ・送信回数制限あり。予約通知やリマインドなどユーザーにとって重要な情報 を伝える場面で活用 参考リンク サービスメッセージ - LINE Developers サービス通知トークン発行 API サービスメッセージ送信 API まとめ 27
ご清聴ありがとうございました 28