~/blog/line-oa-chat-history-sync-to-crm-guide.md
API 串接與系統整合 · 2026 / 01 / 22

業務救星!LINE OA 深度整合實戰:如何將粉絲對話紀錄自動同步至 CRM 客戶資料卡

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
業務救星!LINE OA 深度整合實戰:如何將粉絲對話紀錄自動同步至 CRM 客戶資料卡
目錄 table-of-contents.md

LINE 官方帳號最尷尬的設計,是對話紀錄被鎖在 LINE 自己的後台裡——客戶在 LINE 上說要下單,CRM 裡卻一片空白。好在 Messaging API 的 Webhook 能把每一則訊息即時推送給你的系統。這篇實戰示範怎麼把粉絲對話自動同步到 CRM 客戶資料卡,讓業務不用再手動截圖貼上。

這真的是個痛點。業務人員每天拿著手機狂回訊息,手指都要抽筋了,你還要他回到辦公室,把剛剛跟客戶「博感情」的幾百句對話,手動複製貼上到 CRM 系統?別鬧了,這不科學,更沒人性。結果就是資料斷層,客戶換個業務對接,因為不知道之前的對話脈絡,直接被打回原形。

今天這篇文章,就是要來解決這個「資料孤島」的問題。我們要進行一場 LINE OA 深度整合實戰:如何將粉絲對話紀錄自動同步至 CRM 客戶資料卡。不論你用的是 HubSpot、Salesforce,還是自建的 CRM,底層邏輯都是通的。我們會用到 WordPress 當作 Middleware(中介軟體),透過 Webhook 攔截 LINE 的訊息,再打 API 進 CRM。準備好了嗎?打開你的 IDE,我們要開始了。

為什麼你需要「對話同步」而不是單純的「發送訊息」?

很多工程師剛接觸 LINE Messaging API,只會寫 Push Message(主動推播)或 Reply Message(被動回覆)。但對於企業來說,「紀錄(Logging)」 的價值往往大於「發送」。

  • 全通路視角(Omnichannel): 客服在看 CRM 時,能同時看到該客戶的 Email 往來紀錄與 LINE 閒聊紀錄。
  • 責任歸屬與交接: 業務離職,手機帶走,但 LINE OA 的對話紀錄已經同步在公司 CRM,客戶資產不流失。
  • AI 分析的基石: 未來若想導入 LLM 分析客戶情緒或購買意圖,這些同步下來的結構化文字就是黃金數據。

技術架構圖:WordPress 如何扮演黏著劑?

我們不直接寫死在 CRM 裡(很多 SaaS CRM 也不支援直接接收 LINE Webhook),而是利用 WordPress 強大的擴充性作為轉運站。

  1. User 傳送訊息: 客戶在 LINE OA 輸入文字。
  2. LINE Platform: LINE 伺服器將訊息打包成 JSON,透過 Webhook 丟給你的 WordPress 網站。
  3. WordPress (Middleware): 驗證簽章 (Signature),解析 JSON,提取 User ID 與 Text。
  4. CRM API: WordPress 呼叫 CRM API,根據 Line User ID 找到對應 Contact,將訊息寫入 Note 或 Activity Timeline。

實戰步驟一:設定 LINE Developers Console

首先,你得先有一個 LINE Official Account,並登入 LINE Developers Console

在你的 Channel 設定中,重點抓兩個東西:

  • Channel Access Token (Long-lived): 用來回話或抓取用戶 Profile。
  • Channel Secret: 這很重要,Eric 強調過一百次,資安就是靠這個。我們需要用它來驗證 Webhook 來源真的是 LINE,而不是哪個無聊駭客偽造的請求。

接著,在 Webhook settings 中,填入你 WordPress 的接收網址,例如:https://your-site.com/wp-json/roamer/v1/line-webhook,並記得開啟「Use webhook」。

實戰步驟二:WordPress 接收端程式碼開發

這裡我們使用 WordPress 的 REST API 來建立接收端點。這段程式碼可以放在主題的 functions.php 或是你自己寫的小外掛裡。

稍微囉嗦一下,驗證簽章(Verification Signature)絕對不能省。我看過太多新手為了省事跳過這步,結果介面被塞滿垃圾廣告機器人的請求。


add_action('rest_api_init', function () {
    register_rest_route('roamer/v1', '/line-webhook', array(
        'methods' => 'POST',
        'callback' => 'handle_line_webhook',
        'permission_callback' => '__return_true', // 權限驗證由簽章處理
    ));
});

function handle_line_webhook($request) {
    $channel_secret = '你的_CHANNEL_SECRET'; // 建議存在 wp-config.php 或 options 表中
    $http_header = $request->get_headers();
    $signature = isset($http_header['x_line_signature'][0]) ? $http_header['x_line_signature'][0] : '';
    
    $body = $request->get_body();

    // 1. 資安驗證:確認請求來自 LINE
    if (base64_encode(hash_hmac('sha256', $body, $channel_secret, true)) !== $signature) {
        return new WP_Error('invalid_signature', 'Invalid Signature', array('status' => 403));
    }

    $events = json_decode($body, true)['events'];

    foreach ($events as $event) {
        // 我們只處理文字訊息
        if ($event['type'] === 'message' && $event['message']['type'] === 'text') {
            $line_user_id = $event['source']['userId'];
            $message_text = $event['message']['text'];
            $timestamp = $event['timestamp'];
            
            // 這裡呼叫同步函式
            sync_to_crm($line_user_id, $message_text, $timestamp);
        }
    }

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

實戰步驟三:同步至 CRM (以 HubSpot / 通用 API 為例)

這一步是「LINE OA 深度整合實戰」的核心。每個 CRM 的 API 不同,但邏輯是一樣的:「先查詢 (Lookup),後寫入 (Log)」

因為 LINE 傳過來的是 U12345678... 這種亂碼般的 User ID,CRM 裡存的可能是 Email 或電話。所以你需要一個「對照表」。通常我會在 CRM 的聯絡人欄位中,多開一個自訂欄位叫 line_user_id


function sync_to_crm($line_user_id, $text, $timestamp) {
    // 1. 查詢 CRM 中是否有這個 LINE User ID
    // 假設我們封裝好了一個 CRM 類別
    $crm_contact = RoamerCRM::find_contact_by_property('line_user_id', $line_user_id);

    if (!$crm_contact) {
        // 情況 A:找不到人。可能需要先呼叫 LINE Profile API 拿到暱稱,建立新潛在客戶
        $profile = get_line_user_profile($line_user_id);
        $crm_contact_id = RoamerCRM::create_contact([
            'lastname' => $profile['displayName'],
            'line_user_id' => $line_user_id,
            'lifecyclestage' => 'lead'
        ]);
    } else {
        $crm_contact_id = $crm_contact['id'];
    }

    // 2. 將對話紀錄寫入 CRM 的 Note 或 Activity
    // 將 Unix timestamp 轉為可讀時間
    $date = date('Y-m-d H:i:s', $timestamp / 1000);
    
    $note_content = "[LINE 對話紀錄] {$date} \n客戶說:{$text}";
    
    RoamerCRM::add_note_to_contact($crm_contact_id, $note_content);
}

// 輔助函式:取得 LINE 使用者暱稱
function get_line_user_profile($user_id) {
    $access_token = '你的_CHANNEL_ACCESS_TOKEN';
    $url = "https://api.line.me/v2/bot/profile/{$user_id}";
    
    $response = wp_remote_get($url, [
        'headers' => [
            'Authorization' => 'Bearer ' . $access_token
        ]
    ]);
    
    if (is_wp_error($response)) return ['displayName' => 'Unknown Line User'];
    
    return json_decode(wp_remote_retrieve_body($response), true);
}

Eric 的工程師碎碎念:關於 API Rate Limit

要注意喔,雖然同步很爽,但不要把你的 CRM API 打爆了。如果你的 LINE OA 正在辦抽獎活動,一秒鐘進來幾千則訊息,直接同步絕對會觸發 CRM 的 Rate Limit (頻率限制),導致被鎖 IP。

這時候,請務必引入 Queue (佇列) 機制。不管是使用 Laravel 的 Queue 還是 WordPress 的 Action Scheduler,先把訊息存起來,再慢慢「餵」給 CRM,這才是成熟工程師的作法。

深度整合的進階應用:雙向綁定

除了把對話存進去,更進階的玩法是「身份識別綁定」。你可以在 Rich Menu (圖文選單) 做一個「會員綁定」按鈕,引導使用者登入 WordPress 網站。一旦登入成功,就把他的 WordPress User ID、Email 和 LINE User ID 綁在一起。

這樣一來,不管他在官網下單,還是在 LINE 上罵人,你都能在 CRM 裡看到完整的 Customer Journey(客戶旅程)。這才叫真正的「全通路」。

總結:資料有流動,才有價值

透過這次的「LINE OA 深度整合實戰」,我們不僅僅是寫了幾行程式碼,而是幫企業打通了任督二脈。將粉絲對話紀錄自動同步至 CRM 客戶資料卡,能讓業務團隊省下大量行政時間,專注在「成交」上。

記住,技術只是手段,解決商業問題才是工程師的價值所在。如果你覺得這些 API 串接太過複雜,或者擔心資安與效能問題,不想自己踩雷,歡迎隨時找我們聊聊。

推薦閱讀

不想讓寶貴的客戶對話流失在 LINE 裡?想要打造自動化的 CRM 數據庫?

立即聯繫浪花科技,讓我們幫你打造最強數位大腦
// FAQ

常見問題

如何把 LINE 官方帳號的對話紀錄自動同步到 CRM?
可用 WordPress 作為中介軟體:在 LINE Developers Console 設定 Webhook 指向 WordPress 的 REST API 端點,當客戶傳訊息時 LINE 會把事件以 JSON 推送過來,WordPress 驗證簽章後解析出 User ID 與訊息文字,再呼叫 CRM API,依 LINE User ID 找到對應聯絡人並寫入備註或活動時間軸。
接收 LINE Webhook 時,如何驗證請求真的來自 LINE?
用 Channel Secret 對請求 body 以 HMAC-SHA256 雜湊後做 base64 編碼,再與 Header 中的 X-Line-Signature 比對,相符才處理。這一步可阻擋偽造請求與垃圾廣告機器人,不能省略。
LINE 傳來的 User ID 是一串亂碼,怎麼對應到 CRM 裡的客戶?
LINE 提供的是 U 開頭的 User ID,與 CRM 慣用的 Email 或電話不同。建議在 CRM 聯絡人新增一個自訂欄位儲存 line_user_id 作為對照鍵,同步時先用此欄位查詢聯絡人是否存在,找不到再呼叫 LINE Profile API 取得暱稱建立新潛在客戶。
把 LINE 對話同步進 CRM,對企業有什麼實際好處?
客服能在 CRM 中同時看到客戶的 Email 與 LINE 往來紀錄,達成全通路視角;業務離職時對話紀錄已留存在公司 CRM,客戶資產不流失;累積的結構化文字也能作為日後導入 AI 分析客戶情緒與購買意圖的基礎數據。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?