網站上有聯絡表單、預約功能或購物車的人,多半都遇過同一件事:客人下午就送出了訂單,你晚上打開信箱才看到。Email 通知不是不能用,但它會被淹沒、會進垃圾郵件,而且沒有人一天到晚盯著收件匣。台灣人真正隨時在看的是 LINE。所以最直接的解法,就是讓網站在收到訂單或預約的那一刻,主動發一則 LINE 訊息到你的手機。
這篇文章整理這件事現在的正規做法。先說結論:過去大家慣用的 LINE Notify 已經在 2025 年 3 月底停止服務,現在要做通知,走的是「LINE 官方帳號+Messaging API」這條路。申請流程不難,程式端要加的東西也不多,一個下午可以做完。
一、哪些情境用得到
只要網站上有「訪客做了某件事、你希望第一時間知道」的功能,都適用同一套做法:
- 聯絡表單有人送出詢問
- 預約系統收到新預約、或有人取消
- 購物車成立新訂單、收到付款
- 報名活動額滿、庫存低於安全量
- 網站發生錯誤或異常(把通知當警報器用)
共通點是:事件都發生在網站的「後端」。表單處理、訂單成立這些程式碼跑到一半的時候,順手多發一則 LINE 訊息出去。理解這一點,後面的架構就都好懂了。
二、先弄清楚現況:LINE Notify 走入歷史之後
如果你以前研究過這個題目,看到的教學十之八九教的是 LINE Notify:免費、申請一個 token 就能發,小商家和工程師都愛用。但 LINE 官方已經在 2025 年 3 月 31 日終止了這項服務,舊教學裡的作法現在完全行不通,網路上還留著大量過時文章,查資料時要特別留意日期。
官方指定的替代方案,就是透過 LINE 官方帳號(LINE OA)搭配 Messaging API 發送訊息。兩者的差異值得先知道:
| LINE Notify(已停用) | Messaging API(現行做法) | |
|---|---|---|
| 發送者 | 「LINE Notify」官方機器人 | 你自己的官方帳號 |
| 費用 | 免費、無上限 | 輕用量方案免費,每月 200 則;超過需升級付費方案 |
| 計算方式 | — | 按「送達人次」計,發給 3 個人算 3 則 |
| 訊息形式 | 純文字為主 | 文字、圖片、影片、位置、Flex 卡片訊息 |
費用部分先安心:如果通知只發給你自己(或老闆加你兩個人),一天就算來十筆訂單,一個月也就三百則上下,超出免費額度時升級中用量方案(台灣目前月費 800 元、含 3,000 則)也還算合理。純自用的通知情境,多數人用免費方案就夠了。
三、運作原理
拆開來看只有三個要素:一個代表你網站的「LINE 官方帳號」(訊息由它發出)、一組證明你有權使用這個帳號發訊息的「Channel Access Token」,以及一個標明訊息要發給誰的「User ID」。事前準備做的就是把這三樣東西弄到手。
四、事前準備:四樣東西
1. 建立 LINE 官方帳號
到 LINE 官方帳號申請頁免費建立一個帳號。名稱取「某某網站通知」這類一看就懂的就好,這個帳號的用途單純是發通知,不用經營。
2. 啟用 Messaging API
在官方帳號管理後台(LINE Official Account Manager)的設定裡啟用 Messaging API,過程中會引導你連結或建立一個 LINE Developers 的 Channel。完成後,這個官方帳號就具備了「用程式發訊息」的能力。
3. 發行 Channel Access Token
到 LINE Developers Console,進入剛剛的 Channel,在 Messaging API 分頁找到 Channel Access Token(long-lived),按下發行。這一長串字串就是你程式發訊息時的通行證,等同密碼,不能外流,後面的安全一節會再細講。
4. 取得接收者的 User ID
Messaging API 的訊息要指名發給誰,用的不是 LINE ID 或電話,而是一組 U 開頭的內部識別碼。兩個常用的取得方式:
- 發給自己(開發者本人):最簡單。Developers Console 的 Channel 頁面上有一欄「Your user ID」,直接複製就是你自己的。
- 發給別人(例如老闆):請對方先把這個官方帳號加為好友,然後在 Channel 的 Webhook 設定裡暫時填一個 webhook.site 產生的網址,請對方傳一句話給官方帳號,webhook.site 上就會看到一筆事件,裡面的
source.userId就是對方的 User ID。記下來之後把 Webhook 關掉即可。
五、依你的網站類型選作法
不管選哪條路,核心都是同一件事:找到一個「事件發生時會被執行、而且訪客看不到原始碼」的位置,在那裡呼叫 LINE 的 API。唯一絕對不能做的,是把呼叫 API 的程式寫在前端 JavaScript 裡,原因見安全一節。
六、程式範例
Messaging API 的推播就是一個 HTTP POST:打 https://api.line.me/v2/bot/message/push,Header 帶上 Token,內容指定收件人和訊息。以下三個範例可直接拿去改。
Node.js(Express 表單處理為例)
// 表單送出後的處理函式裡,資料存檔之後多呼叫這一段
async function sendLineNotify(order) {
await fetch("https://api.line.me/v2/bot/message/push", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + process.env.LINE_CHANNEL_TOKEN // Token 放環境變數
},
body: JSON.stringify({
to: process.env.LINE_ADMIN_USER_ID, // 收件人 User ID
messages: [{
type: "text",
text: `新訂單通知\n姓名:${order.name}\n項目:${order.item}\n時間:${order.time}\n電話:${order.phone}`
}]
})
});
}
PHP(多數傳統網站適用)
// 放在表單處理(例如 contact.php)寄信或寫入資料庫之後
function send_line_notify($name, $item, $time, $phone) {
$payload = json_encode([
"to" => getenv("LINE_ADMIN_USER_ID"),
"messages" => [[
"type" => "text",
"text" => "新訂單通知\n姓名:{$name}\n項目:{$item}\n時間:{$time}\n電話:{$phone}"
]]
], JSON_UNESCAPED_UNICODE);
$ch = curl_init("https://api.line.me/v2/bot/message/push");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Bearer " . getenv("LINE_CHANNEL_TOKEN")
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true
]);
curl_exec($ch);
curl_close($ch);
}
Google Apps Script(純靜態網站的免費中繼)
沒有後端的網站,可以到 script.google.com 建一個專案貼上以下程式,部署成「網頁應用程式」(存取權設「任何人」),把產生的網址當成表單的送出目標:
const TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_TOKEN");
const ADMIN = PropertiesService.getScriptProperties().getProperty("ADMIN_ID");
function doPost(e) {
const d = JSON.parse(e.postData.contents);
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + TOKEN },
payload: JSON.stringify({
to: ADMIN,
messages: [{ type: "text",
text: "網站新詢問\n姓名:" + d.name + "\n訊息:" + d.message }]
})
});
return ContentService.createTextOutput("ok");
}
Token 和 User ID 記得存在 GAS 的「指令碼屬性」(Script Properties)裡,不要直接寫在程式碼中。前端表單則用 fetch() 把欄位資料 POST 到這個網址即可。
七、安全注意事項
- Token 絕對不進前端。寫在網頁的 JavaScript 裡等於公開發布,任何人按 F12 就能拿走你的 Token,冒用你的官方帳號發訊息、耗光你的額度。Token 只能存在後端的環境變數或設定檔,而且這個檔案不能進公開的 Git repository。
- Token 外洩就重發。Developers Console 可以撤銷舊 Token 重新發行,懷疑外洩不用猶豫。
- 通知內容斟酌個資。訊息會經過 LINE 的伺服器,姓名加電話尚可接受,身分證字號、信用卡資訊這類就不要放進通知裡,後台看得到就好。
- 失敗不要影響主流程。發通知的程式要包在錯誤處理裡(try/catch),萬一 LINE API 一時故障,客人的訂單還是要正常成立,不能因為通知發不出去就整筆失敗。
八、測試與常見錯誤
上線前先用 curl 或 Postman 直接打一次 API,確認 Token 和 User ID 沒問題,再接進網站流程。常見的錯誤代碼對照:
| 狀態碼 | 代表意義 | 處理方式 |
|---|---|---|
| 401 | Token 無效 | 檢查有沒有帶 Bearer 前綴、Token 是否複製完整或已被撤銷 |
| 400(Invalid user id) | User ID 格式錯誤 | 確認是 U 開頭的識別碼,不是 LINE ID 或顯示名稱 |
| 400(The user hasn't added…) | 對方沒加好友 | 請接收者先把官方帳號加為好友(或解除封鎖) |
| 429 | 超過訊息額度或頻率限制 | 檢查本月已發訊息數,評估是否升級方案 |
都通了之後,做一次端對端測試:自己到網站上送出一筆測試表單,手機的 LINE 應該幾秒內跳出通知。順手把測試資料刪掉,就可以正式上線了。
九、重點整理
- LINE Notify 已於 2025 年 3 月底停用,現行做法是「官方帳號+Messaging API」,查資料認明這個關鍵字。
- 事前準備四樣:官方帳號、啟用 Messaging API、長效 Channel Access Token、接收者 User ID;接收者必須先加官方帳號好友。
- 發送就是一個 HTTP POST 到
/v2/bot/message/push,有後端的網站加十幾行程式就完成。 - 沒有後端的靜態網站,用 Google Apps Script 當免費中繼是實務上最省的路。
- 免費額度每月 200 則、按送達人次計算,自用通知通常夠;Token 視同密碼,只放後端環境變數。