ตอบกลับแบบอ้างอิงใน 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 ไม่ถูกต้อง หรือช่องทางไม่รองรับ
| สิ่งที่พบ | ข้อจำกัดตามเอกสาร | แนวทางที่แนะนำ |
|---|---|---|
| ข้อความเรียลไทม์ไม่มี token | WhatsApp จะมี token เมื่อกำหนดค่าการลงนาม reply token | ตรวจแหล่งเหตุการณ์และการตั้งค่า แล้วเสนอข้อความธรรมดาเป็นตัวเลือกที่ชัดเจน |
ข้อความมาจาก conversation.history | ประวัติไม่มี reply_token | อย่าสร้าง token หรือรับปากว่าจะกู้ได้จากประวัติ |
400 invalid_reply_token | token ถูกแก้ไข เข้ารหัสด้วยคีย์อื่น หรืออ่านไม่ได้ | ตรวจค่าที่เก็บและขั้นตอน 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:
เปลี่ยนการเชื่อมต่อข้อความให้เป็น pipeline ผลิตภัณฑ์ที่เสถียร
เริ่มจากการส่งผ่าน API เดียว แล้วส่งข้อความขาเข้าทั้งหมดกลับสู่ระบบธุรกิจของคุณด้วย event มาตรฐาน