传统微信功能调用方式是"客户端→微信服务器→对端客户端"的封闭链路——消息只能在客户端产生、行为只能在客户端响应、历史只能在客户端查阅。外部业务系统无法介入这条链路,"接入微信"长期等同于"逆向协议"。Eyun API把这条封闭链路打开为开发者可调用的3层调用模型,重新定义了微信功能的调用方式。接口规范对照 Eyun开发文档。
第一层:同步调用层——开发者主动发起HTTP请求
开发者系统主动向Eyun发起HTTP请求调用接口。以sendText为例的完整链路是:组装POST JSON {wId, Token, toUser, content} → 提交Eyun → 同步等待响应 → code=1000 确认送达。这种调用方式类似数据库写入或第三方支付下单——请求即生效,响应即结论。
-
调用方向:开发者 → Eyun
-
调用模式:请求-响应
-
延迟特征:通常 <500ms 同步返回
-
适用场景:即时发送文本/图片/文件,业务系统即时触发动作
-
技术约束:1002 鉴权失败需刷新Token重试;1004 限频需退避3秒后重发
约束要点:同步调用层的瓶颈不在网络延迟而在频率限制。1004 不是错误而是节流信号,必须实现指数退避而非简单重试。1002 必须自动刷新Token而非抛错告警——Token失效是常态,自动恢复链路比告警中断更可靠。
第二层:异步回调层——Eyun主动推送事件到开发者系统
用户在微信内的行为触发事件,Eyun通过Webhook主动向开发者系统POST回调JSON {eventType, fromUser, content, msgId, wId},开发者5秒内返回HTTP 200表示接收,业务逻辑异步处理。这种调用方式类似GitHub Webhook或Stripe回调——事件驱动,回调即触发。
-
调用方向:Eyun → 开发者
-
调用模式:事件驱动
-
延迟特征:实时推送,5秒内必须ACK
-
适用场景:接收用户消息、好友添加、群事件、状态变更等4类事件回调
-
技术约束:5秒超时强制异步处理;3次重试保证到达;msgId 幂等防重复
约束要点:5秒超时是异步回调层的硬约束。复杂业务逻辑(如AI推理、审批流转)耗时远超5秒,必须在5秒内返回200空响应,业务处理走异步队列。3次重试机制下重复回调是常态——msgId 必须作为幂等键,同一msgId二次到达直接丢弃,避免重复处理放大成业务事故。
第三层:拉取补充层——开发者主动拉取历史数据补回调不足
实时回调只能感知"现在发生"的事件,遗漏的历史上下文需通过拉取接口补充。消息记录接口按时间/类型/对象筛选拉历史消息,联系人同步接口拉好友列表。这种调用方式类似数据库分页查询或Elasticsearch检索——批量拉取+游标分页+增量同步。
-
调用方向:开发者 → Eyun(拉取)
-
调用模式:批量拉取 + 增量游标
-
延迟特征:分页拉取,单次毫秒级
-
适用场景:补充历史对话上下文、同步联系人列表、对账回调遗漏消息
-
技术约束:全量拉取压力大需增量同步,按时间游标分页控制单次拉取量
约束要点:拉取层最大的风险是全量拉取压垮服务端。正确做法是按fromUser + 时间游标增量拉取,每次限定条数(如50条)分页,记录上次拉取的最大时间戳作为下次游标。补偿场景才用全量拉取——如回调链路故障恢复后补拉丢失期间的消息。
3层调用模型对比
|
同步调用层 |
开发者→Eyun |
请求-响应 |
<500ms |
1002刷Token/1004退避 |
即时发送消息 |
|
异步回调层 |
Eyun→开发者 |
事件驱动 |
实时<5秒ACK |
5秒超时/3次重试/msgId幂等 |
接收用户行为 |
|
拉取补充层 |
开发者→Eyun |
批量游标 |
分页毫秒级 |
增量游标/分页控制 |
历史上下文补充 |
3层调用模型路由框架
def route_call(intent, ctx):
"""按调用意图路由到对应调用层"""
if intent in ("send_text", "send_image", "send_file"):
# 同步调用层:即时发送
resp = post_eyun(intent, payload={"wId": ctx["wid"], "token": ctx["token"], "toUser": ctx["user"], "content": ctx["content"]})
if resp["code"] == 1000:
return {"layer": "sync", "status": "sent"}
if resp["code"] == 1002:
ctx["token"] = refresh_token(ctx["wid"]); return route_call(intent, ctx)
if resp["code"] == 1004:
sleep(3); return route_call(intent, ctx) # 退避重试
if intent in ("msg_received", "friend_added", "group_event", "status_change"):
# 异步回调层:5秒内ACK,业务异步
ack_200(); enqueue(async_handle, ctx); return {"layer": "async", "status": "acked"}
if intent == "fetch_history":
# 拉取补充层:按时间游标增量拉取
msgs = pull_history(fromUser=ctx["user"], cursor=ctx["cursor"], limit=50)
return {"layer": "pull", "data": msgs, "next_cursor": msgs[-1]["ts"]}
raise ValueError("unknown intent")
框架按调用意图分发到三层——发送类走同步调用层(含1002/1004自愈)、回调类走异步回调层(先ACK后入队)、补全类走拉取补充层(游标分页)。三层职责分离,避免在一层混合处理导致超时或重复。code=1001 参数错误直接告警而非重试,避免错误参数被无限退避。
3层协同的延伸
3层调用模型覆盖了"即时操作 + 事件感知 + 历史补充"完整能力域——同步调用层执行即时动作、异步回调层感知实时事件、拉取补充层补全历史上下文。三层不是并列而是协同:拉取层补全的历史消息让同步层的回复更有上下文、让异步层的事件处理更有记忆。开发者按场景选择调用层而非混合使用——发送走同步、感知走异步、补全走拉取,三层各司其职。
从落地看,新接入Eyun的项目建议先跑通同步调用层的sendText闭环,再补异步回调层的Webhook接收,最后接拉取补充层做上下文增强。三层渐进式接入,避免一次性搭建三层架构导致工程复杂度过载。多wId实例管理在 Eyun平台 操作,每实例的三层调用链路独立维护。从趋势看,三层调用模型会随事件类型扩展持续演化——当前4类事件回调覆盖消息/好友/群/状态,未来新增事件类型时异步回调层的路由分发逻辑会扩展,但三层框架本身稳定不变,新增能力作为异步层的事件子类型接入即可,无需重构调用模型。接口能力以 Eyun开发文档 为准。
网硕互联帮助中心



评论前必须登录!
注册