# LINE Webhook Setup

## 判斷

個人 LINE 沒有正式、穩定、合規的讀訊息 API。訂單自動讀取應使用 LINE 官方帳號的 Messaging API。

## 讀取時機

不使用排程輪詢。當客戶傳訊息到 LINE 官方帳號時，LINE 平台會自動 POST webhook event 到 ERP：

```text
LINE 官方帳號
→ Messaging API Webhook
→ /api/line_webhook.php
→ line_messages / message_parse
→ order_session / order_session_item
→ Work Center 確認任務
```

## Webhook URL

本機 Apache URL：

```text
http://localhost:8080/api/line_webhook.php
```

LINE Developers 後台需要 HTTPS 公開網址，不能直接填 localhost。開發階段可用 ngrok 或 Cloudflare Tunnel，把公開 HTTPS 轉到本機：

```text
https://你的公開網址/api/line_webhook.php
```

正式固定網域請使用：

```text
https://line.turnhouse-staff.com/api/line_webhook.php
```

LINE Developers 的 Verify 只需要確認 webhook endpoint 能接受 LINE 簽章後回 200。Verify 或空事件測試不應該依賴資料庫，因此 `line_webhook.php` 對空 body 與 `events: []` 會直接回：

```json
{"ok":true,"processed":0,"created_sessions":[]}
```

若本機測試正常但正式網域仍回舊錯誤，代表正式網域的 Nginx/PHP-FPM 指到另一份部署目錄，必須把以下檔案同步到正式主機：

- `api/line_webhook.php`
- `includes/line_config.php`
- `includes/db.php`
- `includes/order_helpers.php`

不要改 SSL、DNS、Nginx，除非正式主機目前指錯專案根目錄。

## 設定檔

複製設定範本：

```bash
cp includes/line_config.sample.php includes/line_config.local.php
```

填入 LINE Developers 的 Messaging API channel：

```php
return [
    'channel_secret' => 'Channel secret',
    'channel_access_token' => 'Channel access token',
    'verify_signature' => true,
    'reply_enabled' => false,
];
```

若使用 Docker/PHP-FPM，請確認容器環境變數：

```text
DB_HOST=db
DB_PORT=3306
DB_NAME=zhudichicken_erp
DB_USER=root
DB_PASS=你的 MySQL root 密碼
LINE_CHANNEL_SECRET=Messaging API Channel secret
LINE_CHANNEL_ACCESS_TOKEN=Messaging API Channel access token
LINE_VERIFY_SIGNATURE=1
LINE_REPLY_ENABLED=0
```

## LINE Developers 後台

1. 建立或打開 LINE Official Account 的 Messaging API channel。
2. 在 Messaging API settings 填入 Webhook URL。
3. 啟用 Use webhook。
4. 建議關閉 Auto-reply messages，避免官方帳號自動回覆干擾 ERP 流程。
5. 按 Verify 測試 webhook。

## 訊息格式建議

目前文字解析支援這種格式：

```text
客戶：鳥翔餐飲
電話：02-2222-1001
日期：2026-06-02
去骨雞腿 20包
半雞 12隻
```

一般聊天會被記錄為 webhook event，但不建立訂單草稿。只有像訂單的訊息才會建立 Order Session。

客戶不需要輸入客戶名稱或電話。系統會優先用 LINE userId / groupId 找既有客戶綁定；沒有綁定時，若有 Channel access token，會讀 LINE profile displayName 建立客戶；沒有 token 時則用 LINE ID 建立臨時客戶名稱。電話與地址只從系統客戶資料或客戶自願提供的訊息補入。
