BE・HERO カルテの LINE 連携

LINE Platform Concepts

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

01全体像

上段が LINE Developers コンソールのプロバイダー。中にログインチャネル(LIFF とリンク先の設定)と3つの Messaging API チャネルが並ぶ。下段が Official Account Manager の公式アカウント4つ。Messaging API チャネルと公式アカウントは1対1で対応し、各公式アカウントのリッチメニューから同じ LIFF が開く
FIG 012 つの管理画面と、その中の部品の対応

登場する部品は 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人の保護者を、プロバイダー X(ログインチャネルと Messaging API を含む)から見ると U_1a2b…、別のプロバイダー Y から見ると U_9f8e… と別の値の ID になる
FIG 02LINE User ID はプロバイダーごとに別の値になる

プロバイダーの性質で重要なのは 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 で Messaging API を利用すると押し、プロバイダーを選ぶと、Developers コンソールに Messaging API チャネルが現れる。Channel ID と secret は tenantSecrets と Cloud Run の環境変数に入れる
FIG 03Messaging API の有効化と、資格情報の行き先

公式アカウントは 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保護者の動線とお知らせの経路

上段: リッチメニューから LIFF が開き、ログインチャネルが User ID を発行、Cloud Run が検証して Firebase Auth の uid にし、オンボーディングで電話番号照合、/my に記録が出る。下段: 先生が未決済のお知らせを押すと Cloud Run が生徒の教室を見て、スクール用か三国ヶ丘用の Messaging API で同じ User ID に push する
FIG 04紐付け(上段)と配信(下段)で同じ User ID を使う

上段が保護者の紐付け、下段が先生からのお知らせで、両者は同じ 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 の URLOfficial Account Managerここで初めて保護者が紐付けできるようになる(公開スイッチ)

逆に、触らないものも決めておく。LIFF ID・ログインチャネル・エンドポイント URL はそのまま。kota のテスト用公式アカウントは残しても保護者には影響しない。作業の順番と担当は be-hero-karte の issue #31 のチェックリストで管理する。