LINE 綁定 + LINE Pay 每月捐款 — 狀態地圖

每個使用者只缺三樣東西中的某幾樣。找到缺口,補上它。

C
Contact ID
CRM 身份識別 — 知道你是誰
L
LINE User ID
通訊管道 — 能聯繫到你
$
LINE Pay 每月捐款
持續支持 — 每月自動捐款

狀態矩陣

每個狀態直接顯示缺口與行動方案。

沒有 LINE ID
有 LINE ID
沒有
Contact
什麼都沒有
S0
陌生人
缺 Contact 缺 LINE 缺捐款
有 LINE,可能已在 CRM 但未配對
S43-6 萬人
LINE 好友
可能有 Contact(未配對) LINE ✓ 缺捐款
有 Contact
未捐款
支持者,沒有 LINE
S1
支持者(連署/活動/Email)
Contact ✓ 缺 LINE 缺捐款
支持者,已綁定 LINE
S5
已綁定,未捐款
Contact ✓ LINE ✓ 缺捐款
有 Contact
有捐款
捐款人,沒有 LINE
S2
單次捐款人
Contact ✓ 缺 LINE 單次捐款
S3
每月捐款人(CC)
Contact ✓ 缺 LINE CC→需轉 LINE Pay
S3-LP差一步!
每月捐款人(LINE Pay),未綁 LINE
Contact ✓ 缺 LINE ← 只差這個 LINE Pay ✓
捐款人,已綁定 LINE
S6
已綁定 + 單次捐款
Contact ✓ LINE ✓ 單次→需轉月捐
S7
已綁定 + 每月捐款(CC)
Contact ✓ LINE ✓ CC→需轉 LINE Pay
S8 🎯目標
已綁定 + 每月捐款(LINE Pay)
Contact ✓ LINE ✓ LINE Pay 月捐 ✓

LINE 綁定方法總覽

9 種綁定方法 × 不同使用者狀態。每種方法的技術流程、觸發方式、適用對象一覽。

方法 流程 技術
可行性
使用者
摩擦力
開發
工作量
適用對象 注意事項
A 感謝頁 LINE 綁定按鈕 LINE 推普通 URL → 捐款 → 感謝頁 按鈕 → LIFF 取 LINE ID → 綁定
⚡ 同意畫面在捐款「之後」才出現
支持者、捐款人
月捐人、LINE好友
跟 B 的差別只是順序:
A = 先捐款,後問 LINE 同意
B = 先問 LINE 同意,再捐款
A 不需改捐款頁,工作量更低
B LINE 內直開捐款頁 ⭐ LINE 推 LIFF URL → 打開頁面立刻問 LINE 同意 → 取 LINE ID → 使用者捐款 → 送出時一起綁定
⚡ 同意畫面在捐款「之前」就出現
最低 所有從 LINE 進來的人 跟 A 的差別只是順序:
B = 先問 LINE 同意,再捐款
A = 先捐款,後問 LINE 同意
B 需改捐款頁前端加 LIFF SDK
非 LINE 環境自動跳過
C Email LINE 綁定連結 + QR Code Email 含 LINE 綁定按鈕 + QR Code
手機點連結 → LINE 開啟 LIFF → 綁定
桌機 → 掃 QR Code → 同上
支持者、捐款人
月捐人(CC/LP)
手機點 liff.line.me → LINE 自動開啟 ✅
桌機點 → 瀏覽器開,體驗差 → 需 QR 備援
URL 帶 contact_id 參數
⬇ 需使用者自己輸入資料比對 CRM(無 contact_id 的場景)
D LINE 內填表綁定 LINE 好友 → LIFF 表單 → 自動取 LINE ID → 使用者填 email/手機 → 比對 CRM → 綁定 需輸入 LINE 好友 核心綁定表單,其他方法都指向這裡
比對不到 → 建新 Contact
需個資同意聲明
E LINE 群發綁定請求 群發訊息含 LINE 綁定連結 → 使用者點擊 → 進入 D 填表綁定 需輸入 LINE 好友 觸發方式:群發推播
3-6萬人群發會超額度 💰
建議分批 or Narrowcast
F Rich Menu 常駐按鈕 LINE 底部選單永久放「我的帳號」→ 進入 D 填表綁定 需輸入 LINE 好友 觸發方式:常駐按鈕
零成本 · 24/7 · 使用者主動
G 加好友歡迎訊息 加好友 → 自動推歡迎訊息含 LINE 綁定連結 → 進入 D 填表綁定 需輸入 LINE 新好友 觸發方式:加好友自動
只有一次機會,搭配 F 後備
I 推播文章文末 CTA 推播內容文章 → 文末 CTA → 進入 D 填表綁定 需輸入 LINE 好友 觸發方式:文章內嵌
不需額外成本,每篇都帶
⬇ 客服輔助綁定
H 電話客服 → SMS+Email 使用者來電 → 客服問 email/手機 → 查 CRM 找到 contact_id → 發 SMS + Email 含 LINE 綁定連結(帶 cid)→ 使用者點開 → LINE 開啟 → 一鍵綁定 任何來電且在 CRM
的使用者
走有 cid 路徑(零輸入)
SMS + Email 雙管道確保送達
需 SMS 發送能力

綁定方法 × 使用者狀態 適用矩陣

● = 主要方法 · ○ = 可用但非首選 · — = 不適用

方法 \ 適用對象 陌生人 支持者
連署/活動/Email
單次
捐款人
每月
捐款人
(CC)
每月
捐款人
LINE Pay
LINE
好友
A 感謝頁 LINE 綁定按鈕
主動捐/簽
B LINE 內直開 ⭐
C Email LINE 綁定連結
如也在CRM
D LINE 內填表
E LINE 群發
F Rich Menu 按鈕
G 歡迎訊息
I 文章文末 CTA
H 電話→SMS+Email
如也在CRM
核心觀察
有 Contact 沒 LINE 的人 (S1/S2/S3/S3-LP):用方法 A (感謝頁) 和 C (Email) — 因為你有他們的 contact_id 可帶入 LIFF URL
有 LINE 的人 (S4):可能同時在 CRM!如果在 → 用 A/C/J(零輸入);如果不在 → 用 D/E/F/G/H/I(填表比對)
什麼都沒有的人 (S0):方法 B (LINE 內直開) 是唯一能一步完成的 — 黃金路徑
所有方法共用同一個 LIFF 綁定頁 — BJ 只需要做一個頁面 + 一個後端 API,差別只在入口和帶的參數不同

綁定流程圖 — 根據「已知什麼」決定流程

核心原則:已知 contact_id 的場景 → 使用者零輸入,一鍵確認。只有 S4 才需要填表。

流程 1:方法 A — 感謝頁 跳轉綁定(+ 方法 C Email 同理) 捐款/連署完成後,在 感謝頁 引導使用者綁定 LINE。方法 C (Email) 同理。 1. 使用者完成捐款/連署 產生 contact_id 2. 感謝頁 顯示綁定按鈕 「加入 LINE 好友,獲得個人化服務」 按鈕連結 = LIFF URL 帶 contact_id 使用者點擊 3. LINE 同意畫面(僅第一次) 「允許存取你的個人資料?」→ 允許 4. LIFF 綁定頁 — 確認畫面 LINE 頭像 ↔ CRM 姓名(模糊化) 零輸入,按「確認綁定」即可 5. 綁定完成 ✓ 方法 C (Email) 同樣流程 差別只是入口:Email 裡的 LINE 綁定按鈕 + QR Code 同樣帶 contact_id → 同樣零輸入確認 流程 2:方法 B — LINE 內直開捐款頁 ⭐ 從 LINE 推播直接用 LIFF URL 開啟捐款頁。先問 LINE 同意,再捐款,最後確認綁定。 1. LINE 推播 LIFF URL 捐款連結 使用者在 LINE 內點擊 2. LINE 同意畫面(僅第一次) 「允許存取你的個人資料?」→ 允許 3. 顯示捐款表單 使用者填表完成捐款(LINE ID 已在背景取得) 4. 感謝頁 — 確認綁定 「要用這個 LINE 帳號接收通知嗎?」 顯示 LINE 頭像 + 名稱,使用者按確認 5. 綁定完成 ✓ A 與 B 的差別 A = 先捐款 → 後問 LINE 同意 → 確認綁定 B = 先問 LINE 同意 → 再捐款 → 確認綁定 B 需改捐款頁前端加 LIFF SDK 非 LINE 環境自動跳過,不影響一般使用者 流程 3:方法 H — 電話/訊息客服 → SMS + Email 綁定 使用者來電或傳訊息,內部人員查 CRM 後發綁定連結。不需拿到 LINE ID。 1. 使用者來電/傳訊息 提供 email 或手機 2. 內部人員查 CRM 用 email/手機找到 contact_id 3. 發送 SMS + Email 內含 LINE 綁定連結(帶 contact_id) 雙管道確保送達 4. 使用者點連結 → LINE 開啟 同意畫面(僅第一次)→ 確認綁定 5. 綁定完成 ✓ 方法 H 的關鍵優勢 不需在 MAAC 搜 LINE 好友(搜不到),不需知道 LINE ID LINE 綁定連結帶 contact_id → 使用者點開後自動配對 → 零輸入綁定 流程 4:方法 D / E / F / G / I — LINE 內填表綁定 使用者在 LINE 內,我們不知道他是 CRM 裡的誰,需要使用者填 email 或手機比對 D 填表 E 群發 F Rich Menu G 歡迎訊息 I 文章文末 ← 全部導向同一個 LIFF 綁定頁 ↓ 1. LINE 同意畫面(僅第一次) 「允許存取你的個人資料?」→ 允許 2. LIFF 綁定頁 — 填寫資料 LINE 頭像已自動取得 使用者輸入 email 或手機(只需一個欄位) CRM 比對 找到 3a.「是 陳O明 嗎?」 顯示姓名模糊化 → 使用者按確認 4. 綁定完成 ✓ 找不到 3b. 建新 Contact + 自動綁定 LINE ID 多筆 3c. 二次驗證 姓名末字確認 → 綁定

LIFF 綁定頁 — 完整決策流程圖

單頁漸進式 · Greenpeace 品牌 · 手機優先 · 預設用手機號碼搜尋

flowchart TD Start(["使用者點擊 LINE 綁定連結"]) Start --> S1 subgraph INIT ["入口 + 授權"] S1["① LINE 同意授權\n(僅第一次)"] end S1 --> HasCID{URL 帶\ncontact_id?} subgraph PATH_A ["路徑 A:有 contact_id(零輸入)"] S2["② 確認綁定\nLINE 頭像 ↔ CRM 姓名"] end subgraph PATH_B ["路徑 B:沒有 contact_id(需輸入)"] S3["③ 填寫手機號碼\n(可切換 email)"] S3 -->|送出| Match{CRM\n比對結果} Match -->|1 筆| S4["④ 確認身份\n是 陳O明 嗎?"] Match -->|0 筆| S6["⑥ 建立新帳號"] Match -->|多筆| S5["⑤ 輸入姓氏"] S5 -->|縮到 1 筆| S4 S5 -->|仍多筆/0筆| Choose{選擇} Choose -->|建立新帳號| S6 Choose -->|📞 致電客服| End1(["客服處理"]) end HasCID -->|有| S2 HasCID -->|沒有| S3 S2 -->|確認| Success S2 -.->|不是我| S3 S4 -->|是我| Success S4 -.->|不是我| S5 S4 -.->|重新輸入| S3 S6 -->|送出| Success Success(["✅ 綁定成功"]) Success --> IsDonor{有捐款\n紀錄?} IsDonor -->|有| S7a["⑦a 成功\n+ 推月捐"] IsDonor -->|沒有| S7b["⑦b 成功\n感謝綁定"] style Start fill:#1a1a2e,stroke:#1a1a2e,color:#fff style Success fill:#16a34a,stroke:#16a34a,color:#fff style End1 fill:#666,stroke:#666,color:#fff style S1 fill:#f0fdf4,stroke:#22c55e,color:#111 style S2 fill:#f0fdf4,stroke:#22c55e,color:#111 style S3 fill:#fce7f3,stroke:#ec4899,color:#111 style S4 fill:#f0fdf4,stroke:#22c55e,color:#111 style S5 fill:#fef3c7,stroke:#f59e0b,color:#111 style S6 fill:#fef3c7,stroke:#f59e0b,color:#111 style S7a fill:#f0fdf4,stroke:#66cc00,color:#111 style S7b fill:#eff6ff,stroke:#3b82f6,color:#111 style INIT fill:#f8fafc,stroke:#94a3b8,color:#111 style PATH_A fill:#f0fdf4,stroke:#86efac,color:#111 style PATH_B fill:#fdf2f8,stroke:#f9a8d4,color:#111

錯誤 & 衝突流程

觸發來源 條件 顯示畫面 使用者出路
① LINE 同意授權 LIFF init 失敗 ⑧ 錯誤提示:「請從 LINE 內開啟」+ QR Code 掃 QR 加好友 / 致電客服
② 確認綁定 綁定衝突 ⑨ 衝突提示:帳號已綁其他 LINE 📞 撥打客服 / 重新開始
④ 確認身份 綁定衝突 ⑨ 衝突提示:LINE 已綁其他帳號 📞 撥打客服 / 重新開始
🟢 零輸入(有 contact_id)
🩷 需使用者輸入
🟡 比對/建帳號
🔴 錯誤/衝突
導航規則:每個畫面都有「上一步」可回退 · 「不是我」回到填表重新輸入 · 找不到時提供建立新帳號 + 客服電話 · 全程只有電話客服

畫面 ① LINE 同意授權 僅第一次

9:41LINE
GP
Greenpeace Taiwan
想要存取你的
LINE 個人資料
包含:顯示名稱、大頭貼照
取消
允許

LINE 原生授權畫面

LINE 平台控制無法自訂

LINE 原生畫面,第一次開啟 LIFF 才出現。允許後 SDK 取得 LINE User ID + 顯示名稱。第二次以後不再顯示。

按「取消」→ 顯示提示需要授權 + 重試按鈕。

畫面 ② 確認綁定 零輸入

9:41LINE

綁定 LINE 帳號

確認以下資訊是否正確

😊
陳小明
你的 LINE 帳號
👤
陳O明
ch***@gmail.com · 會員資料
我同意個人資料蒐集與利用聲明,將 LINE 帳號與會員資料綁定。
確認綁定
不是我的帳號
需要協助?致電 02-2361-2025

確認綁定(零輸入)

有 contact_id方法 A / C / H

從 Email、感謝頁、SMS 進來。URL 帶 contact_id,後端查 CRM 回傳模糊化資料。使用者只按「確認」。

「不是我」→ 進入畫面 ③ 用手機重新比對。

畫面 ③ 填寫手機號碼 需輸入

9:41LINE

綁定 LINE 帳號

讓我們找到你的會員資料

步驟 1 / 2
← 上一步
😊
陳小明
LINE 帳號(已自動偵測)
手機號碼
Email
手機號碼
0912-345-678
請輸入你註冊時使用的手機號碼
我同意個人資料蒐集與利用聲明
查詢並綁定
需要協助?致電 02-2361-2025

填寫手機號碼(預設)

方法 D / E / F / G / I「不是我」回退

預設手機號碼(大家通常用同一組),可 Tab 切換到 email。

· 步驟指示「1/2」· 說明原因 · 只需一個欄位 · 上一步可回退

畫面 ④ 確認身份 1 筆   ⑤ 輸入姓氏 多筆

9:41LINE

確認你的帳號

我們找到一筆符合的資料

步驟 2 / 2
← 重新輸入手機 / email
陳O明
091*****78 · ch***@gmail.com
😊
陳小明
你的 LINE 帳號
是我,確認綁定
不是我
需要協助?致電 02-2361-2025
9:41LINE

需要更多資訊

請輸入姓氏幫助我們找到你

← 重新輸入手機 / email
你的姓氏
例如:陳、林、王
查詢
找不到你的帳號?
建立新帳號
或致電客服 02-2361-2025

畫面 ⑥ 建立新帳號 CRM 找不到

9:41LINE

建立新帳號

填寫資料完成綁定

← 上一步
😊
陳小明
你的 LINE 帳號
*
*
小明
Email *
chen@gmail.com
手機號碼 *
0912-345-678
出生年月 *
1990-03
格式:YYYY-MM
我同意個人資料蒐集與利用聲明,授權綠色和平蒐集、處理及利用我的個人資料。
建立帳號並綁定 LINE
需要協助?致電 02-2361-2025

建立新帳號

欄位順序:姓 → 名 → Email → 手機 → 出生年月

預填:畫面 ③ 的手機/email、畫面 ⑤ 的姓氏自動帶入。

個資同意:必勾才能送出。

畫面 ⑦a 成功 + 月捐   ⑦b 成功

9:41LINE
綁定成功!
LINE 已與會員帳號連結
捐款通知 · 電子收據 · 活動資訊
🌍 每月定期捐款,守護地球
使用 LINE Pay 每月自動捐款
了解每月捐款 →
9:41LINE
綁定成功!
LINE 已與會員帳號連結
議題進展 · 活動通知 · 專屬資訊
關注更多議題
回到 LINE 查看最新消息

⑦a 捐款人版(左)· ⑦b 支持者版(右)

⑦a:有捐款紀錄 → LINE Pay 月捐 CTA。串聯策略,動力最高。

⑦b:沒有捐款紀錄 → 不推月捐。引導回 LINE。

畫面 ⑧ 錯誤   ⑨ 衝突

9:41Safari

請從 LINE 開啟

📱
此頁面需要從 LINE 內開啟
請用手機開啟 LINE App
搜尋「綠色和平」加入好友
QR Code
致電 02-2361-2025
9:41LINE

需要客服協助

此帳號已綁定其他 LINE
如需更換綁定,請聯繫客服。
客服電話
02-2361-2025
週一至週五 10:00-18:00
📞 撥打電話
重新開始

⑧ 錯誤(左)· ⑨ 衝突(右)

⑧:非 LINE 環境,提供 QR Code + 引導 + 客服電話

⑨:綁定衝突,「📞 撥打電話」按鈕直接撥號 + 重新開始

LIFF 會員中心 — 功能總覽

月捐會員在 LINE 裡自助管理捐款的完整功能結構。從 Rich Menu「我的帳號」進入。

LIFF 會員中心
主頁面 — 狀態卡片
捐款方式(LINE Pay / 信用卡)
月捐金額
狀態 badge(扣款中 / 已暫停 / 扣款失敗 / 已取消)
下次扣款日
累計捐款金額
請款紀錄
最近 12 筆扣款紀錄(日期 / 金額 / 成功或失敗)
修改捐款金額
4 個預設按鈕(+25% / +50% / +100% / 原金額×2)
自訂金額輸入
下次扣款日起生效
暫停月捐
選擇暫停 1 / 2 / 3 個月
顯示自動恢復日期
暫停期間不扣款,到期自動恢復
取消月捐(三層挽留)
第一層:影響提醒 —「你的捐款幫助了…」
第二層:建議暫停 —「不如先暫停?」
第三層:確認取消 — 最終確認按鈕
扣款失敗處理
紅色狀態提示
「更新付款方式」按鈕
LINE 訊息通知

設計研究依據

基於 2026-03 業界研究,涵蓋訂閱管理 UX best practices。

狀態卡片 + 功能列表
78% 的 mobile SaaS 採用 stacked card 佈局。Apple/Netflix/Spotify/LINE 設定頁面均採用此模式。列表模式擴展性好,新增功能只加一行入口。
暫停優先的取消流程
25% 的取消者會改為暫停(Recurly 研究)。34% 表示簡單折扣就能留住、34% 表示更低價格(UX Magazine)。取消流程依序:暫停 → 降金額 → 確認取消。
透明計費建立信任
清楚顯示扣款歷史、下次扣款日、金額。簡單的取消流程反而提高回訂率 — 隱藏取消會破壞信任。失敗付款的 dunning management 可恢復 15-40%。
影響力回饋 + 連結感
NGO 特有策略:讓捐款人看到「你的捐款幫助了什麼」顯著提高續捐率。暫停/取消流程嵌入影響力回顧增加決策摩擦力。

主頁面 — 狀態卡片 + 功能列表

入口:Rich Menu →「我的帳號」→ LIFF 會員中心。LIFF 自動取 LINE ID → 後端查 Contact → 顯示訂閱資料。

扣款中(正常狀態)

我的月捐
LINE Pay 每月捐款
NT$500
扣款中
上次請款
03/15
NT$500 ✓
下次請款
04/15
22 天後
累計捐款
NT$6,000
12 次
📋
請款紀錄
查看近期扣款明細
✏️
修改捐款金額
調整每月捐款金額
⏸️
暫停月捐
暫停 1-3 個月,到期自動恢復
取消月捐
停止所有定期扣款
需要協助?聯繫客服

已暫停狀態

我的月捐
LINE Pay 每月捐款
NT$500
⏸ 已暫停
06/15 自動恢復扣款
暫停期間 04/15 - 06/15
上次請款
03/15
恢復日期
06/15
累計捐款
NT$6,000
立即恢復月捐
不等到 06/15,現在就恢復
📋
請款紀錄
✏️
修改捐款金額
恢復時以新金額扣款
取消月捐
需要協助?聯繫客服

狀態卡片顏色對照

狀態背景色邊框色Badge
● 扣款中#f0fae6#c2eb99扣款中
● 已暫停#fff2cc#f0af23已暫停
● 扣款失敗#ffa9a9#ff3333扣款失敗
● 已取消#f5f7f8#ececec已取消

功能列表隨狀態切換

狀態顯示的列表項目
扣款中📋 請款紀錄 · ✏️ 修改捐款金額 · ⏸️ 暫停月捐 · ❌ 取消月捐
已暫停▶️ 立即恢復月捐(綠色突出)· 📋 請款紀錄 · ✏️ 修改捐款金額 · ❌ 取消月捐
扣款失敗🔄 更新付款方式(紅色突出)· 📋 請款紀錄 · ❌ 取消月捐
已取消🔄 重新訂閱(綠色 CTA)· 📋 請款紀錄

子流程 — 請款紀錄 & 修改金額

📋 請款紀錄

請款紀錄
累計捐款 NT$6,000
共 12 次
2026/03/15
NT$500
✓ 成功
2026/02/15
NT$500
✓ 成功
2026/01/15
NT$500
✗ 失敗
2025/12/15
NT$500
✓ 成功
2025/11/15
NT$300
✓ 成功
2025/10/15
NT$300
✓ 成功
顯示最近 12 筆,更多請聯繫客服

✏️ 修改捐款金額

修改捐款金額
目前金額
NT$500/月
調整金額
NT$550
NT$625
NT$750
NT$1,000
其他金額
NT$
輸入金額
最低 NT$100,最高 NT$50,000
ℹ️
新金額將於下次請款日(04/15)起生效。本月已完成的扣款不受影響。
預設金額邏輯:以目前金額為基準,動態計算 +10% / +25% / +50% / +100%。前端只顯示金額數字。

子流程 — 暫停月捐 & 取消月捐

⏸️ 暫停月捐

暫停月捐
暫停期間不會扣款,到期後自動恢復。你的捐款紀錄和累計金額都會保留。
選擇暫停時間
暫停 1 個月
05/15 自動恢復扣款
暫停 2 個月
06/15 自動恢復扣款
暫停 3 個月
07/15 自動恢復扣款
🌿 你知道嗎?
你過去 12 個月的捐款,幫助我們在台灣推動了 3 項環保倡議。每一份支持都很重要!

❌ 取消月捐(暫停優先流程)

取消月捐
你已經持續支持了
12 個月
累計捐款 NT$6,000
💡 考慮暫停?
暫停 1-3 個月後會自動恢復,不需要重新設定。你的捐款紀錄都會保留。
📉 降低金額?
如果是費用考量,你可以降低每月金額,持續守護環境。
仍然要取消?
取消後,已排定的下次扣款(04/15)將不會執行。
你隨時可以重新訂閱。
視覺層級:暫停建議(綠色 CTA 最醒目)→ 降金額(次要按鈕)→ 確認取消(紅框,視覺最弱)。尊重使用者意願,不阻擋。

綁定技術流程 — 完整時間線

使用者按下按鈕到綁定完成,每一秒發生什麼事。

時間
系統發生什麼
使用者看到什麼
0s
使用者按 感謝頁 / Email / SMS 裡的 LINE 綁定按鈕
按鈕
0.5s
瀏覽器跳轉到 liff.line.me/xxx?cid=token
LINE 平台接手處理 redirect
短暫白畫面 / LINE loading
1s
LINE 檢查是否已授權過此 LIFF app
僅第一次:LINE 同意畫面
「允許存取你的個人資料?」
使用者按「允許」
1.5s
LINE redirect 到 Endpoint URL
LIFF SDK 開始載入,執行 liff.init()
LIFF 綁定頁開始載入
2s
liff.getProfile() 取得 LINE ID + 名稱 + 大頭照
同時用 URL 裡的 cid 呼叫後端 API 查 CRM
載入中 spinner
2.5s
兩邊資料都拿到了
前端組合顯示確認畫面
看到 LINE 頭像 + CRM 姓名
「確認綁定?」
3s
使用者按「確認綁定」
前端 POST /api/bindline
按下確認按鈕
3.5s
後端解密 token → 取得 contact_id
呼叫 HubSpot API 更新 Contact 寫入 LINE ID
短暫載入
4s
HubSpot 回傳成功
後端回傳 { success: true }
「綁定完成!」
+ 每月捐款(LINE Pay) CTA
整個流程 4 秒,使用者只做了一個動作:按「確認綁定」。

安全性設計

防止 URL 竄改、重複綁定、API 濫用。

風險處理方式實作
URL 裡的 contact_id 被竄改 用加密 token,不是裸的 ID cid = encrypt(contact_id + timestamp + secret)
後端解密驗證
token 被截取重複使用 設 30 分鐘過期 + 一次性使用 token 含時間戳,使用後標記為已用
用自己的 LINE 綁到別人帳號 顯示模糊化資訊讓使用者確認 「陳O明 · ch***@gmail」— 不對的人不會按確認
API 被自動化攻擊 Rate limiting 每 LINE ID 每小時最多 5 次請求
個資法合規 綁定頁加同意勾選 「我同意個資蒐集與利用聲明」+ 連結

LIFF URL 結構 — 各場景的 URL 長怎樣

場景LIFF URLcid 來源
A 感謝頁 按鈕 liff.line.me/xxx?cid={token} 感謝頁 後端動態產生 token
B LIFF 捐款頁 liff.line.me/xxx/donate 不需要 — 表單送出時一起建立
C Email liff.line.me/xxx?cid={token} HubSpot template: {{contact.token}}
D/E/F/G LINE 內 liff.line.me/xxx 沒有 cid — 切換到填表模式
J SMS liff.line.me/xxx?cid={token} 客服觸發系統產生 token

LIFF 綁定頁判斷邏輯

liff.init({ liffId: 'xxx' }).then(async () => { const profile = await liff.getProfile(); const cid = new URLSearchParams(location.search).get('cid'); if (cid) { // 有 cid → 查 CRM → 顯示確認畫面(場景 1) const contact = await fetch(`/api/contact-preview?token=${cid}`); showConfirmScreen(profile, contact); } else { // 沒有 cid → 顯示填表畫面(場景 2) showInputScreen(profile); } });

後端 API 規格

BJ 需要開發的 API endpoints。

1. GET /api/contact-preview

用加密 token 查 CRM,回傳模糊化資料供前端顯示。

參數說明
token加密的 contact_id,30 分鐘過期
// Response { "maskedName": "陳O明", "maskedEmail": "ch***@gmail.com", "valid": true }

2. POST /api/bindline

執行綁定。兩種模式:有 token(直接綁)或 比對模式(查 email/phone)。

// 模式 1:有 token { "token": "xxx", "lineUserId": "Uabc...", "source": "thankyou_page" } // 模式 2:比對 { "matchBy": "email", "matchValue": "chen@gmail.com", "lineUserId": "Uabc...", "source": "richmenu" }
// Response { "success": true, "matched": true, // 比對模式才有 "maskedName": "陳O明", // 比對模式:讓前端確認 "needConfirm": true, // 比對模式:需使用者再按確認 "multipleResults": false // 是否有多筆結果 }

3. POST /api/generate-bind-token

客服 / 系統用,產生加密的一次性綁定 token(用於方法 J SMS 場景)。

// Request { "contactId": "12345" } // Response { "token": "aGVsbG8...", "liffUrl": "https://liff.line.me/xxx?cid=aGVsbG8...", "expiresAt": "2026-03-23T12:30:00Z" }

訂閱管理 API

建廠 / BJ 需要開發的 API endpoints。

1. GET /api/subscription/status

查詢使用者訂閱狀態,主頁面載入時呼叫。

// Request: line_id from LIFF GET /api/subscription/status?line_id=Uabc123 // Response { "status": "active", // active | paused | failed | cancelled | none "amount": 500, "currency": "TWD", "lastCharge": { "date": "2026-03-15", "amount": 500, "success": true }, "nextCharge": "2026-04-15", "totalDonated": 6000, "totalCount": 12, "pauseResumeDate": null // 暫停時有值 }

2. GET /api/subscription/history

請款紀錄,近 12 筆。

// Response { "records": [ { "date": "2026-03-15", "amount": 500, "success": true }, { "date": "2026-02-15", "amount": 500, "success": true }, { "date": "2026-01-15", "amount": 500, "success": false } ] }

3. POST /api/subscription/update-amount

修改捐款金額,下次請款日生效。

{ "line_id": "Uabc123", "newAmount": 625 }

4. POST /api/subscription/pause

暫停月捐,1-3 個月後自動恢復。

{ "line_id": "Uabc123", "months": 2 }