☰
个人微信消息回调怎么实现?Webhook接收与业务处理教程
2026/10/20 15:10:21 网站建设 项目流程

回调地址配好、消息能收到,只是第一步。真正决定能不能上生产的是"收到之后怎么处理"——事件怎么分发、重复怎么挡、处理失败了怎么补。这篇讲接收之后的处理模式。

一、收完先分层:接入层不碰业务

回调进来只做三件事:验签、去重、入队,然后立刻返回。业务处理全部放到队列后面。

这一层不碰业务是关键。一旦在回调里查库、调模型,几秒内返回不了,平台判定失败重推,用户就收到重复回复。

二、事件分发:路由表加处理器注册

事件类型一多,用大 if 会失控。改成路由表——类型到处理器的映射,新类型只注册一个处理器,不动已有代码,事件类型清单见Eyun 开发文档。

处理器按类型分:消息事件、成员变动、状态回调各一个,互不干扰。这样加功能很轻,也方便单独测试某个处理器。

三、幂等、异步、补偿三件事

幂等按事件 ID 做,处理前先查是否处理过,处理过直接跳过。异步就是把队列消费放到后台线程或独立进程,不阻塞接收。

补偿是处理失败后重试,但要有次数上限,超限进死信并告警。别做无限重试——重试到天荒地老,问题还是那个问题。

处理模式对照

关注点

做法

关键点

常见问题

接入层

验签+去重+入队

不碰业务

回调里处理业务

分发

路由表+处理器

新类型只加注册

大 if 失控

幂等

按事件 ID 去重

处理前先查

重复处理

补偿

限次重试+死信

超限告警

无限重试

回调处理实现

import queue import threading class EventDispatcher: def __init__(self): self.handlers = {} # 事件类型 -> 处理器 self.queue = queue.Queue() self.done = set() threading.Thread(target=self._loop, daemon=True).start() def register(self, event_type, handler): self.handlers[event_type] = handler # 新类型只加这一行 def on_callback(self, event): # 接入层:只验签、去重、入队 eid = event["event_id"] if eid in self.done: return {"code": 0} self.queue.put(event) return {"code": 0} # 立即 ACK def _loop(self): while True: event = self.queue.get() handler = self.handlers.get(event["type"]) if handler is None: continue # 未注册的类型先跳过 for attempt in range(3): # 补偿:限次重试 try: handler(event) self.done.add(event["event_id"]) break except Exception as e: if attempt == 2: self.to_dead_letter(event, e) # 超限进死信

落地建议

回调里只做验签、去重、入队,业务放队列后面,ACK 才能及时。事件分发用路由表,新类型只加注册不改旧代码。幂等按事件 ID 做,重复推送直接跳过。失败重试设次数上限,超限进死信并告警,别无限重试。接入层和业务层分开部署,接收受平台时间限制,业务不受。微信侧的回调推送由 Eyun 这类个人微信API平台 提供,分发与补偿逻辑在自建服务实现,具体字段以Eyun 平台为准。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询