← Tất cả bài viết
Hướng dẫn

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ĩaCách dùng trong ứng dụng
data.message.idĐịnh danh BLưu và chọn B trong hộp thư
data.message.reply_to_message_idĐịnh danh AHiển thị quan hệ giữa B và tin nhắn cha
data.message.reply_tokenGiá trị opaque dùng để trích dẫn BTruyền nguyên vẹn vào yêu cầu gửi
data.conversation.id và typeCuộc trò chuyện gốcXác định đích gửi
account_idTài khoản nhắn tin đã kết nốiGiữ đú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ượngGiới hạn trong tài liệuXử lý đề xuất
Tin nhắn thời gian thực không có tokenWhatsApp cung cấp token khi cấu hình ký token trả lờiKiể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.historyLịch sử không có reply_tokenKhông tự tạo token hoặc hứa khôi phục từ lịch sử
400 invalid_reply_tokenToken bị sửa, mã hóa bằng khóa khác hoặc không đọc đượcKiểm tra giá trị đã lưu và quá trình serialization; giữ lỗi để điều tra
501 unsupported_by_providerKênh đã chọn chưa triển khai gửi trích dẫnVô hiệu hóa đường gửi này thay vì thử lại vô hạn
Bỏ reply_toYêu cầu gửi tin nhắn thông thườngPhả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:

UnifyPort API

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.