← Tất cả bài viết
Cẩm nang

Một Webhook cho LINE, Zalo và X: Cách Các Nhóm Đông Nam Á Xử Lý Ba Nền Tảng Cùng Lúc — UnifyPort

Một nhóm hỗ trợ khách hàng gồm ba người tại một nhà bán lẻ điện tử ở TP. Hồ Chí Minh xử lý tin nhắn từ ba nền tảng mỗi ngày. Khách mua hàng từ Thái Lan nhắn qua LINE. Khách trong nước dùng Zalo. Các đơn hàng quốc tế gửi yêu cầu qua tin nhắn trực tiếp trên X (trước đây là Twitter). Bất kỳ lúc nào, câu hỏi về đơn hàng cũng có thể đổ về cùng một lúc từ cả ba kênh.

Trong hơn một năm, nhóm này duy trì ba hệ thống tích hợp riêng biệt: ba endpoint Webhook, ba cách xác thực chữ ký khác nhau, ba bộ thông tin xác thực được luân phiên theo lịch riêng. Khi tuyển thêm một lập trình viên mới, bạn ấy mất cả tuần đầu chỉ để đọc tài liệu — chưa viết được một dòng logic nghiệp vụ nào.

Mỗi Nền Tảng Chính Thức Là Một Dự Án Riêng

Vấn đề là ba nền tảng này hoàn toàn khác nhau ở tầng API.

LINE yêu cầu bạn đăng ký kênh trong LINE Developers Console, xác minh quyền sở hữu endpoint Webhook, và ký từng phản hồi bằng Channel Access Token. Sự kiện Webhook được gửi dưới dạng mảng events, với các loại sự kiện như message, follow, unfollow có cấu trúc lồng nhau khác nhau. Từ tháng 1/2026, các kênh mới bắt buộc phải bật tính năng đơn giản hóa đồng ý kênh cho LINE MINI App.

Zalo yêu cầu tài khoản Official Account đã đăng ký và tuân thủ cập nhật Điều khoản v2 — bao gồm việc bắt buộc chuyển sang Zalo ID và thay đổi thời hạn xử lý yêu cầu xóa dữ liệu người dùng. ZNS API (Zalo Notification Services) là hệ thống riêng biệt không liên kết với Messaging API. Cấu trúc sự kiện Webhook khác hoàn toàn với LINE: sender.id nằm ở cấp cao nhất, loại sự kiện là chuỗi phẳng, và tên header chữ ký cũng khác.

Zalo là nền tảng nhắn tin chủ đạo tại Việt Nam với hơn 74 triệu người dùng — bất kỳ đội nhóm nào phục vụ khách hàng trong nước đều không thể bỏ qua Zalo. Nhưng việc tích hợp chính thức đòi hỏi cả một quy trình đăng ký và xét duyệt.

X cho đến tháng 2/2026 vẫn còn gói miễn phí cho quyền truy cập đọc cơ bản. Gói đó nay đã bị xóa sổ. Mô hình thanh toán theo dùng mới áp giá $0,005 mỗi lượt đọc bài đăng, còn quyền truy cập Direct Messages chỉ có ở gói Enterprise ($5.000/tháng). Với nhóm nhỏ chỉ muốn nhận DM để hỗ trợ đơn hàng, con số này không hợp lý.

Ba hệ thống tích hợp độc lập cũng có nghĩa là ba nguồn sự cố độc lập. Hai lần Webhook LINE bị gián đoạn vào tháng 2 và tháng 3/2026 (lỗi 400 và lỗi 5xx gây chậm trễ) là minh chứng rõ ràng.

Điều Cốt Lõi: Nhận Tin Nhắn Không Cần Thông Tin Xác Thực Gửi Đi

Phần lớn độ phức tạp nói trên đến từ phía gửi — quản lý kênh, xác thực với tư cách tài khoản chính thức, phê duyệt mẫu tin nhắn. Nhưng nếu tất cả những gì bạn cần là nhận tin nhắn từ khách hàng, định tuyến vào CRM, kích hoạt tự động hóa, hoặc đưa vào mô hình AI — bạn không cần phải là tài khoản được xác minh chính thức trên bất kỳ nền tảng nào.

Dữ liệu bạn cần (ai gửi, gửi gì, lúc nào) là như nhau bất kể cách lấy. Câu hỏi chỉ là: bạn có muốn tự quản lý việc luân phiên thông tin xác thực và chuẩn hóa schema theo từng nền tảng không, hay để lớp đó cho công cụ sẵn có xử lý?

Một Endpoint, Ba Nền Tảng

UnifyPort cung cấp giao diện kết nối đầu vào không chính thức cho LINE, Zalo và X (cùng với WhatsApp, Telegram và TikTok). Bạn chỉ cần đăng ký một URL Webhook và một khóa bí mật HMAC-SHA256 dùng chung. Tin nhắn từ cả ba nền tảng sẽ đến cùng một endpoint theo schema đã được chuẩn hóa.

Kiến trúc tổng quan:

Khách LINE  ──┐
Khách Zalo  ──┼──► UnifyPort ──► POST /webhook (máy chủ của bạn)
Khách X     ──┘                  X-UnifyPort-Signature: sha256=...

Mỗi tin nhắn đến — bất kể từ nền tảng nào — đều có cùng cấu trúc các trường cấp cao nhất:

{
  "platform": "zalo",
  "event": "message",
  "timestamp": 1748995200000,
  "from": {
    "id": "3106863660815684400",
    "display_name": "Nguyễn Văn A"
  },
  "message": {
    "id": "msg_02GY8M",
    "type": "text",
    "text": "Tôi muốn hỏi về đơn hàng của tôi"
  }
}

Thay "platform": "zalo" bằng "platform": "line" hoặc "platform": "x" — cấu trúc còn lại không đổi. Logic nghiệp vụ chỉ cần đọc platform, from.id, và message.text. Thế thôi.

Xác thực chữ ký cũng được thống nhất. Một cách triển khai, một khóa bí mật:

const crypto = require('crypto');

app.post('/webhook', express.raw({ type: '*/*' }), (req, res) => {
  const signature = req.headers['x-unifyport-signature'];
  const expected = 'sha256=' + crypto
    .createHmac('sha256', process.env.UNIFYPORT_SECRET)
    .update(req.body)
    .digest('hex');

  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
    return res.status(401).end();
  }

  const { platform, from, message } = JSON.parse(req.body);
  // Định tuyến vào CRM, ghi database, kích hoạt tự động hóa
  routeInbound({ platform, senderId: from.id, text: message.text });
  res.status(200).end();
});

Không cần xử lý riêng x-line-signature của LINE và mac header của Zalo. Một handler, ba nền tảng.

Nhóm Đó Đã Thay Đổi Điều Gì

Nhà bán lẻ ở TP. Hồ Chí Minh đó thay thế ba hệ thống tích hợp riêng biệt trong một cuối tuần. Lập trình viên mới từng mất cả tuần đọc tài liệu đã viết xong handler thống nhất trong vài tiếng. Giờ đây, việc định tuyến xảy ra tự động dựa trên trường platform trong payload: tin nhắn LINE vào hàng đợi hỗ trợ tiếng Thái, tin nhắn Zalo vào hàng đợi tiếng Việt, DM từ X vào nhóm hỗ trợ quốc tế.

Nỗi lo về hai lần gián đoạn LINE tháng 2 và tháng 3 cũng biến mất. Lớp phân phối của UnifyPort tự xử lý việc thử lại và gửi lại; Webhook của nhóm chỉ cần trả về 200 là tin nhắn được đảm bảo giao đến.

Bắt Đầu

Kết nối nền tảng đầu tiên tại unifyport.ai — không cần đăng ký Official Account, không cần chờ duyệt kênh, không tính phí theo tin nhắn. LINE, Zalo và X có sẵn trong cùng gói dịch vụ với WhatsApp, Telegram và TikTok.

Nếu bạn đang chạy một tích hợp WhatsApp và tự hỏi liệu thêm hai nền tảng nữa có mất thêm một tuần nữa không — câu trả lời là một buổi chiều, không phải một tuần.