告別罐頭外掛!資深工程師帶你手刻 WordPress LINE Chatbot:從 Webhook 架構到安全驗證的終極指南

2025/11/29 | API 串接與自動化, WP 開發技巧, 技術教學資源

告別罐頭外掛!資深工程師帶你手刻 WordPress LINE Chatbot:從 Webhook 架構到安全驗證的終極指南

嘿,我是浪花科技的 Eric。身為一個整天跟程式碼打交道的工程師,我最常被問到的問題之一就是:「Eric,我的 LINE 官方帳號訊息回不完,有沒有辦法讓網站自動回覆啊?」每次聽到這個,我心裡都會 OS:「當然有!而且不要再只會裝外掛了!」

很多行銷人員或小編,每天都深陷在回覆 LINE 訊息的無盡輪迴中,從常見問題、活動查詢到訂單狀態,同樣的問題回答了八百遍。雖然市面上有不少 Chatbot 服務或 WordPress 外掛,但你是不是也遇過這些窘境:功能綁手綁腳、想客製化一點功能就要加錢,更重要的是,你的寶貴客戶資料和對話紀錄,都放在別人的伺服器上,想做進一步的數據分析或 CRM 整合,簡直難如登天。

今天,我就要帶你打破這個僵局。我們不裝任何來路不明的外掛,直接用 WordPress 的核心能耐,親手打造一個完全屬於你、安全又可無限擴展的 LINE Messaging API Chatbot。這不只是一篇教學,更是一場關於架構思維與程式實踐的深度對談。準備好了嗎?泡杯咖啡,讓我們開始吧!

打造 LINE Chatbot 的三大核心:Webhook、Channel Access Token 與 WordPress 端點

在我們動手寫任何一行程式碼之前,最重要的,是先搞懂整個運作的邏輯。想像一下,LINE Chatbot 就像一個超級有效率的數位總機。當使用者傳訊息給你的官方帳號時,LINE 會立刻「打一通電話」到你的 WordPress 網站,告訴你「欸,有人傳了這個訊息喔!」,然後你的網站再決定要「回什麼話」。這個過程,就包含了三個關鍵角色。

什麼是 Webhook?LINE 與你的網站如何「對話」?

Webhook 這個詞聽起來很技術,但概念其實超簡單。傳統的 API 是你(你的網站)主動去問別人(例如 LINE):「有沒有新訊息?」;而 Webhook 則是反過來,由 LINE 在「事件發生時」(例如收到新訊息)主動通知你。就像外送 App 在餐點送達時會推播通知給你,而不是要你每分鐘都去刷新 App 一樣。

在我們的場景中,你需要在 LINE Developers 後台設定一個 Webhook URL,這個 URL 就是你 WordPress 網站上的一個特定「接收點」。當使用者傳訊息時,LINE 就會把訊息內容(誰傳的、傳了什麼、什麼時候傳的…)打包成一個 JSON 格式的資料,用 HTTP POST 的請求方式,送到你指定的 Webhook URL。這就是它們「對話」的方式。想了解更多關於 Webhook 的設計與安全細節,可以參考我們的另一篇文章:你的 WordPress 正在大開後門嗎?資深工程師的 Webhook 設計與安全驗證終極指南

取得你的數位鑰匙:Channel Access Token

如果 Webhook 是溝通的地址,那 Channel Access Token 就是一把獨一無二的「數位鑰匙」。當你的 WordPress 網站收到訊息並準備好回覆時,你不能隨便就回覆。你需要向 LINE 的伺服器證明「嘿,我就是這個官方帳號的合法擁有人」。

這把鑰匙(一個長長的字串)就是你在 LINE Developers Console 建立你的 Messaging API Channel 時會取得的。所有從你網站發送到 LINE API 的請求,都必須在 HTTP Header 中夾帶這把鑰匙,LINE 才會認得你,並把你的回覆訊息傳送給使用者。

WordPress 的「秘密通道」:建立自訂 API 端點

好了,我們有了地址 (Webhook URL),那這個地址在 WordPress 裡要通到哪裡去?有些古早的教學可能會教你用 `admin-ajax.php`,但相信我,那是一個效能不彰且不優雅的做法。身為一個追求卓越的工程師,我們要走更現代、更專業的路:使用 WordPress REST API 來建立一個自訂端點 (Custom Endpoint)。

透過 `register_rest_route()` 這個函式,我們可以建立一個乾淨、獨立、專門用來接收 LINE Webhook 的 URL,例如 `https://yourdomain.com/wp-json/my-linebot/v1/webhook`。這樣做有幾個好處:

  • 效能更佳:它不會像 `admin-ajax.php` 那樣載入整個 WordPress 後台環境,只載入處理 API 所需的核心功能。
  • 結構清晰:你的 Chatbot 邏輯可以集中管理,不會跟其他 WordPress 功能混在一起。
  • 標準化:遵循 RESTful 原則,未來要擴展或給其他服務串接都更容易。如果你對建立自訂端點還不熟悉,強烈建議先閱讀這篇WordPress REST API 自訂端點實戰,會讓你的基礎更穩固。

WordPress LINE Chatbot 建置實戰:從接收到回應的完整程式碼解析

理論講完了,該來點硬派的了!接下來,我會把完整的程式碼提供給你,並一步步拆解。你可以將這些程式碼放在你的佈景主題的 `functions.php` 檔案中,或者更理想的作法是,把它們打包成一個專屬的小外掛。

步驟一:在 WordPress 註冊你的 Webhook 端點

首先,我們要用 `add_action` 鉤住 `rest_api_init` 這個動作,來註冊我們的 API 端點。

<?php
add_action( 'rest_api_init', function () {
  register_rest_route( 'my-linebot/v1', '/webhook', array(
    'methods'  => 'POST',
    'callback' => 'roamer_line_webhook_callback',
    'permission_callback' => '__return_true' // 暫時開放,稍後會用簽章驗證取代
  ) );
} );
?>

工程師囉嗦時間:看到 `’permission_callback’ => ‘__return_true’` 了嗎?這代表任何人都可以存取這個端點。在開發階段這樣很方便,但絕對不要在正式環境這樣用!這等於大門敞開,任何人都可以偽造請求來癱瘓你的網站。別擔心,下一步我們就會把它鎖起來。

步驟二:驗證 LINE 的請求簽章 (Signature Validation) – 安全第一!

這是整個流程中最關鍵、也最常被忽略的一步。LINE 在發送 Webhook 請求時,會在 HTTP Header 中夾帶一個 `X-Line-Signature` 的值。這個值是 LINE 用你的 Channel Secret(另一把私鑰)對請求的內容 (Request Body) 進行 HMAC-SHA256 加密後得到的簽章。我們的任務,就是在收到請求時,用同樣的方式自己算一次簽章,然後比對看看兩個簽章是否一致。如果不一致,就代表這個請求是偽造的,直接拒絕處理!

現在,我們來修改 callback 函式,加入驗證邏輯。

<?php
function roamer_line_webhook_callback( WP_REST_Request $request ) {
    $channel_secret = 'YOUR_CHANNEL_SECRET'; // 請換成你的 Channel Secret
    $http_request_body = $request->get_body();
    $hash = hash_hmac('sha256', $http_request_body, $channel_secret, true);
    $signature = base64_encode($hash);

    // 從 header 中取得 LINE 送來的簽章
    $line_signature = $request->get_header('X-Line-Signature');

    if ( $signature !== $line_signature ) {
        // 簽章不符,回傳 400 錯誤,並停止執行
        return new WP_Error( 'invalid_signature', 'Invalid signature', array( 'status' => 400 ) );
    }

    // 簽章驗證通過,繼續處理訊息
    // ... 接下來的程式碼會放在這裡 ...

    return new WP_REST_Response( 'OK', 200 );
}
?>

記住,安全永遠是第一位!沒有驗證簽章的 Webhook,就像沒上鎖的家,隨時等著不速之客光臨。

步驟三:解析訊息並建構回應邏輯

驗證通過後,我們就可以安心地處理 LINE 傳來的訊息了。訊息本體是一個 JSON 字串,我們需要先解碼成 PHP 的物件或陣列。

<?php
// ... 接續在簽章驗證通過後 ...
$events = json_decode( $http_request_body, true )['events'];

foreach ( $events as $event ) {
    if ( $event['type'] == 'message' && $event['message']['type'] == 'text' ) {
        $reply_token = $event['replyToken'];
        $user_message = $event['message']['text'];

        // 根據使用者訊息決定回覆內容
        switch ( strtolower( $user_message ) ) {
            case '你好':
                $reply_message = '哈囉!感謝您的訊息。';
                break;
            case '營業時間':
                $reply_message = '我們的營業時間是週一至週五 09:00 - 18:00。';
                break;
            default:
                $reply_message = '抱歉,我不太懂您的意思。您可以試著輸入「你好」或「營業時間」。';
                break;
        }

        // 呼叫我們的回覆函式
        roamer_reply_to_line( $reply_token, $reply_message );
    }
}
// ...
?>

這段程式碼會遍歷所有事件(一次 Webhook 可能包含多個事件),判斷是否為文字訊息。然後用一個簡單的 `switch` 語句來實現關鍵字回覆。當然,你可以擴充這個邏輯,例如串接資料庫、查詢文章等等。

步驟四:將回應訊息「推」回給 LINE

最後一步,就是將我們準備好的回覆,透過 LINE Messaging API 送還給使用者。這裡我們使用 WordPress 內建的 `wp_remote_post()` 函式來發送 HTTP 請求。

<?php
function roamer_reply_to_line( $reply_token, $message_text ) {
    $channel_access_token = 'YOUR_CHANNEL_ACCESS_TOKEN'; // 請換成你的 Channel Access Token
    $url = 'https://api.line.me/v2/bot/message/reply';

    $headers = array(
        'Content-Type'  => 'application/json',
        'Authorization' => 'Bearer ' . $channel_access_token,
    );

    $body = array(
        'replyToken' => $reply_token,
        'messages'   => array(
            array(
                'type' => 'text',
                'text' => $message_text,
            ),
        ),
    );

    $args = array(
        'body'    => json_encode( $body ),
        'headers' => $headers,
        'timeout' => 60, // 增加超時時間
    );

    $response = wp_remote_post( $url, $args );

    // 可以在這裡加入日誌紀錄,檢查 LINE API 的回應
    if ( is_wp_error( $response ) ) {
        error_log( 'LINE Reply Error: ' . $response->get_error_message() );
    }
}
?>

搞定!把上面這幾段程式碼組合起來,你就擁有一個功能完整、安全可靠的 WordPress LINE Chatbot 基礎架構了!

不只是鸚鵡學舌!讓你的 Chatbot 更聰明的進階技巧

一個只會關鍵字回覆的機器人還不夠酷。既然我們的 Chatbot 活在 WordPress 裡,就應該發揮 WordPress 的最大潛力!

  • 串接 WordPress 內部資料:你可以利用 `WP_Query` 讓 Chatbot 變成一個智慧小助理。例如,使用者輸入「最新文章」,你的 Chatbot 就可以撈出最新的三篇文章標題和連結回覆給他。
  • 使用者狀態追蹤:透過 `update_user_meta` 或自訂資料表,你可以記錄與特定 LINE User ID 的對話狀態。例如,實現多步驟的問答流程(先問姓名、再問信箱…)。
  • 錯誤處理與日誌紀錄:當 API 串接出錯時,最怕的就是死得不明不白。務必使用 `error_log()` 將重要的執行步驟、收到的資料、API 回應等記錄下來,這會是你未來除錯時的救命仙丹。
  • 整合 WooCommerce:你可以讓使用者透過 LINE 查詢訂單狀態、商品庫存,甚至觸發訂單成立的通知。這可以大幅提升你的電商營運效率,想了解更多自動化整合,可以參考這篇關於企業級自動化的文章

手刻一個 LINE Chatbot 看似複雜,但當你掌握了 Webhook 的核心概念、學會了如何用 REST API 建立安全端點,你會發現你解鎖的不只是一個聊天機器人,而是將 WordPress 從一個內容管理系統,轉變為一個強大的企業級自動化中樞的能力。這條路雖然比安裝外掛來得崎嶇,但沿途的風景和最終的成就感,絕對值得!

相關閱讀

如果你在實作過程中遇到任何問題,或是希望打造更複雜、更客製化的自動化流程,卻不知從何下手?浪花科技的團隊擁有豐富的 WordPress API 串接與自動化開發經驗。我們不只寫程式,我們更專注於為你打造穩定、安全、能真正解決商業痛點的系統。

歡迎點擊這裡,填寫表單與我們聊聊你的需求! 讓我們一起把你的 WordPress 網站變成最強大的商業武器。

常見問題 (FAQ)

Q1: 為什麼我一定要驗證 LINE 的請求簽章 (Signature)?不驗證會怎樣?

A1: 這是一個至關重要的安全步驟!如果你不驗證簽章,任何人只要知道你的 Webhook URL,就可以偽造 LINE 的請求格式,不斷地發送垃圾訊息到你的端點。輕則消耗你的伺服器資源,重則可能觸發你意想不到的程式邏輯,造成資料錯誤或安全漏洞。驗證簽章確保了只有 LINE 官方伺服器才能與你的 Chatbot 溝通,是保護你網站的第一道防線。

Q2: 我真的可以完全不用外掛,只靠這篇文章的程式碼就建立一個 LINE Chatbot 嗎?

A2: 是的,完全可以!本文提供的程式碼片段,已經構成了一個最核心、功能完整的 Chatbot 基礎。它使用了 WordPress 內建的 REST API 和 HTTP API 函式 (`register_rest_route`, `wp_remote_post`),不需要依賴任何第三方外掛。這最大的好處是你的系統會非常輕量、乾淨,並且擁有 100% 的客製化彈性,未來要擴充任何功能都不會被外掛限制。

Q3: 使用 WordPress REST API 建立端點,跟傳統用 admin-ajax.php 的方法比起來,到底好在哪裡?

A3: 主要有三大優勢:1. 效能:REST API 的端點在處理請求時,不會載入整個 WordPress 後台的管理介面和相關腳本,只會載入必要的核心功能,因此回應速度更快、資源消耗更少。2. 標準化:REST API 是現代網頁應用的標準作法,URL 結構更語意化、更清晰,也更容易管理和除錯。3. 擴展性:基於 RESTful 架構,未來你的 Chatbot 要提供更多功能(例如 GET 查詢、PUT 更新),或是要給手機 App 等其他應用程式使用,都非常容易擴展。

 
立即諮詢,索取免費1年網站保固