BE・HERO カルテの LINE 連携
LINE Platform Concepts
LINE 公式アカウントをアプリと結ぶときに出てくる「プロバイダー」「ログインチャネル」「Messaging API」「LIFF」「リンクされた公式アカウント」の関係を整理する。kota のテスト用アカウントから先生所有の 3 アカウントへ切り替える作業を例に、どこを触るとどこに効くかを図で追う。
01全体像

登場する部品は 5 つある。上から順に「入れ物 → 中身」の関係になっている。
- プロバイダー
- Developers コンソールの一番外側の箱。「このサービスを提供している事業者」を表し、中にチャネルを複数入れる。
- ログインチャネル
- 「LINE でログイン」させて本人(LINE User ID)を得るための接続口。LIFF アプリはここに登録する。
- Messaging API チャネル
- 公式アカウントとしてメッセージを送るための接続口。公式アカウントと 1 対 1 で対応する。
- 公式アカウント(OA)
- 保護者が友だち追加している「アカウント」そのもの。Official Account Manager で管理し、リッチメニューやチャットはそこで扱う。
- LIFF
- ログインチャネルの中に登録する「LINE の中で開く Web ページ」。
Developers コンソールと Official Account Manager は元々別の世界で、両者をつなぐ唯一の橋が「Messaging API チャネル = 公式アカウント」の 1 対 1 対応である。体験用アカウントはこの橋を持たないので、上段には現れない。
02プロバイダー

プロバイダーの性質で重要なのは 1 つだけで、LINE User ID はプロバイダーごとに違う値になることである。同じ保護者でも、プロバイダー X のチャネルから見た ID と、プロバイダー Y から見た ID は別物になる。
BE・HERO カルテは LIFF で得た User ID を Firestore の lineUsers/{userId} に保存し、未決済のお知らせは同じ ID 宛に Messaging API で push する。この往復が成り立つのは、ログインチャネルと Messaging API チャネルが同じプロバイダーにあるときだけである。
後からプロバイダーを移すと、保存済みの User ID がすべて無効になり、全保護者に紐付けのやり直しを求めることになる。保護者が 1 人も紐付けしていない今が、切替コストがゼロの唯一のタイミングである。
プロバイダーに「所有者」の概念はなく、管理者は全員同権である。kota が作ったプロバイダーに先生を管理者として追加すれば、名義の問題は実質解消する。プロバイダー名はログイン許可画面に表示されるので、事業者名にしておく。
03チャネル: ログインと Messaging API
チャネルはプロバイダーの中に作る「LINE との接続口」で、種類が 2 つある。役割がまったく違う。
| 種類 | 何ができるか | BE・HERO カルテでの用途 | 必要な数 |
|---|---|---|---|
| LINE ログイン | 「LINE でログイン」させて本人(User ID・表示名)を得る。LIFF アプリを登録する | LIFF の入口。「BE-HEROテスト」 | 1 つ |
| Messaging API | 公式アカウントとしてメッセージを送る・受け取る | 未決済のお知らせ配信。スクール用と三国ヶ丘用 | 配信元にしたい公式アカウントの数 |
ログインチャネルは「誰か」を知るため、Messaging API チャネルは「話しかける」ためのもの。ログインチャネルは LIFF の入口として 1 つあればよく、公式アカウントの数だけ作るものではない。先生側にログインチャネルは存在しないし、作る必要もない。
04公式アカウントと Messaging API の 1 対 1

公式アカウントは Official Account Manager の世界にあり、最初は Developers コンソールに存在しない。Official Account Manager の「設定 → Messaging API → Messaging API を利用する」を押した瞬間に、公式アカウントに Messaging API チャネルが 1 対 1 で紐付き、Developers コンソールに現れる。
この操作でプロバイダーを選ぶ。選択は後から変更できず、公式アカウントは 1 つのプロバイダーにしか属せない。切替作業で唯一「慎重に」と言っている工程はここで、必ず今の LIFF があるプロバイダーを選ぶ。
有効化後に表示される Channel ID と Channel secret が、その公式アカウントから push するための資格情報になる。BE・HERO カルテでは教室ごとに送信元を切り替えるため、両アカウント分を tenantSecrets/be-with に、既定の送信元(スクール用)を Cloud Run の環境変数に入れる。
05LIFF
LIFF は「LINE の中で開く Web ページ」で、ログインチャネルに登録する。BE・HERO カルテでは https://liff.line.me/2009932814-ERjQkOZ0 が Firebase Hosting の /welcome を開き、/my や /trial はその後ろにパスを付けたディープリンクで指定する。
LIFF はログインチャネルに属するので、保護者を識別する User ID はログインチャネルのプロバイダーのものになる。どの公式アカウントのリッチメニューから開いても、同じ LIFF が開き、同じ User ID になる。だから体験用・スクール用・三国ヶ丘用の 3 アカウントすべてに同じ LIFF の URL を置けるし、Messaging API を持たない体験用でもリッチメニューにリンクを貼るだけで役目を果たす。
LIFF の URL に含まれる ID はログインチャネル側のものなので、公式アカウントを差し替えても変わらない。今回の切替でコード側の LIFF ID に手を入れないのはこのためである。
06リンクされた公式アカウント
ログインチャネルには「このログインチャネルの相棒はどの公式アカウントか」を 1 つだけ指定する設定がある。Developers コンソールのログインチャネル → チャネル基本設定 → 「リンクされた LINE 公式アカウント」で、同じプロバイダーの Messaging API チャネルから選ぶ。
効くのは 2 点である。
- LIFF の初回ログイン時に、その公式アカウントの友だち追加を促せる
- LIFF から
liff.getFriendship()で「この人はその公式アカウントと友だちか」を判定できる
設定できるのは 1 つなので、BE・HERO カルテではスクール用をリンク先にする。三国ヶ丘用と友だちの保護者は友だち判定ができないため、/my の友だち追加バナーは「生徒の教室がリンク先のアカウントに属するとき」だけ出すようにしてある(tenants/{tid}.schools[].lineAccount)。
切替作業でこの設定を触るのは kota のログインチャネル「BE-HEROテスト」側である。先生の公式アカウントを「使わない」のではなく、矢印の向き先として先生のスクール用を選ぶ。ドロップダウンにスクール用が出ないなら、Messaging API チャネルが別プロバイダーにできている。
07保護者の動線とお知らせの経路

上段が保護者の紐付け、下段が先生からのお知らせで、両者は同じ User ID でつながっている。紐付けで得た ID をそのまま宛先に使えるのは、02 で述べたとおり同じプロバイダーの中にいるからである。
配信元は生徒の教室で切り替える。tenants/{tid}.schools[] の lineAccount が三国ヶ丘なら三国ヶ丘用、それ以外はスクール用の資格情報で push する。保護者はどちらか一方としか友だちでないので、友だちでないアカウントから送っても届かない。教室の設定は配信の前提になる。
08切替作業で守ること
| 操作 | どこで | 効くところ |
|---|---|---|
| Messaging API を有効化し、今の LIFF のプロバイダーを選ぶ | Official Account Manager | 公式アカウントが Developers コンソールに現れ、User ID が LIFF と揃う。取り消し不可 |
| リンク先をスクール用に変更 | Developers → ログインチャネル | 友だち追加の誘導と友だち判定の対象が変わる |
| 先生をプロバイダー管理者に追加 | Developers → プロバイダー設定 | 名義の問題を解消。kota が抜けても先生側で全部触れる |
| Channel ID と secret を投入 | tenantSecrets と Cloud Run | お知らせの送信元が先生のアカウントになる |
| リッチメニューに LIFF の URL | Official Account Manager | ここで初めて保護者が紐付けできるようになる(公開スイッチ) |
逆に、触らないものも決めておく。LIFF ID・ログインチャネル・エンドポイント URL はそのまま。kota のテスト用公式アカウントは残しても保護者には影響しない。作業の順番と担当は be-hero-karte の issue #31 のチェックリストで管理する。