机器人看起来是"自动聊天",拆开看是三层架构。每一层职责清晰、边界明确,理解了分层,开发时就知道问题出在哪一层。
一、通道层——解决"程序怎么连上微信"
最底层是通道:程序和微信之间怎么通信。这一层包括 HTTP 请求通道(调接口发指令)、Webhook 回调通道(微信事件推给程序)、鉴权机制(Token 证明身份、wId 标识实例)。
通道层的核心指标是可靠:请求能不能到、回调会不会丢、掉线能不能感知。错误码体系(1000 成功、1002 Token 过期、1004 限频)和回调重试机制(5 秒超时、3 次重试)都在保障这一层。
开发者大部分时候不用自己实现通道,但必须懂它的规则——回调 5 秒必须响应,这决定了上层必须异步处理。
二、能力层——解决"程序能对微信做什么"
中间层是能力接口:发文本、发图片、管好友、管群、查记录。每个接口是一个原子能力,参数和返回都有明确契约。
能力层是工具货架。机器人的功能不是写死的,而是从货架上选能力组合出来的。需要客服就选"消息回调 + sendText",需要群运营就再加"群事件 + 群管理接口"。
三、应用层——解决"程序拿能力做什么"
最上层是业务逻辑:收到消息怎么判断、命中什么规则、调哪个业务系统、回复什么内容。这一层完全由开发者写,接口服务不干涉。
三层的关系是:应用层编排能力层,能力层走通道层。问题排查也按层来——消息没收到查通道层(回调通不通),收了没动查应用层(逻辑对不对),动了发不出查能力层(参数错没错)。
三层架构对照
架构层 | 职责 | 关键机制 | 出问题的现象 |
|---|---|---|---|
通道层 | 程序连微信 | HTTP/Webhook/Token/wId | 收不到消息、接口不通 |
能力层 | 原子操作接口 | sendText/群管/好友接口 | 能收不能发、参数报错 |
应用层 | 业务逻辑 | 规则、状态、系统对接 | 能收不回、回复错误 |
三层协作示例
# 通道层:Webhook 接收 @app.post("/webhook") def webhook(): d = request.json queue.put(d) # 5秒内响应,处理丢给队列 return {"code": "1000"} # 能力层:封装原子接口 def send(to, text): return requests.post(f"{BASE}/sendText", headers=H, json={"wId": WID, "toUser": to, "content": text}) # 应用层:业务编排 def worker(): while True: msg = queue.get() if "退款" in msg["content"]: order = refund_system.query(msg["fromUser"]) # 调业务系统 send(msg["fromUser"], f"你的退款进度:{order}")落地建议
开发时按层隔离代码:通道层只做收发和鉴权,能力层封装成函数库,应用层写业务。混在一起写的代码,初期快后期乱;分层清晰的代码,换接口服务、加业务功能都不痛苦。接口规范参考 Eyun 开发文档。