← บทความทั้งหมด
บทช่วยสอน

ตอบกลับแบบอ้างอิงใน WhatsApp: reply_token ต่างจาก ID ข้อความต้นทางอย่างไร

หากต้องการอ้างอิงข้อความ WhatsApp ผ่าน UnifyPort ให้คัดลอก data.message.reply_token ของข้อความที่เลือกไปยัง reply_to.reply_token ในคำขอส่งแยกต่างหาก โดยไม่แก้ไขค่า อย่าใช้ data.message.reply_to_message_id แทน เพราะฟิลด์นี้ระบุข้อความต้นทางที่ข้อความขาเข้าอ้างถึง ไม่ใช่ข้อความที่เพิ่งได้รับ หากไม่มี token อย่าสร้างจาก ID เองหรือเปลี่ยนเป็นข้อความธรรมดาโดยไม่แจ้งผู้ใช้

ประเด็นสำคัญ

  • แยก ID ของข้อความปัจจุบัน, ID ของข้อความที่ถูกอ้างถึง และ token สำหรับตอบกลับออกจากกัน
  • ใช้บัญชีและบทสนทนาของข้อความที่เลือก ไม่ใช่ข้อความล่าสุดในห้องแชต
  • การส่งแบบอ้างอิงตามเอกสารปัจจุบันรองรับเฉพาะ WhatsApp อย่าอนุมานว่า LINE รองรับเหมือนกัน
  • ข้อความจากประวัติไม่มี token สำหรับตอบกลับ ต้องตัดสินใจอย่างชัดเจนว่าจะยอมส่งข้อความธรรมดาหรือไม่

คำตอบของคุณจะอ้างอิงข้อความใด

พิจารณาสถานการณ์สมมติ: ข้อความ A ตั้งคำถาม ข้อความ B อ้างอิง A และแก้ไขรายละเอียด จากนั้นเจ้าหน้าที่ต้องการตอบโดยอ้างอิง B

A ← B ← คำตอบใหม่ของคุณ

เอกสาร webhook มาตรฐาน แยกค่าต่าง ๆ ดังนี้

ฟิลด์ในข้อความ Bความหมายการใช้งานในแอป
data.message.idตัวระบุ Bบันทึกและเลือก B ในกล่องข้อความ
data.message.reply_to_message_idตัวระบุ Aแสดงความสัมพันธ์กับข้อความต้นทางของ B
data.message.reply_tokenค่าอ้างอิงแบบทึบแสงสำหรับตอบกลับ Bส่งต่อในคำขอโดยไม่แก้ไข
data.conversation.id และ typeบทสนทนาเดิมกำหนดปลายทางการส่ง
account_idบัญชีรับส่งข้อความที่เชื่อมต่อรักษาบัญชีผู้ส่งให้ถูกต้อง

หากเลือก A ในหน้าจอ คุณต้องใช้ token ที่บันทึกไว้ของ A เอง ID ของ A ที่มากับ B ไม่ใช่สิ่งทดแทน หากไม่มีข้อความต้นทางในฐานข้อมูล ให้แสดงว่าไม่สามารถดูข้อความอ้างอิงได้ อย่าสร้างเนื้อหาขึ้นเอง

เรื่องนี้ต่างจากการตัดสินใจว่าจะส่งข้อความผ่าน HTTP response ของ webhook หรือไม่ บทความ เปรียบเทียบ webhook response กับคำขอส่งแยก อธิบายเรื่องเส้นทางการส่ง ส่วนบทความนี้เน้นว่า ข้อความที่ส่งจะอ้างอิงข้อความใด

สร้างคำขอจากเหตุการณ์ที่เลือก

ตรวจสอบความถูกต้องของเหตุการณ์ขาเข้าและบันทึกอย่างถาวรก่อน ตั้งค่า signing_secret และทำตาม ข้อกำหนดการส่ง webhook โดยตรวจสอบ HMAC-SHA256 จาก timestamp ตามด้วยจุดและเนื้อหาคำขอดิบ ก่อนเชื่อถือ payload การตรวจความสดใหม่ของ timestamp และการตัดข้อมูลซ้ำยังเป็นคนละขั้นตอน ดู บทสอนป้องกัน replay ด้วย HMAC เพิ่มเติม

JavaScript ด้านล่างเป็นเพียง ฟังก์ชันสร้างคำขอ ไม่ใช่ตัวรับ webhook ที่สมบูรณ์หรือลูปส่งอัตโนมัติ อินพุตต้องเป็นเหตุการณ์แบบเรียลไทม์ที่ตรวจสอบและบันทึกแล้ว ซึ่งเจ้าหน้าที่ที่มีสิทธิ์เลือกไว้ ชื่อฟังก์ชันและข้อความ error เป็นโค้ดของแอป ไม่ใช่ฟิลด์ API หรือรหัสข้อผิดพลาดของบริการ

function buildQuotedReply(event, text) {
  const conversation = event.data?.conversation;
  const message = event.data?.message;

  if (event.type !== 'message.received' ||
      event.provider !== 'whatsapp' ||
      message?.direction !== 'inbound') {
    throw new Error('Select an inbound WhatsApp message');
  }
  if (!event.account_id || !conversation?.id || !conversation.type) {
    throw new Error('Missing destination context');
  }
  if (typeof message.reply_token !== 'string' || !message.reply_token) {
    throw new Error('Quoted reply unavailable');
  }
  if (typeof text !== 'string' || !text.trim()) {
    throw new Error('Reply text is required');
  }

  return {
    account_id: event.account_id,
    to: { id: conversation.id, type: conversation.type },
    message: { type: 'text', text },
    reply_to: { reply_token: message.reply_token }
  };
}

ส่ง body ที่ได้ด้วย POST /v1/messages และยืนยันตัวตนด้วย X-Api-Key ตาม เอกสาร API การตอบกลับแบบอ้างอิง เก็บคีย์ไว้ที่ backend เท่านั้น ในแชตกลุ่ม conversation คือตัวระบุกลุ่ม หากเปลี่ยนเป็น data.sender.id คุณกำลังเปลี่ยนปลายทาง ไม่ใช่เลือกข้อความอ้างอิง

ก่อนส่งจริง ตรวจสอบว่าผู้ดำเนินการมีสิทธิ์เข้าถึงบัญชีและบทสนทนานั้น บันทึกตัวระบุข้อความที่เลือกไว้กับงานส่งในระบบ เพื่อไม่ให้ข้อความใหม่เปลี่ยนเป้าหมาย จำกัดการเข้าถึง token ที่เก็บไว้ และอย่านำไปใส่ใน log ทั่วไปหรือ prompt ของ AI

ไม่มี token, token ไม่ถูกต้อง หรือช่องทางไม่รองรับ

สิ่งที่พบข้อจำกัดตามเอกสารแนวทางที่แนะนำ
ข้อความเรียลไทม์ไม่มี tokenWhatsApp จะมี token เมื่อกำหนดค่าการลงนาม reply tokenตรวจแหล่งเหตุการณ์และการตั้งค่า แล้วเสนอข้อความธรรมดาเป็นตัวเลือกที่ชัดเจน
ข้อความมาจาก conversation.historyประวัติไม่มี reply_tokenอย่าสร้าง token หรือรับปากว่าจะกู้ได้จากประวัติ
400 invalid_reply_tokentoken ถูกแก้ไข เข้ารหัสด้วยคีย์อื่น หรืออ่านไม่ได้ตรวจค่าที่เก็บและขั้นตอน serialization พร้อมเก็บ error เพื่อสืบค้น
501 unsupported_by_providerช่องทางที่เลือกยังไม่รองรับการส่งแบบอ้างอิงปิดเส้นทางนี้ แทนการลองซ้ำไม่สิ้นสุด
ไม่ส่ง reply_toคำขอจะส่งข้อความธรรมดาต้องตัดสินใจเปลี่ยนรูปแบบอย่างตั้งใจ

signing_secret ของ webhook ใช้ยืนยันการส่งเหตุการณ์ อย่าคิดว่าการเปลี่ยนค่านี้จะซ่อม reply handle ที่เข้ารหัสและอ่านไม่ได้ เอกสารข้อผิดพลาด อธิบายความหมายของ error แต่ไม่ได้รับรองวิธีซ่อม token หรืออายุการใช้งาน

การทดสอบและขอบเขต

ทดสอบว่าเมื่อ B อ้างอิง A การเลือก B ยังคงตอบโดยอ้างอิง B และทดสอบข้อความใหม่ระหว่างเขียนร่าง แชตกลุ่ม token ที่หายไป ข้อความที่มีเฉพาะในประวัติ และการส่งเหตุการณ์ซ้ำ การรับซ้ำไม่ควรสร้างงานส่งอีกงานหนึ่ง ทั้งหมดนี้เป็นข้อเสนอการทดสอบ ไม่ใช่ผลที่ทดสอบแล้ว

บันทึกผลการส่งจริง data.status: accepted ไม่ใช่ใบตอบรับการอ่าน และ network timeout ไม่ได้พิสูจน์ว่าข้อความยังไม่ถูกส่ง อย่าส่งซ้ำทันทีหรือลบ reply_to อัตโนมัติเมื่อเกิด error

UnifyPort ให้บริการอินเทอร์เฟซที่ไม่เป็นทางการ รูปแบบเหตุการณ์ร่วมกันไม่ได้หมายความว่าทุกช่องทางส่งแบบอ้างอิงได้ ตัวอย่างเช่น Bot API ของ Telegram มี reply_parameters และ ReplyParameters ของตัวเอง ห้ามนำ schema นั้นมาใช้กับคำขอนี้ หากต้องการความสามารถเฉพาะของแพลตฟอร์ม ให้เลือก API ของแพลตฟอร์มนั้น UnifyPort ไม่มี REST API สำหรับอ่านประวัติข้อความ และไม่รับประกันการส่ง payload ที่พลาดไปซ้ำ

คำถามที่พบบ่อย

ใช้ reply_to_message_id เป็น reply_to.reply_token ได้หรือไม่

ไม่ได้ ค่าแรกอ้างถึงข้อความต้นทางของข้อความขาเข้า ส่วนค่าหลังต้องเป็น token แบบทึบแสงของข้อความที่เลือก โดยไม่แก้ไข

มี ID ของข้อความในประวัติแล้วจะอ้างอิงได้หรือไม่

หากไม่มี token ที่ตรงกัน ก็ไม่สามารถใช้การส่งแบบ token ตามเอกสารนี้ได้ payload ประวัติไม่ให้ token ควรเสนอข้อความธรรมดาเป็นทางเลือกที่ผู้ใช้เลือกอย่างชัดเจนเท่านั้น

ใช้กับ LINE, Telegram หรือ Zalo ผ่าน UnifyPort ได้หรือไม่

เอกสารการส่งแบบอ้างอิงปัจจุบันระบุเฉพาะ WhatsApp อย่าอนุมานการรองรับขาออกจากความสัมพันธ์การอ้างอิงในข้อความขาเข้า

ขั้นตอนถัดไปและแหล่งอ้างอิง

ทำระบบตรวจสอบข้อความที่เลือกตาม เอกสารการตอบกลับแบบอ้างอิง ก่อนเปิดปุ่มอ้างอิงในกล่องข้อความ

ตรวจสอบเมื่อ 2026-09-26:

UnifyPort API

เปลี่ยนการเชื่อมต่อข้อความให้เป็น pipeline ผลิตภัณฑ์ที่เสถียร

เริ่มจากการส่งผ่าน API เดียว แล้วส่งข้อความขาเข้าทั้งหมดกลับสู่ระบบธุรกิจของคุณด้วย event มาตรฐาน