# 使用已读回执、正在输入状态和表情回应

在保留消息和表情回应语义的同时，使服务交互具备即时响应能力。

## 前提条件

一条已接收的消息、操作发送者的权限，以及一个受支持的服务交互。

## 1. 确定信号的含义

当你的团队已将对话纳入服务工作流时，将收到的消息标记为已读。WhatsApp 同时会将该对话中更早的消息也标记为已读，因此此操作确认的不仅仅是被引用的那条消息。在准备回复时使用正在输入状态，而不是将其作为永久指示器。

## 2. 使用已发布的操作

对已接收的消息使用[将消息标记为已读](/docs/api/reference/send-whatsapp-read-receipt)，`POST /v1/whatsapp/messages/{message_id}/read`。WhatsApp 会将该消息及对话中所有更早的消息标记为已读。在准备回复时设置 `typing_indicator`。`202` 确认回执已被接受处理，但不能证明客户看到了该指示器。没有回执送达 webhook 或可轮询的单独消息。

Meta 接受回执后，已接收的消息可以显示 `read_at`，同时保持其 `received` 状态。该回执不会产生计费的出站消息。有关正在输入状态的过期时间和符合条件的消息时长，请参阅已发布的已读回执操作。

## 3. 处理表情回应变更

订阅 `whatsapp.reacted` 以接收联系人发来的表情回应变更。表情回应是对被引用消息的注解，而不是另一条 `whatsapp.received` 文本消息。null emoji 可以表示移除。保留原始 emoji，不要对不同的值做归一化处理。

## 4. 将历史记录与当前状态分开

使用表情回应日志追踪变更，使用消息的 reactions 获取当前的按发送者状态。未解析的旧提供商引用可能导致没有匹配的表情回应，因此条目缺失并不能证明客户从未做过回应。

## 5. 测试交互的结束

演练添加、替换和移除表情回应、延迟处理以及中断的回复等场景。确保实际的回答或人工转接跟随在信号之后。

## 故障排除

如果消息列表中缺少某个表情回应，请改为检查表情回应事件和被引用消息日志。如果正在输入状态在你的应用状态中持续存在，请将其过期时间与已读状态分开排查。有关已发布的 webhook 结构，请参阅 [WhatsApp 事件](/docs/guides/whatsapp/events#reactions)。

## 后续步骤

- [探索相关的 WhatsApp 功能](/products/whatsapp/two-way)。
- [查找所有 WhatsApp 指南和详解答案](/products/whatsapp/resources)。
- [准备你的第一次完整交互](/products/whatsapp/getting-started)。

## Related resources

- [Connecting WhatsApp to Bird: from buying a number to a live channel](/learn/whatsapp/connecting-whatsapp-to-bird) (video)
- [What is the 24-hour customer service window on WhatsApp?](/explained/whatsapp/what-is-the-24-hour-customer-service-window) (answer)
- [WhatsApp message builder](/tools/whatsapp-message-builder) (tool)
- [WhatsApp](/products/whatsapp) (product)

[Get an implementation brief](/learn/workspace?topic=whatsapp)
