客户群里员工把发错的价格撤了。业务系统日志仍写发送成功,工单仍引用那句报价。对账时两边都觉得对方在撒谎。机器人侧如果把「投递回执」当成「当前会话真相」,撤回之后所有下游都会错。撤回改的是会话可见性,不是把当时那次 HTTP 变成失败。

补偿动作和发送失败不是一类工单。失败是没出去。撤回是出去过、后来被拿掉。

回执只说明当时提交过

发送成功表示通道在那一时刻接受了一次投递。之后客户端可以撤回。回执表不应被 UPDATE 成失败,否则补发逻辑会把已达消息再打一遍。正确做法是另记一条补偿:哪条消息、哪个会话、何时撤回、还要不要发更正。

消息主键从回调取,不要用正文哈希。价格改一个字,正文哈希变了,对不上原来那条。字段名以文档为准。没有消息 ID 就不要做自动撤回对齐,这一期只做人工更正。

出站时把通道返回的消息标识和业务单号绑在一起:

def after_send(order_id, guid, to_id, content, receipt, db):
    db.save_outbound({
        "order_id": order_id,
        "guid": guid,
        "toId": to_id,
        "content": content,
        "channel_msg_id": receipt.get("msgid"),  # 字段名以回执文档为准
        "state": "sent",
    })

def on_revoke(channel_msg_id, db):
    row = db.find_by_channel_msg(channel_msg_id)
    if not row:
        return
    db.save_compensate(row["order_id"], "revoked")
    # 不把 sent 改成 failed,禁止按失败重投原文

消费者看到 revoked,默认停。要不要发更正句,由业务开关决定,且更正句必须已审。自动把原句再发一次,等于撤回失败。

入站撤回也要停嘴

对方撤了一句「报价多少」,若自动回复已经在路上,会出现:会话里问句没了,机器人的答还在。入站撤回应取消尚未发送的回复任务,已经发送的按产品决定是否再撤。未出站的任务取消成本低,应作为默认。

验收:发出去的测试句撤回后,任务表是 sent+revoked,不是 failed;补发任务不应把原文再送进群;对方撤回问句后,未发送的自动回被取消。价格类更正必须人工确认。机器人没有「撤回了所以通道坏了」这种状态。

查看企业微信 API 文档:
https://doc.qiweapi.com/

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐