LINE 三件套整合指南
Odoo 18 x WOOWTECH LINE Integration Suite
woow_line_base + woow_odoo_line_liff + woow_odoo_livechat_line
目錄
1. 模組架構總覽
LINE 三件套由三個 Odoo 模組組成,依賴關係由下而上:
woow_odoo_livechat_line
LiveChat 即時聊天 — 將 LINE 訊息接入 Odoo Discuss
depends: im_livechat, woow_line_base
woow_odoo_line_liff
LIFF 登入、Rich Menu、推播、分眾標籤、統計、Webhook、Flex(又名 woow_line_bridge)
depends: woow_line_base, portal, mail
woow_line_base
核心:LINE API 客戶端 + 用戶身份管理(push / multicast / broadcast)
depends: base
woow_line_base
API 客戶端、用戶模型、Partner 綁定
woow_odoo_line_liff
LIFF 登入、Rich Menu、推播、分眾、統計
woow_odoo_livechat_line
LINE <-> Odoo Discuss 即時聊天
LINE Developer Console
Messaging API + LINE Login + LIFF
2. 前置準備
你需要準備的
LINE 官方帳號 必要
LINE Developer Console 帳號 必要
到 developers.line.biz 登入
HTTPS 網域 必要
LINE API 要求所有 URL 必須是 HTTPS
Odoo 18 實例 必要
已安裝並可正常運作的 Odoo 18
Python requests 套件 必要
pip install requestsLINE 需要建立的 Channel(兩個)
Messaging API 必要
推播訊息、Rich Menu、Webhook 接收
LINE Login 必要
LIFF Portal 自動登入、ID Token 驗證
3. LINE Developer Console 設定
Step 1:建立 Provider
2
點擊 Create → 輸入公司名稱 → 建立
Step 2:建立 Messaging API Channel
1
在 Provider 裡 → Create a new channel → 選擇 Messaging API
2
填寫 Channel 名稱、描述、類別 → Create
3
進入 Basic settings 頁籤,複製以下資訊:
Channel ID →
messaging_channel_id範例:
2010556007Channel secret →
messaging_channel_secret範例:
2ad784509897cc05...4
進入 Messaging API 頁籤:
Channel access token (long-lived) →
messaging_access_token捲動到底部 → 點擊 Issue 產生長效 Token → 複製
注意:Access Token 很長!
Token 是一串約 170+ 字元的 Base64 編碼字串,務必完整複製,不要截斷。
Step 3:建立 LINE Login Channel(供 LIFF 使用)
1
在同一個 Provider 裡 → Create a new channel → 選擇 LINE Login
2
填寫 Channel 名稱 → Create
3
進入 Basic settings,複製:
Channel ID →
login_channel_id範例:
2010557723Channel secret →
login_channel_secret範例:
b24b00047093674e...Step 4:建立 LIFF App
1
進入 LINE Login Channel → LIFF 頁籤 → Add
2
設定 LIFF App:
Size
Full(全螢幕)
Endpoint URL
https://你的網域/liff/redirectScope
勾選 profile、openid
3
複製 LIFF ID(格式:
2010557723-SiwvhykM)→ 填入 Odoo 的 liff_id_member4. 模組安裝
安裝順序
1
woow_line_base(核心)
Settings → Apps → Update Apps List → 搜尋 "WOOW LINE Base" → Install
Settings → Apps → Update Apps List → 搜尋 "WOOW LINE Base" → Install
2
woow_odoo_line_liff(Bridge 層)
搜尋 "WOOW LINE Bridge" → Install(自動安裝 portal, mail 依賴)
搜尋 "WOOW LINE Bridge" → Install(自動安裝 portal, mail 依賴)
3
woow_odoo_livechat_line(LiveChat,選裝)
搜尋 "LINE LiveChat" → Install(自動安裝 im_livechat 依賴)
搜尋 "LINE LiveChat" → Install(自動安裝 im_livechat 依賴)
K8s 環境安裝
透過 kubectl exec 安裝:kubectl exec <pod> -c odoo -- python3 /usr/bin/odoo -c /etc/odoo/odoo.conf --db_password=<pwd> -d <db> -i woow_line_base,woow_odoo_line_liff,woow_odoo_livechat_line --stop-after-init --no-http
5. Odoo 設定(line.liff.config)
進入:LINE 選單 → 設定檔 → 新增
必填欄位(6 個)
1
name來源:自訂名稱 — 範例:
woowtech line assistant2
messaging_channel_id來源:Messaging API → Basic settings → Channel ID — 範例:
20105560073
messaging_channel_secret來源:Messaging API → Basic settings → Channel secret — 範例:
2ad784509897cc05...4
messaging_access_token來源:Messaging API → Channel access token (Issue) — 範例:
lnNuYK8U+8vox...5
login_channel_id來源:LINE Login → Basic settings → Channel ID — 範例:
20105577236
login_channel_secret來源:LINE Login → Basic settings → Channel secret — 範例:
b24b00047093...LIFF ID(至少填一個)
liff_id_member 必要會員 Portal 自動登入 — LIFF Endpoint URL:
https://域名/liff/redirectliff_id_news 選配最新消息頁面 — LIFF Endpoint URL:
https://域名/liff/newsliff_id_locations 選配店家位置地圖 — LIFF Endpoint URL:
https://域名/liff/locations店家資訊(選填)
shop_name店家名稱(出現在通知裡)— 範例:
渥屋科技 WoowTechshop_address地址 — 範例:
台北市信義區松仁路100號shop_phone電話 — 範例:
02-1234-5678shop_latitude / shop_longitude緯度 / 經度(地圖用)— 範例:
25.0330 / 121.5654shop_opening_hours營業時間 — 範例:
週一至週五 10:00-18:00行為設定
auto_line_notify自動推播通知(追蹤欄位變更時)— 預設:
Falseadmin_line_user_id管理員 LINE UID(Rich Menu 預覽用)— 預設:空
rebook_path重新預約路徑 — 預設:
/liff/redirect/bookrichmenu_contact_textRich Menu「聯絡」按鈕回覆文字 — 預設:空
自動計算欄位(唯讀)
webhook_url 自動https://域名/line/webhook/{id} — 複製到 LINE Console 的 Webhook 設定follower_count / target_reach / blocked_count 自動好友數 / 可觸及人數 / 封鎖數 — 每日 cron 自動抓取
自動同步機制
line.liff.config 修改時,所有欄位會自動同步到 ir.config_parameter,讓 line.api.service 不需要直接依賴 LIFF 模組就能讀取憑證。
6. Webhook 設定
在 LINE Developer Console 設定
1
在 Odoo 的
line.liff.config 表單裡,複製 Webhook URL 欄位的值2
到 LINE Developer Console → Messaging API → Webhook settings
3
貼上 URL,格式:
https://你的網域/line/webhook/{config_id}4
啟用 Use webhook 開關
5
點擊 Verify 按鈕,確認回傳 HTTP 200
Webhook 處理的事件類型
follow 事件用戶加好友 — 處理方式:建立/更新 LINE 用戶 + 推送歡迎訊息
unfollow 事件用戶封鎖/取消追蹤 — 處理方式:標記 is_follower=False, is_blocked=True
message 事件文字訊息 — 處理方式:關鍵字自動回覆 + 轉發到 LiveChat
postback 事件按鈕回傳 — 處理方式:動態分派到 _postback_{action}()
7. LIFF 設定
LIFF(LINE Front-end Framework)讓用戶在 LINE 內開啟時自動登入 Odoo Portal。
LIFF 登入流程
LIFF 自動登入流程
用戶在 LINE 點擊 Rich Menu 連結
↓
開啟 LIFF 頁面(https://liff.line.me/{liff_id})
↓
LIFF SDK 初始化 → 檢查 isLoggedIn()
├── 未登入 → liff.login() → LINE 登入頁
└── 已登入 → 取得 ID Token
↓
POST /liff/redirect/{target} + id_token
↓
Odoo 後端驗證:
├── verify_id_token() → 取得 LINE UID
├── create_or_update line.user
├── _ensure_portal_user() → 找/建 portal 帳號
└── session.authenticate() → 建立登入 session
↓
302 Redirect → 目標頁面(已登入狀態)
LIFF Redirect 支援的目標頁面
book→ /appointment/1/schedule — 線上預約
my-bookings→ /my/ext-bookings — 我的預約
profile→ /my/account — 個人資料
home→ /my/home — Portal 首頁
orders→ /my/orders — 訂單列表
invoices→ /my/invoices — 發票列表
8. LINE Official Account Manager 設定
到 manager.line.biz 設定以下項目:
最重要:回應模式必須設為 Bot 模式!
如果設為「聊天」模式,Webhook 將不會收到任何事件,所有整合功能都會失效。
回應模式 Bot 模式
位置:設定 → 回應設定 — 啟用 Webhook 事件傳遞
Webhook 啟用
位置:設定 → 回應設定 — 接收用戶互動事件
自動回應訊息
位置:設定 → 回應設定 — 建議停用,由 Odoo auto.reply 處理
加入好友歡迎訊息
位置:設定 → 回應設定 — 建議停用,由 Odoo Flex welcome 處理
9. 完整參數對照表
ir.config_parameter 系統參數
以下參數由 line.liff.config 自動同步寫入:
Messaging API 參數
woow_line_base.messaging_channel_id來源:messaging_channel_id — Messaging API Channel ID
woow_line_base.messaging_channel_secret來源:messaging_channel_secret — Messaging API Channel Secret
woow_line_base.messaging_access_token來源:messaging_access_token — 長效 Access Token
LINE Login 參數
woow_line_base.login_channel_id來源:login_channel_id — LINE Login Channel ID
woow_line_base.login_channel_secret來源:login_channel_secret — LINE Login Channel Secret
行為控制
woow_line_base.auto_line_notify來源:auto_line_notify — 自動推播開關
woow_line_base.admin_line_user_id來源:admin_line_user_id — 管理員 LINE UID
LIFF 參數
woow_odoo_line_liff.liff_id_member來源:liff_id_member — LIFF ID(會員)
woow_odoo_line_liff.liff_id_news來源:liff_id_news — LIFF ID(新聞)
woow_odoo_line_liff.liff_id_locations來源:liff_id_locations — LIFF ID(位置)
店家資訊
woow_odoo_line_liff.shop_name來源:shop_name — 店家名稱
woow_odoo_line_liff.shop_address來源:shop_address — 店家地址
woow_odoo_line_liff.shop_phone來源:shop_phone — 店家電話
woow_odoo_line_liff.shop_latitude來源:shop_latitude — 緯度
woow_odoo_line_liff.shop_longitude來源:shop_longitude — 經度
woow_odoo_line_liff.shop_opening_hours來源:shop_opening_hours — 營業時間
其他
woow_odoo_line_liff.rebook_path來源:rebook_path — 重新預約路徑
woow_odoo_line_liff.richmenu_contact_text來源:richmenu_contact_text — 聯絡按鈕文字
10. 功能模組說明
Rich Menu 管理
LINE → Rich Menu → 新增。上傳選單圖片 → 定義觸按區域 → 上傳到 LINE → 設為預設。
uri 動作開啟 URL
liff_portal 動作開啟 Portal 頁面(自動轉為 LIFF URL)
message 動作傳送文字訊息
postback 動作Postback(觸發後端邏輯)
richmenuswitch 動作切換到另一個 Rich Menu(Tab 式)
clipboard 動作複製文字到剪貼板
推播方式
broadcast全員推播 — 限制:60 次/小時
multicast批量推播(指定用戶)— 限制:200 次/秒,每次 500 人
push逐一推播 — 限制:200 次/秒
narrowcast分眾精準推播 — 限制:60 次/小時
分眾標籤(Audience Tag)
LINE → 分眾標籤 → 新增標籤 → 加入用戶 → 同步到 LINE Audience → 用於 narrowcast 推播
統計紀錄(Insight Log)
每日凌晨自動抓取 LINE Insight API:送達數、好友數、封鎖數、互動率。
關鍵字自動回覆
contains 比對包含關鍵字 — 支援佔位符:
{shop_name} {shop_phone} {shop_address} {shop_hours}exact 比對完全比對 — 支援佔位符:
{shop_name} {shop_phone} {shop_address} {shop_hours}regex 比對正規表達式 — 支援佔位符:
{shop_name} {shop_phone} {shop_address} {shop_hours}11. 程式碼範例
推播文字訊息
svc = env['line.api.service'].sudo()
user = env['line.user'].search([('display_name', 'like', 'Peter')], limit=1)
# push() 接受 line.user recordset
svc.push(user, [svc.build_text_message('Hello!')])
# push_message() 接受 string UID
svc.push_message('Ud370eadae1a02...', [svc.build_text_message('Hello!')])
全員廣播
svc = env['line.api.service'].sudo()
svc.broadcast([svc.build_text_message('公告:本週六休息')])
批量推播
svc = env['line.api.service'].sudo()
uids = env['line.user'].search([('is_follower', '=', True)]).mapped('line_user_id')
svc.multicast(uids, [svc.build_text_message('批量訊息')])
Flex 通知訊息
factory = env['line.flex.factory'].sudo()
flex = factory.build_notification(
event_type='success',
title='訂單已確認',
subtitle='SO00123',
info_rows=[('產品', '專業按摩'), ('金額', 'NT$ 1,500')],
buttons=[{'label': '查看詳情', 'uri': 'https://你的網域/my/orders/123'}],
)
svc = env['line.api.service'].sudo()
svc.push_message('Ud370eadae...', [flex])
透過 Partner 推播
partner = env['res.partner'].browse(42)
partner.push_to_line('你的訂單已出貨!') # 自動找到 LINE 用戶推播
分眾推播(Narrowcast)
# 1. 建立標籤並加入用戶
tag = env['line.audience.tag'].create({'name': 'VIP 客戶'})
vip_users = env['line.user'].search([('partner_id.customer_rank', '>', 5)])
tag.write({'user_ids': [(6, 0, vip_users.ids)]})
# 2. 同步到 LINE Audience
tag.action_sync_to_line()
# 3. 在推播新聞時選擇 narrowcast + 該標籤
12. 流程圖
設定流程
跨平台設定流程對照
LINE Developer Console Odoo LINE OA Manager
1. 建立 Provider
2. 建立 Messaging API Channel
→ 取得 Channel ID/Secret 3. 填入 line.liff.config
→ 發行 Access Token 3. 填入 line.liff.config
4. 建立 LINE Login Channel
→ 取得 Channel ID/Secret 5. 填入 line.liff.config
6. 建立 LIFF App
→ 取得 LIFF ID 7. 填入 liff_id_member
← 設定 Endpoint URL ← 從 config 複製 webhook_url
8. 設定 Webhook URL ← 從 config 複製 webhook_url
9. 關閉「聊天」→ Bot 模式
10. 啟用 Webhook
11. 停用自動回應
Webhook 事件處理
Webhook 事件處理流程
LINE Platform → POST /line/webhook/{config_id}
↓
├── 驗證 X-Line-Signature (HMAC-SHA256)
│ └── 失敗 → 200 OK(靜默丟棄)
↓
├── _process_event(event)
│ ├── 記錄到 line.event.log
│ ├── follow → 建立用戶 + 推送歡迎 Flex
│ ├── unfollow → 標記封鎖
│ ├── message → 關鍵字比對 → 自動回覆
│ └── postback → 分派到 _postback_{action}()
↓
└── _forward_to_livechat(event)
└── 轉發到 woow_odoo_livechat_line(如已安裝)
└── 訊息出現在 Odoo Discuss
自動推播 Hook 流程
自動推播 Hook 流程
任何模型狀態變更(例:銷售訂單確認)
↓
mail.tracking.value 記錄欄位變更
↓
mail.notification.create() 被觸發
↓
LINE 模組 override → _push_line_notifications()
↓
├── 檢查 skip_line_notification 旗標
├── 檢查 auto_line_notify 是否啟用
↓
├── 取得 partner 綁定的 LINE 用戶
├── line.flex.factory.build_tracking_notification()
└── line.api.service.push() → 推送 Flex Message
13. 疑難排解
Webhook 回 200 但沒收到事件
原因:簽章驗證失敗
解決:確認
解決:確認
messaging_channel_secret 與 LINE Console 一致 推播全部失敗
原因:Access Token 過期或被撤銷
解決:到 LINE Console 重新 Issue Token → 更新 Odoo 設定
解決:到 LINE Console 重新 Issue Token → 更新 Odoo 設定
LIFF 登入無限循環
原因:
解決:設定 → Technical → System Parameters → 改為 HTTPS
web.base.url 是 HTTP解決:設定 → Technical → System Parameters → 改為 HTTPS
LIFF 登入 "Invalid ID token"
原因:Login Channel ID 不符
解決:確認
解決:確認
login_channel_id 與 LIFF App 所屬 Channel 一致 圖片在 LINE 顯示為文字連結
原因:
解決:LINE API 要求所有媒體 URL 必須是 HTTPS
web.base.url 是 HTTP解決:LINE API 要求所有媒體 URL 必須是 HTTPS
Broadcast 失敗但 multicast 成功
原因:HTTP 429 限速
解決:正常行為,系統自動降級;檢查
解決:正常行為,系統自動降級;檢查
line_last_push_method Rich Menu 圖片沒出現
原因:只建立但沒上傳
解決:點擊 上傳到 LINE 按鈕(自動上傳圖片)
解決:點擊 上傳到 LINE 按鈕(自動上傳圖片)
自動推播沒觸發
原因:
解決:到 LINE 設定檔 → 啟用「自動 LINE 通知」
auto_line_notify 未啟用解決:到 LINE 設定檔 → 啟用「自動 LINE 通知」
LiveChat 沒收到 LINE 訊息
原因:LiveChat Channel 沒設定 LINE ID
解決:編輯 LiveChat Channel → 填入 LINE Messaging Channel ID
解決:編輯 LiveChat Channel → 填入 LINE Messaging Channel ID
Portal 用戶無法用密碼登入
原因:LIFF 每次產生隨機密碼
解決:設計如此,用戶只能透過 LIFF 登入
解決:設計如此,用戶只能透過 LIFF 登入
numbercall 錯誤
原因:Odoo 18 已移除此欄位
解決:刪除
解決:刪除
ir_cron.xml 裡的 numbercall 行14. 安全性注意事項
Webhook 安全
HMAC-SHA256 簽章驗證
每個 Webhook 請求都用 HMAC-SHA256 驗證簽章
Channel Secret 保密
Channel Secret 用來計算簽章,必須保密
靜默丟棄無效請求
無效簽章靜默丟棄(仍回 200 防止 LINE 重試)
LIFF Token 安全
Token 有效期限
ID Token 有
exp 到期時間(5-10 分鐘),過期自動失效 POST body 傳送
Token 透過 POST body 傳送(不是 URL 參數),不會出現在日誌/Referrer
隨機 Portal 密碼
每次 LIFF 登入產生新的隨機 Portal 密碼
憑證儲存
憑證以明文存在 ir.config_parameter
只有 Settings / Technical 權限的管理員能讀取。UI 表單使用 password widget 遮蔽,但底層是明文。
Token 輪換流程
1
LINE Console → Messaging API → Issue 新 Token
2
Odoo → 更新
messaging_access_token3
重啟 Odoo workers(清除記憶體中的 Token cache)
4
舊 Token 在 LINE Console 手動撤銷前仍有效
15. 完整設定檢查表
Phase 1:LINE Console 設定
- 到 developers.line.biz 建立 Provider
- 建立 Messaging API Channel → 複製 Channel ID / Secret
- 發行長效 Access Token → 複製
- 建立 LINE Login Channel → 複製 Channel ID / Secret
- 建立 LIFF App(至少 1 個)→ 複製 LIFF ID
- 設定 LIFF Endpoint URL
Phase 2:Odoo 安裝
- 安裝 woow_line_base 模組
- 安裝 woow_odoo_line_liff 模組
- 安裝 woow_odoo_livechat_line 模組(選裝)
Phase 3:Odoo 設定
- 建立 line.liff.config 記錄
- 填入 Messaging Channel ID
- 填入 Messaging Channel Secret
- 填入 Messaging Access Token
- 填入 Login Channel ID
- 填入 Login Channel Secret
- 填入 LIFF ID (Member)
- 填入店家資訊(選填)
- 設定 web.base.url 為 HTTPS
Phase 4:LINE Console 回填
- 複製 Odoo 的 Webhook URL → 貼到 LINE Console Webhook 設定
- 啟用 Use webhook 開關
- 點擊 Verify 確認成功
- 設定 LIFF Endpoint URL
Phase 5:LINE Official Account Manager
- 回應模式改為 Bot 模式(關閉聊天)
- Webhook 確認啟用
- 停用自動回應訊息
- 停用加入好友歡迎訊息
Phase 6:測試驗證
- 從 LINE App 傳訊息 → 確認 Odoo line.event.log 有記錄
- 從 Odoo 推播測試訊息 → 確認 LINE App 收到
- 測試 LIFF 登入 → 確認能自動登入 Portal
- 建立 Rich Menu → 確認 LINE 聊天室顯示
- 建立分眾標籤 → 同步到 LINE → 測試 narrowcast