← บทความทั้งหมด
คู่มือ

หนึ่ง Webhook สำหรับ LINE, Zalo และ X: วิธีที่ทีมในเอเชียตะวันออกเฉียงใต้จัดการสามแพลตฟอร์มพร้อมกัน — UnifyPort

ทีมบริการลูกค้าสามคนของร้านค้าออนไลน์จำหน่ายอุปกรณ์อิเล็กทรอนิกส์ในโฮจิมินห์ซิตี้ต้องจัดการข้อความจากสามแพลตฟอร์มทุกวัน ผู้ซื้อชาวไทยติดต่อผ่าน LINE ลูกค้าชาวเวียดนามใช้ Zalo และคำถามจากคำสั่งซื้อต่างประเทศมาทาง Direct Message บน X (เดิมคือ Twitter) ในทุกขณะ คำถามเกี่ยวกับคำสั่งซื้ออาจหลั่งไหลมาพร้อมกันจากสามช่องทาง

ทีมนี้เคยดูแลการผสานรวมสามชุดแยกกัน: Webhook endpoint สาม endpoint, การตรวจสอบลายเซ็นสามแบบที่ต้องเขียนต่างกัน, ข้อมูลรับรองสามชุดที่หมุนเวียนในรอบต่างกัน เมื่อนักพัฒนาคนใหม่เข้าร่วมทีม เธอใช้เวลาสัปดาห์แรกทั้งหมดอ่านเอกสารโดยยังไม่ได้เขียนโค้ดธุรกิจแม้แต่บรรทัดเดียว

ทำไม LINE ถึงซับซ้อนเป็นพิเศษในไทย

LINE คือแพลตฟอร์มส่งข้อความหลักในประเทศไทย ด้วยผู้ใช้งานมากกว่า 54 ล้านคน ธุรกิจที่ให้บริการลูกค้าชาวไทยแทบหลีกเลี่ยง LINE ไม่ได้ แต่การเชื่อมต่ออย่างเป็นทางการต้องผ่านขั้นตอนหลายอย่าง

LINE กำหนดให้ลงทะเบียนช่องใน LINE Developers Console, ยืนยันการเป็นเจ้าของ Webhook endpoint และลงนามทุกการตอบสนองด้วย Channel Access Token Webhook events ส่งมาในรูปแบบ array events โดย event ประเภท message, follow และ unfollow มีโครงสร้างต่างกัน ตั้งแต่มกราคม 2026 ช่องใหม่ต้องเปิดใช้งาน Channel Consent Simplification สำหรับ LINE MINI App บังคับ

LINE มีปัญหา Webhook สองครั้งในปี 2026: ข้อผิดพลาด 400 ในเดือนกุมภาพันธ์ และข้อผิดพลาด 5xx พร้อมการส่งล่าช้าในเดือนมีนาคม ทีมที่พึ่งพา LINE เป็นหลักสัมผัสผลกระทบนี้โดยตรง

Zalo ต้องการ Official Account ที่ลงทะเบียนแล้วและปฏิบัติตามการอัปเดต Terms v2 ซึ่งรวมถึงการย้ายไปใช้ Zalo ID บังคับและการเปลี่ยนแปลงกำหนดเวลาจัดการคำขอลบข้อมูล ZNS API (Zalo Notification Services) แยกต่างหากจาก Messaging API โครงสร้าง Webhook event ต่างจาก LINE โดยสิ้นเชิง: sender.id อยู่ที่ระดับบนสุด ประเภท event เป็นสตริงแบน และชื่อ header ลายเซ็นก็ต่างออกไป

X จนถึงกุมภาพันธ์ 2026 ยังมี free tier สำหรับการอ่านขั้นพื้นฐาน ตอนนี้ tier นั้นไม่มีแล้ว โมเดลจ่ายตามการใช้งานใหม่คิด $0.005 ต่อการอ่านหนึ่งโพสต์ และการเข้าถึง Direct Messages มีเฉพาะในแพ็กเกจ Enterprise ($5,000/เดือน) สำหรับทีมเล็กที่ต้องการรับ DM เพื่อจัดการคำสั่งซื้อ ตัวเลขนี้ไม่คุ้มค่า

ข้อสังเกตสำคัญ: การรับข้อความไม่ต้องการข้อมูลรับรองการส่ง

ความซับซ้อนส่วนใหญ่ข้างต้นมาจากฝั่ง การส่ง — การจัดการช่อง, การยืนยันตัวตนในฐานะธุรกิจอย่างเป็นทางการ, การอนุมัติเทมเพลต แต่ถ้าสิ่งที่คุณต้องการเพียงแค่ รับ ข้อความจากลูกค้า, ส่งต่อไปยัง CRM, ทริกเกอร์อัตโนมัติ หรือป้อนเข้าโมเดล AI — คุณไม่จำเป็นต้องเป็นบัญชีที่ได้รับการรับรองอย่างเป็นทางการบนแพลตฟอร์มใดเลย

ข้อมูลที่คุณต้องการ (ใครส่ง, ส่งอะไร, เมื่อไหร่) เหมือนกันไม่ว่าจะได้มาทางไหน คำถามคือคุณต้องการจัดการการหมุนเวียนข้อมูลรับรองและการทำให้ schema เป็นมาตรฐานเองต่อแพลตฟอร์ม หรือปล่อยให้เลเยอร์นั้นจัดการโดยเครื่องมือที่มีอยู่แล้ว

Endpoint เดียว สามแพลตฟอร์ม

UnifyPort มอบอินเทอร์เฟซรับข้อความแบบไม่เป็นทางการสำหรับ LINE, Zalo และ X (รวมถึง WhatsApp, Telegram และ TikTok) ลงทะเบียน Webhook URL เดียวและ HMAC-SHA256 secret ที่ใช้ร่วมกัน ข้อความจากทั้งสามแพลตฟอร์มจะส่งมาที่ endpoint เดียวกันในรูปแบบ schema ที่ทำให้เป็นมาตรฐานแล้ว

ภาพรวมสถาปัตยกรรม:

ลูกค้า LINE  ──┐
ลูกค้า Zalo  ──┼──► UnifyPort ──► POST /webhook (เซิร์ฟเวอร์ของคุณ)
ลูกค้า X     ──┘                  X-UnifyPort-Signature: sha256=...

ข้อความขาเข้าทุกข้อความ — ไม่ว่าจะมาจากแพลตฟอร์มใด — มีโครงสร้าง field ระดับบนสุดเหมือนกัน:

{
  "platform": "line",
  "event": "message",
  "timestamp": 1748995200000,
  "from": {
    "id": "U4af4980629",
    "display_name": "สมชาย ก."
  },
  "message": {
    "id": "msg_01HX9K",
    "type": "text",
    "text": "สวัสดีค่ะ อยากสอบถามเรื่องสินค้า"
  }
}

แทน "platform": "line" ด้วย "platform": "zalo" หรือ "platform": "x" — โครงสร้างที่เหลือไม่เปลี่ยน โค้ดธุรกิจอ่านแค่ platform, from.id และ message.text เท่านั้น

การตรวจสอบลายเซ็นก็เป็นหนึ่งเดียวกัน — implementation เดียวครอบคลุมสามแพลตฟอร์ม:

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);
  // ส่งต่อไปยัง CRM, บันทึก database, ทริกเกอร์อัตโนมัติ
  routeInbound({ platform, senderId: from.id, text: message.text });
  res.status(200).end();
});

ไม่ต้องจัดการ x-line-signature ของ LINE และ mac header ของ Zalo แยกกัน Handler เดียว ครอบคลุมสามแพลตฟอร์ม

สิ่งที่ทีมนั้นเปลี่ยนแปลง

ร้านค้าในโฮจิมินห์ซิตี้แทนที่การผสานรวมสามชุดแยกกันภายในสุดสัปดาห์เดียว นักพัฒนาใหม่ที่เคยใช้เวลาทั้งสัปดาห์อ่านเอกสารเขียน unified handler เสร็จในไม่กี่ชั่วโมง ตอนนี้การกำหนดเส้นทางเกิดขึ้นอัตโนมัติตาม field platform ใน payload: ข้อความ LINE ไปยัง queue ภาษาไทย, ข้อความ Zalo ไปยัง queue ภาษาเวียดนาม, DM จาก X ไปยังทีมสนับสนุนต่างประเทศ

ความกังวลเรื่องปัญหา LINE ในเดือนกุมภาพันธ์และมีนาคมก็หายไป เลเยอร์การส่งของ UnifyPort จัดการการลองใหม่และการส่งซ้ำ; Webhook ของทีมแค่ต้องตอบ 200 และข้อความจะถูกส่งได้อย่างแน่นอน

เริ่มต้น

เชื่อมต่อแพลตฟอร์มแรกที่ unifyport.ai — ไม่ต้องลงทะเบียน Official Account, ไม่ต้องรอคิวอนุมัติช่อง, ไม่คิดค่าบริการต่อข้อความ LINE, Zalo และ X มีให้ในแผนเดียวกับ WhatsApp, Telegram และ TikTok

ถ้าคุณกำลังรันการผสานรวม WhatsApp อยู่แล้วและสงสัยว่าการเพิ่มอีกสองแพลตฟอร์มจะใช้เวลาอีกหนึ่งสัปดาห์หรือเปล่า — คำตอบคือบ่ายวันเดียว ไม่ใช่หนึ่งสัปดาห์