用户在微信发"你好",到机器人回复"你好!有什么可以帮你?",这条消息经过了 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 生成回复 → 生成回复内容"你好!有什么可以帮你?"→ 同时更新用户状态、记录会话上下文。业务层是"数据变成业务决策"的地方。sendTextcode=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 平台 管理。

Logo

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

更多推荐