2025-07-07 Line 訂單系統-C 階段(LINE 訂單整合:前端 + 後端串接)
2025-07-07 Line 訂單系統-C 階段(LINE 訂單整合:前端 + 後端串接)
把 C 階段(LINE 訂單整合:前端 + 後端串接) 的設計與完整實作步驟交給你。
我會從「用戶在 LINE 下單的 UX 流程」開始,接著給出資料庫變更、後端(Node.js)實作、前端(Vue3)如何顯示訂單、LINE webhook 處理 postback 的範例,並補上測試、例外處理、以及實務要注意的安全/可靠性建議。你可以直接複製貼上程式碼並執行。
一、用戶下單流程(UX 簡述)
- 使用者在 LINE 傳「我要點餐」或按主選單 → Bot 回傳商品清單(Flex Carousel,每件商品含「購買」按鈕)。
- 使用者按「購買」按鈕(postback),按鈕會送出
action=buy&productId=XXX&qty=1(或showConfirm先顯示確認視窗)。 - Bot 接收到 postback → 後端建立訂單(orders + order_items) → 回覆「訂單已建立(編號:A0001)」並顯示訂單明細。
- 管理後台(Vue)即時或短輪詢取得新訂單,可變更訂單狀態(pending → confirmed → shipped)。
- 狀態更新時,後端可用 LINE push/message 回覆給訂購用戶(或用 reply when possible)。
設計重點:盡量用 postback 與 payload 包資料,減少「逐步輸入暫存狀態」的複雜性;必要時可用 Redis 保存臨時狀態。
二、資料庫(MySQL)變更與新增表
在 backend/db_init.sql(或新增 migration)加入:
1 | USE line_order_db; |
order_no 的生成策略:YYYYMMDD-XXXX 或 A0001 類型(下文會示範簡單生成器)。
三、後端(Node.js)實作重點
1) 新增 / 修改後端路由檔案
在 backend/routes/ 加兩個檔: products.js(若已存在)與 orders.js(更完善) — 我會把 orders.js 的重點流程示範出來,並在 line.js 中加上處理 postback 的邏輯。
backend/routes/orders.js
1 | // backend/routes/orders.js |
注意:這段用 transaction(事務)保證 orders 與 order_items 的一致性。
2) 修改 backend/routes/line.js:處理 postback 與 message 指令
1 | // backend/routes/line.js (重點段) |
重點:
postback.data常用 URLQuery 格式來傳遞action/productId/qty,接到就做事。
四、前端(管理後台)改造:顯示訂單詳情與狀態通知
前面 B 階段已有 Orders.vue。補強要點:
- 顯示
items(從 orders API 中取得 JSON Array) - 新增「通知買家」按鈕(call backend route 更新狀態並推送 LINE message)
- 若想即時呈現新訂單:可採短輪詢(每 5–10 秒請求
/orders)或 WebSocket(進階)。
簡單的 Orders.vue 擴充範例(只顯示 items):
1 | <template> |
注意:
o.items在ordersroute 我用 JSON_ARRAYAGG 回傳為 JSON 字串;前端須 parse。
五、後端:增加通知 API(管理者按鈕呼叫)
在 orders.js 增加通知 route:
1 | // notify endpoint |
(實際請把 Client 建在共用檔或 index.js,不要每次新建)
六、測試方法(逐步)
- 啟動 MySQL、後端(
npm run dev)、ngrok(ngrok http 3000)並把 webhook 設好。 - 在後台
Products新增一兩個測試商品(或直接在 MySQL insert)。 - 用手機在 LINE 發「我要點餐」 → 應收到 Flex 商品清單(含「購買」)。
- 按「購買」→ Bot 回覆「已建立訂單」與訂單編號。
- 後台
/orders應立即可見該訂單(或短輪詢後出現)。 - 在後台將狀態改為
confirmed→ 點「通知用戶」→ 檢查 LINE 使用者是否收到推播。
模擬 postback 測試(curl):
你可以用 curl 模擬 LINE 的 postback event(開發時):
1 | curl -X POST http://localhost:3000/line/webhook \ |
注意:
@line/bot-sdkmiddleware 會驗證簽章,真實 LINE 事件會有 signature。為本地測試可臨時用 route 不帶 middleware(僅測功能),或用工具繞過。
七、可靠性、安全與實務注意事項
- Webhook 驗簽:在開發(公開測試)時使用
middleware(config);部署時絕對不要關掉驗簽。 - 事務處理:建立訂單時使用 DB transaction(範例已示)。
- 重複請求:postback 或 webhook 可能重送。建議在
orders表用order_no或提供client_request_id來做去重檢查(idempotency key)。 - 資料驗證:在後端對
items、product_id、qty做型別與範圍檢查。 - 資安:
LINE_CHANNEL_ACCESS_TOKEN/LINE_CHANNEL_SECRET/ DB 密碼 放.env,不管測試或上線都不要提交到 Git。 - 錯誤回補:如果 DB 寫入成功但回覆失敗,須有 logging 與重試機制(排程或 queue)。
- 異地通知:若想把通知給管理者或多個 admin,可把 admin list 存到 DB 或 env 中並迴圈 push。
- 效能:高頻查詢訂單狀態時可將熱門欄位快取到 Redis(例如 order status, last 50 orders)。
- 使用者資料:建議把 LINE user profile(displayName、picture)存於
users表,第一次互動用client.getProfile(userId)取得並儲存。
八、擴充建議(下一步可以做)
- 付款整合(LINE Pay /第三方):建立
payments表並把付款狀態與訂單關聯。 - 多商品一次下單:目前示例是單一 product buy,可擴展為購物車(multiple items)流程 (要設計「選擇數量」「加入購物車」「結帳畫面」)。
- 狀態 WebSocket 即時推送管理後台:用 Socket.io 把新訂單即時推給管理者頁面。
- 自然語言解析:用簡單關鍵字或 webhook 傳到 NLP(例如 Rasa)解析複雜句子(「我要兩個紅豆麵包明天 10 點取貨」),再轉成結構化 order payload。
- 測試自動化:用 Postman collection + Newman 或 Jest + Supertest 做 webhook 與 API 自動測試。
九、Checkpoint(C 階段完成判定)
- LINE
我要點餐能回傳商品 Flex carousel。 - 使用者按「購買」後,後端在
orders、order_items生成正確資料。 - 後台 Orders 頁能看到新訂單與明細(items)。
- 管理後台可改狀態並通知使用者(LINE push)。
- 有錯誤處理與 DB 事務保證,不會造成半成品訂單。
📘 階段 C 主要任務(你目前所在的位置)
這個階段的重點是:
讓 LINE Bot 能和你的後端、前端真正「串起來」,自動處理訂單。
✅ 已準備完成的內容
.env範例 ✅db_init.sql✅- 專案資料夾結構(backend + frontend)✅
🧩 下一步實作建議(C 階段要做的 4 大步)
| 步驟 | 名稱 | 任務內容 | 目的 |
|---|---|---|---|
| C1 | 設定 LINE Webhook | LINE Developers 建立 Messaging API、設 webhook URL、設定 channel token/secret | 讓 LINE 傳訊息能送到你的 Node.js 伺服器 |
| C2 | Node.js webhook 處理 | 建立 /webhook 路由,驗證 LINE 簽章,接收訊息事件 |
能處理使用者的 LINE 訊息(例如「查詢商品」) |
| C3 | 訂單整合邏輯 | 使用者輸入商品代號 → Node.js 查詢 MySQL → 回傳訂單資訊 | 讓 Bot 可以真實回覆商品資料 |
| C4 | Vue3 後台整合顯示 | 新增「LINE 訂單紀錄」頁面,顯示 MySQL 訂單狀態 | 讓管理者在前端後台看到來自 LINE 的訂單紀錄 |
如果你願意,我可以立刻幫你產出:
- 已修改好的
backend/routes/orders.js與backend/routes/line.js完整檔案(可直接放入你 repo)。 - 一個簡易的
Productsseed SQL(幾筆商品)與Orders測試腳本(curl 範例)。 - 前端
Orders.vue的完整可直接替換版本,包含 notify 按鈕對應的 API 呼叫。
你要我先把哪一份檔案內容直接貼給你(或打包成可以 git clone 的 commit 範例)?