Trả lời trích dẫn trên WhatsApp: reply_token khác ID tin nhắn cha thế nào?
Để trích dẫn một tin nhắn WhatsApp qua UnifyPort, hãy sao chép nguyên vẹn data.message.reply_token của tin nhắn đó vào reply_to.reply_token trong một yêu cầu gửi riêng. Không thay bằng data.message.reply_to_message_id: trường này chỉ tin nhắn cha mà tin nhắn nhận được đang trích dẫn, không phải chính tin nhắn vừa nhận. Nếu thiếu token, đừng tự tạo từ ID hoặc âm thầm chuyển sang gửi tin nhắn thông thường.
Điểm chính
- Tách biệt ID tin nhắn hiện tại, ID tin nhắn cha và token trả lời dạng opaque.
- Lấy tài khoản và cuộc trò chuyện từ tin nhắn đã chọn, không phải tin nhắn mới nhất trong cuộc trò chuyện.
- Thao tác gửi trích dẫn trong tài liệu hiện chỉ hỗ trợ WhatsApp.
- Tin nhắn lịch sử không có token trả lời; cần quyết định rõ ràng trước khi chuyển sang tin nhắn thông thường.
Câu trả lời sẽ trích dẫn tin nhắn nào?
Xét tình huống giả định: tin nhắn A đặt câu hỏi, tin nhắn B trích dẫn A và bổ sung thông tin sửa lại, rồi nhân viên muốn trích dẫn B khi trả lời.
A ← B ← câu trả lời mới của bạn
Tài liệu webhook chuẩn phân biệt các giá trị sau:
| Trường trong B nhận được | Ý nghĩa | Cách dùng trong ứng dụng |
|---|---|---|
data.message.id | Định danh B | Lưu và chọn B trong hộp thư |
data.message.reply_to_message_id | Định danh A | Hiển thị quan hệ giữa B và tin nhắn cha |
data.message.reply_token | Giá trị opaque dùng để trích dẫn B | Truyền nguyên vẹn vào yêu cầu gửi |
data.conversation.id và type | Cuộc trò chuyện gốc | Xác định đích gửi |
account_id | Tài khoản nhắn tin đã kết nối | Giữ đúng tài khoản gửi |
Nếu chọn A trên giao diện, bạn cần token riêng đã lưu của A. ID tin nhắn cha trong B không thay thế được token đó. Nếu chưa lưu tin nhắn cha, hãy hiển thị rằng nội dung tham chiếu không có sẵn, thay vì tự suy đoán nội dung.
Đây là vấn đề khác với việc gửi tin nhắn ngay trong HTTP response của webhook. Bài so sánh webhook response và yêu cầu gửi riêng giải thích cơ chế gửi. Bài này tập trung vào tin nhắn mà phần trích dẫn gửi đi sẽ trỏ tới.
Tạo yêu cầu từ sự kiện đã chọn
Trước tiên, xác thực sự kiện đến và lưu bền vững. Bật signing_secret rồi làm theo quy định chuyển phát webhook: kiểm tra HMAC-SHA256 trên timestamp, dấu chấm và phần thân yêu cầu nguyên gốc trước khi tin cậy payload. Kiểm tra độ mới của timestamp và khử trùng lặp vẫn là hai bước riêng; xem hướng dẫn chống phát lại bằng HMAC.
JavaScript dưới đây chỉ là hàm tạo yêu cầu, không phải bộ nhận hoàn chỉnh hay vòng lặp gửi tự động. Đầu vào phải là sự kiện thời gian thực đã được kiểm tra, lưu lại và được nhân viên có quyền lựa chọn. Tên hàm và chuỗi lỗi là mã ứng dụng, không phải trường API hay mã lỗi của dịch vụ.
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 }
};
}
Gửi phần thân vừa tạo bằng POST /v1/messages, xác thực với X-Api-Key theo tài liệu API trả lời trích dẫn. Chỉ giữ khóa ở backend. Trong nhóm, conversation xác định nhóm; thay bằng data.sender.id sẽ đổi đích gửi chứ không chọn tin nhắn để trích dẫn.
Trước khi gửi, kiểm tra người thao tác có quyền truy cập tài khoản và cuộc trò chuyện đó. Lưu định danh tin nhắn đã chọn cùng tác vụ gửi nội bộ để tin nhắn mới đến không làm đổi mục tiêu. Giới hạn quyền truy cập token đã lưu, không đưa token vào log dùng chung hoặc prompt AI.
Thiếu token, token không hợp lệ hay kênh không hỗ trợ?
| Hiện tượng | Giới hạn trong tài liệu | Xử lý đề xuất |
|---|---|---|
| Tin nhắn thời gian thực không có token | WhatsApp cung cấp token khi cấu hình ký token trả lời | Kiểm tra nguồn sự kiện và cấu hình; đưa ra lựa chọn gửi thông thường rõ ràng |
Tin nhắn đến từ conversation.history | Lịch sử không có reply_token | Không tự tạo token hoặc hứa khôi phục từ lịch sử |
400 invalid_reply_token | Token bị sửa, mã hóa bằng khóa khác hoặc không đọc được | Kiểm tra giá trị đã lưu và quá trình serialization; giữ lỗi để điều tra |
501 unsupported_by_provider | Kênh đã chọn chưa triển khai gửi trích dẫn | Vô hiệu hóa đường gửi này thay vì thử lại vô hạn |
Bỏ reply_to | Yêu cầu gửi tin nhắn thông thường | Phải có quyết định chuyển phương án rõ ràng |
signing_secret của webhook xác thực việc chuyển phát. Đừng cho rằng đổi giá trị này sẽ sửa được giá trị trả lời đã mã hóa nhưng không đọc được. Tài liệu lỗi định nghĩa các lỗi, nhưng không cam kết cách sửa token hay thời hạn của token.
Kiểm thử nghiệm thu và phạm vi
Kiểm tra rằng chọn B sẽ trích dẫn B, ngay cả khi B đang trích dẫn A. Đồng thời thử trường hợp có tin nhắn mới trong lúc soạn thảo, trò chuyện nhóm, thiếu token, chỉ có tin nhắn lịch sử và sự kiện được chuyển phát lặp. Nhận lại cùng sự kiện không được tạo thêm tác vụ gửi. Đây là các bài kiểm thử đề xuất, không phải kết quả đã thực hiện.
Ghi lại kết quả gửi thực tế. data.status: accepted không phải xác nhận đã đọc, còn network timeout không chứng minh tin nhắn chưa được gửi. Đừng gửi lại một cách mù quáng hoặc tự động bỏ reply_to sau lỗi.
UnifyPort cung cấp giao diện không chính thức. Sự kiện có cùng cấu trúc không có nghĩa mọi kênh đều gửi trích dẫn được. Ví dụ, Bot API chính thức của Telegram định nghĩa reply_parameters và ReplyParameters riêng; không đưa schema đó vào yêu cầu này. Nếu cần tính năng gốc của nền tảng, hãy dùng API tương ứng. UnifyPort không có REST API đọc lịch sử tin nhắn và không bảo đảm phát lại payload bị bỏ lỡ.
Câu hỏi thường gặp
Có thể đặt reply_to_message_id vào reply_to.reply_token không?
Không. Trường đầu trỏ tới tin nhắn cha của tin nhắn đến. Trường sau phải chứa token opaque nguyên vẹn của tin nhắn bạn đã chọn.
Có ID tin nhắn lịch sử thì trích dẫn được không?
Nếu không có token tương ứng, bạn không thể dùng thao tác dựa trên token được mô tả ở đây. Payload lịch sử không cung cấp token. Chỉ gửi tin nhắn thông thường khi đó là phương án được chọn rõ ràng.
Có dùng được cho Zalo, Telegram hoặc LINE qua UnifyPort không?
Tài liệu gửi trích dẫn hiện chỉ nêu WhatsApp. Với hộp thư dùng cả WhatsApp và Zalo, không suy ra khả năng gửi từ việc dữ liệu nhận có quan hệ trích dẫn.
Bước tiếp theo và nguồn
Triển khai kiểm tra tin nhắn được chọn theo tài liệu trả lời trích dẫn trước khi bật nút trích dẫn trong hộp thư.
Đối chiếu ngày 2026-09-26:
Biến tích hợp nhắn tin thành một pipeline sản phẩm ổn định.
Bắt đầu bằng cách gửi qua một API, rồi đưa mọi tin nhắn inbound trở lại hệ thống kinh doanh bằng sự kiện chuẩn.