業務救星!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 強大的擴充性作為轉運站。
- User 傳送訊息: 客戶在 LINE OA 輸入文字。
- LINE Platform: LINE 伺服器將訊息打包成 JSON,透過 Webhook 丟給你的 WordPress 網站。
- WordPress (Middleware): 驗證簽章 (Signature),解析 JSON,提取 User ID 與 Text。
- 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 串接太過複雜,或者擔心資安與效能問題,不想自己踩雷,歡迎隨時找我們聊聊。
推薦閱讀
- 拒絕資料孤島!資深工程師教你將 WordPress 會員資料「無縫同步」至企業 CRM 的終極實戰
- 你的客戶在 LINE 叫陳先生,在臉書叫 David C.?終極 API 戰術,縫合破碎的用戶數據,打造無斷點客服體驗!
- 客服回訊息回到手軟?資深工程師教你用 WordPress 打造 24H 不打烊的 LINE Chatbot 智慧大腦 (Messaging API 實戰)
不想讓寶貴的客戶對話流失在 LINE 裡?想要打造自動化的 CRM 數據庫?
立即聯繫浪花科技,讓我們幫你打造最強數位大腦常見問題
如何把 LINE 官方帳號的對話紀錄自動同步到 CRM?
接收 LINE Webhook 時,如何驗證請求真的來自 LINE?
LINE 傳來的 User ID 是一串亂碼,怎麼對應到 CRM 裡的客戶?
把 LINE 對話同步進 CRM,對企業有什麼實際好處?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。