Appearance
微信渠道改造实施记录
2026-04-30 第一轮修改
本轮命名调整
- 按要求统一使用
channel命名,不再使用binding作为核心对象命名。 - 当前落地的核心模型名称:
AiWechatAgentChannelEntityAiWechatCredentialEntityAiWechatSessionRouteEntity
本轮已完成修改
1. 新增数据库迁移脚本
文件:muotai-ai/muotai-ai-biz/src/main/resources/db.migration/V0.0.24__create_wechat_channel_tables.sql
新增三张表:
ai_wechat_credential:微信渠道凭证表ai_wechat_agent_channel:用户-智能体微信渠道表ai_wechat_session_route:微信渠道会话路由表
设计要点:
- 所有表都包含
del_flag、tenant_id,与现有 AI 模块表风格保持一致。 ai_wechat_agent_channel使用(tenant_id, agent_id, user_id, del_flag)唯一约束,保证同一用户对同一 agent 只有一条有效 channel。ai_wechat_session_route使用(tenant_id, channel_id, route_key, del_flag)唯一路由约束。
2. 新增实体层
目录:muotai-ai/muotai-ai-biz/src/main/java/com/pig4cloud/pigx/ai/domain/entity/
新增:
AiWechatCredentialEntity.javaAiWechatAgentChannelEntity.javaAiWechatSessionRouteEntity.java
设计要点:
- 使用
@TenantTable - 使用
@TableLogic - 使用
Model<T>风格,跟现有AiToolBizTypeEntity/AiChatHistoryEntity一致 - 字段名与迁移脚本保持一致,便于后续 MyBatis-Plus 直接映射
3. 新增 Mapper 层
目录:muotai-ai/muotai-ai-biz/src/main/java/com/pig4cloud/pigx/ai/mapper/
新增:
AiWechatCredentialMapper.javaAiWechatAgentChannelMapper.javaAiWechatSessionRouteMapper.java
4. 新增 Service 接口层
目录:muotai-ai/muotai-ai-biz/src/main/java/com/pig4cloud/pigx/ai/service/
新增:
AiWechatCredentialService.javaAiWechatAgentChannelService.javaAiWechatSessionRouteService.java
5. 新增 Service 实现层
目录:muotai-ai/muotai-ai-biz/src/main/java/com/pig4cloud/pigx/ai/service/impl/
新增:
AiWechatCredentialServiceImpl.javaAiWechatAgentChannelServiceImpl.javaAiWechatSessionRouteServiceImpl.java
当前实现为最小基础实现,统一继承 ServiceImpl,为后续渠道开通、路由查找、runtime 管理提供数据访问基础。
6. 前置安全修复(已完成第一部分)
修改文件:
muotai-ai/muotai-ai-biz/src/main/java/com/pig4cloud/pigx/ai/service/impl/AgentChatServiceImpl.javamuotai-ai/muotai-ai-biz/src/main/java/com/pig4cloud/pigx/ai/service/impl/AiChatHistoryServiceImpl.javamuotai-ai/muotai-ai-biz/src/main/java/com/pig4cloud/pigx/ai/controller/AiChatbotAgentController.java
本轮修复内容:
- 恢复
AgentChatServiceImpl.validateExistingSession(...)中的userId所有权校验,避免仅凭agentId继续访问他人 session。 - 恢复
AiChatHistoryServiceImpl.getHistoryBySessionIdAndUserId(...)的user_id过滤条件,避免历史查询按sessionId直接命中他人数据。 - 收紧
AiChatbotAgentController.getSessionDetail(...):- 必须登录后才能查看
- session 不存在时直接拒绝
- 当前用户必须与 session.userId 一致
- 消息读取改为使用受限接口
getMessagesBySessionId(...)
当前效果:
- 已把最明显的两类越权入口先收口,后续多用户 channel 接入时不会继续沿用“只校验 agent、不校验用户”的旧行为。
当前阶段结论
本轮已经完成了 channel 命名下的第一层基础设施:
- 数据表
- 实体
- Mapper
- Service
- 第一部分安全修复
下一步将进入:
- WechatChannelService 业务层
- WechatBotRuntimeManager / WechatChannelRuntime 运行时层
- AiWechatChannelController 接口层
- 微信 runtime 的租户上下文恢复