微信机器人收到一条消息后发生了什么?个人微信二次开发的数据流转过程
用户在微信发"你好",到机器人回复"你好!有什么可以帮你?",这条消息经过了 4 层流转,每层做不同的数据处理。下面按数据流转的层位把这条消息的旅程拆开。
一、4 层数据流转
1. 原始层:HTTP 请求到达
Webhook 推送 HTTP POST → 请求体是 JSON 字符串 → headers 含 Content-Type: application/json → 你的服务收到原始 HTTP 请求。这一层的"数据"是原始 HTTP 请求。按照 Eyun 开发文档的回调规范,推送的 POST 请求体是 JSON 格式,6 秒内必须返回成功。
大白话:原始层是"快递送到门口"——包裹(HTTP 请求)刚到,还没拆。
2. 解析层:JSON 提取字段
从 JSON 中提取业务字段:解析 JSON 字符串 → 取 messageType(消息事件类型)→ 取 data 里的 fromUser(发送者)和 content(消息内容)→ 取 newMsgId(唯一标识,用于排重)→ 组装成内部消息对象 {newMsgId, fromUser, content, timestamp}。回调 JSON 用 messageType 做事件分发,字段结构详见 Eyun 开发文档。
大白话:解析层是"拆快递"——拆开看里面有什么,把有用的字段取出来。
3. 业务层:逻辑处理生成回复
内部消息对象 → 路由到处理器 → 处理器匹配规则("你好" → 欢迎语模板)或调 AI 生成回复 → 生成回复内容"你好!有什么可以帮你?"→ 同时更新用户状态、记录会话上下文。业务层是"数据变成业务决策"的地方。sendText 用 code=1000 确认发送成功,保证业务层调接口的可靠性。
大白话:业务层是"拆完快递看内容决定怎么回"——用户说"你好" → 决定回"你好!有什么可以帮你?"。
4. 持久层:数据落库存档
原始消息入库(newMsgId + 发送者 + 内容 + 时间)→ 回复内容入库(关联 newMsgId + 回复内容 + 发送时间)→ 会话记录更新(发送者的最后联系时间)→ 持久层保证消息不丢、可查历史。在 Eyun 平台 管理的 wId 对应的消息都可归档,消息记录接口可拉历史补充。
大白话:持久层是"快递内容和回信都存档"——哪天查"这个用户上次说了什么"能找到。
二、4 层流转对比
| 流转层 | 数据形态 | 做什么 | 输入 | 输出 | 关键技术点 | 大白话 |
|---|---|---|---|---|---|---|
| 原始层 | HTTP 请求 | 接收 | POST 请求体 | 原始 JSON | 6 秒返回成功 | 快递到门口 |
| 解析层 | 业务字段 | 提取 | JSON 字符串 | 消息对象 | messageType 分发 | 拆快递 |
| 业务层 | 业务决策 | 处理 | 消息对象 | 回复内容 | 规则/AI + sendText | 决定怎么回 |
| 持久层 | 存档记录 | 落库 | 消息+回复 | 数据库行 | 关联 newMsgId | 内容回信存档 |
三、4 层数据流转框架
from flask import Flask, request
import threading, json, sqlite3
app = Flask(__name__); db = sqlite3.connect("msg.db", check_same_thread=False)
@app.route("/eyun/webhook", methods=["POST"]) # 原始层→解析层
def receive():
d = json.loads(request.get_data()) # 原始层接收 + 解析层提取
msg = {"id": d["data"]["newMsgId"], "from": d["data"]["fromUser"], "text": d["data"]["content"]}
def run(): # 业务层+持久层异步,6秒内必须返回
reply = "你好!有什么可以帮你?" if msg["text"] == "你好" else "收到"
db.execute("INSERT INTO msgs VALUES(?,?,?,?)", (msg["id"], msg["from"], msg["text"], reply)) # 持久层落库
db.commit(); send_text(msg["from"], reply) # 业务层调 sendText 发回复
threading.Thread(target=run).start()
return "", 200 # 原始层:6秒内返回成功
def send_text(wcId, content):
import requests
requests.post("https://你的接口域名/sendText", json={"wId": "w_abc", "wcId": wcId, "content": content},
headers={"Authorization": "Bearer eyk_your_auth"})
四、结尾延伸
4 层流转让一条消息从"HTTP 请求"变成"业务决策"再变成"存档记录"——原始层管接收、解析层管提取、业务层管决策、持久层管存档。4 层中任何一层出问题消息就"断流":原始层没接住 → 消息丢失、解析层取错字段 → 处理错消息、业务层没生成回复 → 用户收不到回复、持久层没入库 → 历史丢失。性能瓶颈通常在业务层(AI 调用慢、规则匹配慢),优化方向是业务层异步化(先返回成功再慢慢处理)。回调规范和接口参数见 Eyun 开发文档,wId 实例在 Eyun 平台 管理。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)