跳至內容

LINE 三件套整合指南 — Odoo 18 x WOOWTECH

2026年7月16日
LINE 三件套整合指南 — Odoo 18 x WOOWTECH
渥屋科技股份有限公司, 系統管理者
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 帳號 必要
HTTPS 網域 必要
LINE API 要求所有 URL 必須是 HTTPS
Odoo 18 實例 必要
已安裝並可正常運作的 Odoo 18
Python requests 套件 必要
pip install requests

LINE 需要建立的 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
範例:2010556007
Channel 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
範例:2010557723
Channel secret → login_channel_secret
範例:b24b00047093674e...

Step 4:建立 LIFF App

1
進入 LINE Login Channel → LIFF 頁籤 → Add
2
設定 LIFF App:
Size
Full(全螢幕)
Endpoint URL
https://你的網域/liff/redirect
Scope
勾選 profileopenid
3
複製 LIFF ID(格式:2010557723-SiwvhykM)→ 填入 Odoo 的 liff_id_member

4. 模組安裝

安裝順序

1
woow_line_base(核心)
Settings → Apps → Update Apps List → 搜尋 "WOOW LINE Base" → Install
2
woow_odoo_line_liff(Bridge 層)
搜尋 "WOOW LINE Bridge" → Install(自動安裝 portal, mail 依賴)
3
woow_odoo_livechat_line(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 assistant
2 messaging_channel_id
來源:Messaging API → Basic settings → Channel ID — 範例:2010556007
3 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 — 範例:2010557723
6 login_channel_secret
來源:LINE Login → Basic settings → Channel secret — 範例:b24b00047093...

LIFF ID(至少填一個)

liff_id_member 必要
會員 Portal 自動登入 — LIFF Endpoint URL:https://域名/liff/redirect
liff_id_news 選配
最新消息頁面 — LIFF Endpoint URL:https://域名/liff/news
liff_id_locations 選配
店家位置地圖 — LIFF Endpoint URL:https://域名/liff/locations

店家資訊(選填)

shop_name
店家名稱(出現在通知裡)— 範例:渥屋科技 WoowTech
shop_address
地址 — 範例:台北市信義區松仁路100號
shop_phone
電話 — 範例:02-1234-5678
shop_latitude / shop_longitude
緯度 / 經度(地圖用)— 範例:25.0330 / 121.5654
shop_opening_hours
營業時間 — 範例:週一至週五 10:00-18:00

行為設定

auto_line_notify
自動推播通知(追蹤欄位變更時)— 預設:False
admin_line_user_id
管理員 LINE UID(Rich Menu 預覽用)— 預設:空
rebook_path
重新預約路徑 — 預設:/liff/redirect/book
richmenu_contact_text
Rich 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 設定
LIFF 登入無限循環
原因:web.base.url 是 HTTP
解決:設定 → Technical → System Parameters → 改為 HTTPS
LIFF 登入 "Invalid ID token"
原因:Login Channel ID 不符
解決:確認 login_channel_id 與 LIFF App 所屬 Channel 一致
圖片在 LINE 顯示為文字連結
原因:web.base.url 是 HTTP
解決:LINE API 要求所有媒體 URL 必須是 HTTPS
Broadcast 失敗但 multicast 成功
原因:HTTP 429 限速
解決:正常行為,系統自動降級;檢查 line_last_push_method
Rich Menu 圖片沒出現
原因:只建立但沒上傳
解決:點擊 上傳到 LINE 按鈕(自動上傳圖片)
自動推播沒觸發
原因:auto_line_notify 未啟用
解決:到 LINE 設定檔 → 啟用「自動 LINE 通知」
LiveChat 沒收到 LINE 訊息
原因:LiveChat Channel 沒設定 LINE ID
解決:編輯 LiveChat Channel → 填入 LINE Messaging Channel ID
Portal 用戶無法用密碼登入
原因: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_token
3
重啟 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
分享這個貼文