← 所有文章
指南

LINE replyToken 过期怎么办?避免慢回复造成重复发送

LINE Messaging API 的 replyToken 只能使用一次,必须在收到 webhook 后一分钟内使用;超过一分钟不保证可用。如果 AI 生成或排队拖慢了回复,不要反复提交同一个令牌,也不要在请求超时后立即自动改发 push。应先分清“尚未使用令牌”和“回复已经发出但结果未知”,再决定下一次发送。

要点

  • 回复令牌是短暂的回复机会,不是收件人 ID,也不是可重复使用的凭据。
  • webhook 重投不会创造第二次独立回复机会。
  • 请求超时表示结果未知,不代表消息没有发送。
  • push 是独立操作,有自己的收件人条件与消息计数规则,不是令牌续期。

LINE 对回复令牌的实际约定

Messaging API reference 定义了 POST /v2/bot/message/reply,请求使用事件中的 replyToken 和 messages 数组。令牌只能用一次,且应尽快使用。LINE 也提醒有效时间可能变化,因此不要让任务刻意等到最后一秒才发送。

这意味着立即回复“正在查询”也会消耗令牌,后续正式答案不能继续用它。官方发送指南 允许一次回复请求包含最多五个消息对象,但这不等于同一令牌可以分五次调用。

值用途不能替代什么
Channel access token对渠道 API 请求进行身份验证新的回复令牌
replyToken回复触发该事件的用户操作长期用户地址
收件人标识定位符合条件的 push 目标重新使用回复操作的权限

如果你处理的是 LINE MINI App 通知,请先看服务消息与 Messaging API 对比。服务通知令牌属于另一套 API,不适用本文的回复流程。

先定位失败原因,再决定补发

下表是建议的应用检查项,不是新增的 LINE 错误码。

证据应检查的边界安全的下一步
收到 webhook 很久后 worker 才启动队列积压或生成缓慢不依赖旧令牌,单独评估延迟发送
另一个 worker 已取得成功回复响应单次令牌已消耗停止重复任务
请求发出后 HTTP 超时是否受理未知保留未知状态,不立即 push 相同答案
相同 webhook 再次到达重复接收查询原事件的处理及发送状态
新收到的事件也发送失败请求结构、渠道凭据、令牌选取或其他 API 错误检查实际响应,不把所有失败都归因于过期

记录 webhook 接收时间、worker 启动时间、请求发出时间、HTTP 状态,以及此前是否成功。不要把令牌或授权请求头写入普通日志;仅按短期操作需要保留受保护的令牌数据。

单次错误不能告诉你另一个 worker 是否已经回复。更换 channel access token,也不能让已经消耗的 reply token 重新可用。

webhook 重投不是令牌刷新服务

LINE 的接收消息指南 说明,重投保留 webhook 事件 ID 和回复令牌,仅 deliveryContext.isRedelivery 改变。应用可以用渠道身份与 webhookEventId 组成去重键。

参考文档允许在收到重投 webhook 后一分钟内使用其中的令牌,但有例外:令牌已经使用,或距事件发生已过二十分钟时,不能使用。这是恢复场景的有限机会,不是可预约的回复窗口,更不是故意拒绝 webhook 的理由。

先持久化事件,再独立确认接收;慢任务放在后续处理。重复 webhook 应查找已有任务,而不是重新启动 AI 生成并再次发送。发送状态也必须持久化:只对接收事件去重,无法保护 worker 崩溃后重新执行的发送任务。

在启动慢任务前选好回复路径

能够快速完成的答案,由一个 worker 负责并尽快回复。可能超过回复时限的任务,则提前决定:先简短确认收到,再另发结果;还是只在完成后发送结果。

建议采用以下应用流程:

  1. 只认领一次事件。 将渠道与 webhookEventId 绑定到一个业务操作,通过唯一记录或事务认领避免两个 worker 各自发送。
  2. 保存发送决策。 区分即时 reply 与后续 push。确认收到的消息是一次完整回复,不是占住令牌等待后续使用。
  3. 如实记录结果。 本地状态区分未尝试、已受理、被拒绝和结果未知。这些是应用标签,不是 LINE 响应字段。请求发出后进程崩溃,也可能留下未知结果。
  4. 检查延迟发送条件。 再次确认答案是否仍有意义、是否已有人员回复,以及收件人是否符合 LINE 当前 push 条件。此前结果未知时,必须显式决定是否继续。
  5. 把 push 保存为新操作。 一旦选择 push,应使用独立请求和保护措施;它不会改变之前 reply 的结果。

LINE 计费说明 明确区分消息计数:reply 不计入订阅套餐消息数,push 则计入。应核对适用套餐,不能默认补发与原回复具有相同计数方式。

支持的 push 重试请参照 X-Line-Retry-Key 指南。官方重试文档 列出的支持方法是 push、multicast、narrowcast 和 broadcast,不包括 reply。给 reply 加上该请求头,既不能延长令牌有效期,也不能把后续 push 与之前 reply 合并去重。

不要混用 UnifyPort 的回复契约

UnifyPort 的非官方接口连接消息账号,是独立接入路径,不负责修复 LINE 官方账号的回复令牌。文本发送文档 使用 POST /v1/messages,请求包含 account_id、to 和 message。渠道支持矩阵 列出 LINE 文本发送能力,但基于令牌的引用回复操作目前仅支持 WhatsApp。

不要将 LINE 的 replyToken 填入 UnifyPort 的 reply_to.reply_token。名字相似不代表凭据可互换。对已存储的标准化事件发送普通回复,应使用文档规定的账号及会话标识,并检查实际发送结果;这不意味着跨 API 去重或令牌恢复。

如果发送方必须是 LINE 官方账号,就继续使用官方 Messaging API。更换接入身份不能成为官方发送结果未知时的自动补救措施。

常见问题

LINE 回复令牌过期后能刷新吗?

不要把它当作可刷新的 access token。新的符合条件事件会提供回复机会,重投则受上述有限规则约束。两者都不允许同一业务答案无限重试。

可以先确认收到,再用相同令牌发送最终答案吗?

不可以。首次被受理的回复会消耗单次令牌。后续答案需独立规划,并核对 push 收件人资格与消息计数。

所有 reply 超时都应该改发 push 吗?

不应该。reply 可能已被受理,自动 push 会造成重复。应保留结果未知状态,并制定明确的后备发送策略。

下一步与参考资料

用 LINE Messaging API reference 检查一个慢回复流程,通过本地模拟测试重复投递、两个 worker 竞争、确认收到后的延迟答案,以及 HTTP 响应丢失。这些是建议测试,不是已经取得的生产结果。若选择独立的消息账号接入路径,请从 UnifyPort 文本发送契约 开始。

官方资料核对日期:2026-10-04。

UnifyPort API

让消息接入变成一条稳定的产品管线。

先用统一 API 跑通发送,再用标准事件把所有入站消息接回业务系统。