微信公众号智能后台的部署与二次开发指南:Spring Boot + AI + 搜索增强完整教程
从零开始,用Spring Boot搭建一个支持AI对话、图片识别、文件读取的微信公众号智能助手,附完整代码和踩坑记录
前言
大家好! 最近做了一个微信公众号后台开发的课程实验,从最基础的消息收发开始,一步步加上了AI智能回复、搜索增强、图片识别、文件读取等功能,踩了不少坑,也学到了很多东西。
这是一篇微信公众号智能后台的部署与二次开发指南,完整的项目代码我已经开源到GitHub了,包含了所有功能,大家直接下载就能用。这篇文章主要教你三件事:如何把项目跑起来 → 如何换上自己的API和测试号 → 如何二次开发加功能 → 常见问题怎么解决。
-
怎么跑起来:如何申请API、配置项目、启动运行
-
怎么改成你自己的:哪些配置要换、怎么换上你的测试号和API Key
-
怎么加功能:想二次开发加新功能,应该改哪里、怎么加
文末还有我开发过程中踩过的所有坑和解决方案,遇到问题先看FAQ,基本都能找到答案。
GitHub地址:https://github.com/Pearl-Yang/wechat-demo.git
最终能实现的功能:
-
基础消息收发
-
消息数据库存储
-
AI智能对话(豆包大模型)
-
异步消息处理(解决5秒超时)
-
搜索增强回复(博查搜索API)
-
Word文档生成(三种模式)
-
图片识别(多模态AI)
-
多轮消息合并理解
-
文件读取(TXT/Word/PDF)
技术栈:
-
后端框架:Spring Boot 2.7.18
-
开发语言:Java 8
-
数据库:MySQL 8.0 + MyBatis
-
连接池:Druid
-
AI服务:火山引擎豆包大模型
-
搜索服务:博查搜索API
-
文档处理:Apache POI + PDFBox
-
内网穿透:natapp
一、快速开始:5分钟跑起来
这一章告诉你最快跑起来需要做什么,跟着步骤走,5分钟就能让你的公众号回复消息。
1.1 第一步:下载代码
先从GitHub把代码克隆下来:
git clone https://github.com/Pearl-Yang/wechat-demo.git
cd wechat-demo
或者直接下载ZIP包解压也行。
1.2 第二步:你需要申请的东西
在开始配置之前,你需要先申请好这些东西:
| 名称 | 是否必做 | 用途 |
|---|---|---|
| 微信公众平台测试号 | 必做 | 微信公众号后台 |
| 火山引擎豆包API | 必做 | AI智能对话 |
| natapp内网穿透 | 必做 | 本地开发调试 |
| 博查搜索API | 选做 | 搜索增强功能 |
| MySQL数据库 | 必做 | 存储消息记录 |
具体的申请步骤在下一章会详细讲,你可以先去申请,申请完再回来配置。
1.3 第三步:环境要求
确保你的电脑上已经装好了这些:
-
JDK 8 或更高版本(推荐Java 8,兼容性最好)
-
MySQL 8.0 或 5.7 版本
-
Maven(IDEA自带的也行)
-
IntelliJ IDEA(社区版就够用)
1.3.1 安装JDK
我们用Java 17.
1.3.2 安装IntelliJ IDEA
IDEA是最好用的Java开发工具,社区版免费就够用。
-
安装IDEA
-
首次运行选择社区版(Community)
1.3.3 安装MySQL
我们用MySQL 8.0来存储消息。
-
安装MySQL,设置root密码(建议设成123456,方便记忆)
-
验证:打开命令行,输入
mysql -u root -p,输入密码能登录就说明装好了
1.3.4 安装Maven
IDEA自带Maven,一般不用单独装。如果想自己装也可以,版本3.6以上就行。
环境都准备好了的话,就可以继续往下看了!
小贴士:所有API的密钥和配置信息,建议单独存一个记事本里,后面填配置文件的时候直接复制粘贴,避免输错。
二、准备工作:申请API
这一章详细讲解每个API的申请步骤,跟着一步步来就行。所有密钥都建议单独存一个记事本,后面配置的时候直接复制。
2.1 微信公众平台测试号
做微信公众号开发,首先得有一个公众号。如果是个人学习用,申请测试号就够了,功能齐全,还不需要认证。
申请步骤:
-
打开微信公众平台测试号申请页面:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
-
用微信扫码登录
-
登录后就能看到你的测试号信息,把这几个信息记下来:
-
appID(测试号的唯一标识)
-
appsecret(测试号的密钥)
-
微信号(测试号的微信号)
-
-
往下翻,找到"接口配置信息",先空着,后面我们配置好服务器再填。
-
再往下,找到"测试号二维码",用微信扫码关注你的测试号,这样才能收到消息。
提示:测试号是免费的,功能和正式公众号差不多,足够学习和测试用了。
2.2 火山引擎豆包API
我们用火山引擎的豆包大模型来实现AI对话功能。新用户有免费额度,足够学习用了。
申请步骤:
-
打开火山引擎官网:https://www.volcengine.com/
-
注册账号并登录(可以用抖音/头条账号登录)
-
进入"方舟大模型平台":https://www.volcengine.com/product/ark
-
点击"立即使用",进入控制台
-
左侧菜单找到"模型推理" → "接入点管理"
-
点击"创建接入点"
-
填写接入点信息:
- 接入点名称:随便起,比如 wechat-demo
- 模型:选择 Doubao-Seed-2.0-lite(这个模型支持多模态,性价比高)
- 其他默认就行
- 创建成功后,把接入点ID记下来(格式类似
ep-2026xxxxxx-xxxxx)

-
左侧菜单找到"API Key管理"
-
点击"创建API Key"
-
创建成功后,把API Key记下来(格式类似
sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)

提示:新用户一般有免费额度,用完了也可以按量付费,很便宜,测试用不了几块钱。
1.3 博查搜索API(搜索增强功能)
如果想要实现"搜索增强"功能(让AI能搜索最新信息),可以申请博查搜索API。这个是选做的,不做也不影响基础功能。
申请步骤:
-
打开博查搜索官网:https://bocha.cn/
-
注册账号并登录
-
进入控制台,找到API Key管理
-
创建API Key
-
把API Key记下来

提示:博查搜索也有免费额度,个人学习完全够用。
1.4 natapp内网穿透
微信公众号需要一个公网可以访问的服务器地址来接收消息。本地开发的时候,我们可以用内网穿透工具把本地端口映射到公网。
natapp是比较常用的内网穿透工具,免费版就够用了。
申请步骤:
-
打开natapp官网:https://natapp.cn/
-
注册账号并登录
-
点击"购买隧道",选择"免费隧道"
-
配置隧道:
-
隧道名称:随便起
-
本地端口:8080(我们Spring Boot项目用8080端口)

-
-
购买成功后,在"我的隧道"里能看到你的隧道信息
-
下载natapp客户端:根据你的系统下载对应的版本

-
把下载的客户端解压到一个目录
-
使用时点击目录进去,双击
run_natapp.bat即可运行隧道。

提示:免费版的natapp每次重启地址都会变,所以每次重启natapp都要更新微信公众号的配置。
三、配置你的项目
API都申请好之后,我们来配置项目。主要就是改 application.yml 这个配置文件,把你自己的信息填进去。
3.1 配置文件详解
打开 src/main/resources/application.yml,这是完整的配置文件,我给你逐段讲解每个配置项是什么意思:
server:
port: 8080 # 项目端口号,默认8080
servlet:
context-path: /wechat # 上下文路径,所有接口前面都要加 /wechat
spring:
application:
name: wechat-demo
datasource: # 数据库连接配置
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/wechat_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root # 数据库用户名,改成你自己的
password: 123456 # 数据库密码,改成你自己的
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
mybatis: # MyBatis配置
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.wechat.entity
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 微信公众号配置
wechat:
appid: your_appid # ⭐ 改成你的微信测试号appID
appsecret: your_appsecret # ⭐ 改成你的微信测试号appsecret
token: wechat.token # 可以自定义,和微信后台保持一致就行
encodingaeskey: your_encodingaeskey_here
# AI智能回复配置
ai:
enabled: true # 是否开启AI功能
api-url: https://ark.cn-beijing.volces.com/api/v3/chat/completions
api-key: your_key # ⭐ 改成你的火山引擎API Key
model: your_point # ⭐ 改成你的推理接入点名称
system-prompt: 你是微信公众号助手,请用简洁友好的语气回答问题。
max-tokens: 2000
temperature: 0.7
# 搜索增强配置
search:
enabled: true # 是否开启搜索增强功能,不用就设为false
api-type: bocha
api-key: your_key # ⭐ 改成你的博查搜索API Key(不用可以不改)
endpoint: https://api.bocha.cn/v1/web-search
result-count: 3
# Word文档配置
word:
storage-path: ./files # Word文件存储路径
# 应用公网地址
app:
public-url: your_natapp_url # ⭐ 改成你的natapp公网地址,要加 /wechat 后缀
logging:
level:
com.example.wechat: debug
org.mybatis: debug
3.2 需要修改的配置清单
总结一下,你需要修改的配置项有这几个:
| 配置项 | 说明 | 是否必改 |
|---|---|---|
|
| 数据库用户名 | ✅ 必改 |
|
| 数据库密码 | ✅ 必改 |
|
| 微信测试号appID | ✅ 必改 |
|
| 微信测试号appsecret | ✅ 必改 |
|
| 火山引擎API Key | ✅ 必改 |
|
| 推理接入点名称 | ✅ 必改 |
|
| 博查搜索API Key | ⚪ 选改 |
|
| natapp公网地址 | ✅ 必改 |
注意:
app.public-url一定要加上http://xxxx.natappfree.cc/wechat,不然文件下载链接会不对。
3.3 初始化数据库
配置文件改好之后,我们来初始化数据库。项目里有个 sql/init.sql 文件,直接执行就行。
或者手动执行下面的SQL:
CREATE DATABASE IF NOT EXISTS wechat_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE wechat_db;
CREATE TABLE `wechat_message` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`msg_type` tinyint DEFAULT NULL COMMENT '消息类型:1-用户消息 2-回复消息',
`msg_id` bigint DEFAULT NULL COMMENT '微信消息ID',
`from_user_name` varchar(255) DEFAULT NULL COMMENT '发送方openId',
`to_user_name` varchar(255) DEFAULT NULL COMMENT '公众号ID',
`content_type` varchar(50) DEFAULT NULL COMMENT '消息类型text/image等',
`content` text COMMENT '消息内容',
`create_time` bigint DEFAULT NULL COMMENT '微信消息时间戳',
`local_create_time` datetime DEFAULT NULL COMMENT '本地入库时间',
`related_msg_id` bigint DEFAULT NULL COMMENT '关联用户消息ID',
`is_ai_reply` tinyint DEFAULT '0' COMMENT '是否AI回复:0关键词 1AI',
PRIMARY KEY (`id`),
KEY `idx_from_user` (`from_user_name`),
KEY `idx_msg_type` (`msg_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信消息记录表';
执行完之后,数据库就准备好了。
3.4 检查一下
改完配置、初始化完数据库,先确认这几件事:
-
✅ MySQL服务已经启动
-
✅ 数据库用户名密码正确
-
✅ 数据库 wechat_db 已经创建
-
✅ wechat_message 表已经建好
-
✅ 所有API Key都已经填对了
没问题的话,我们就可以启动运行了!
四、启动运行
配置都改好了,现在我们来启动项目,验证一下能不能正常运行。
4.1 启动natapp
首先启动natapp内网穿透,这样微信才能访问到你的本地服务。
打开命令行,进入natapp所在目录,直接双击 run_natapp.bat 也行)
启动成功后,你会看到一个公网域名,比如 http://xxxx.natappfree.cc,把这个记下来。

注意:免费版natapp每次重启地址都会变,如果后面发现收不到消息了,先检查natapp地址是不是变了。
4.2 配置微信测试号后台
现在我们去微信测试号后台配置接口地址。
-
登录微信公众平台测试号
-
找到"接口配置"区域
-
URL 填:
你的natapp地址/wechat/wx(比如http://xxxx.natappfree.cc/wechat/wx) -
Token 填:
wechat.token(和你 application.yml 里的 token 保持一致) -
点击"提交"

注意: URL一定要加上
/wechat/wx后缀,因为我们项目配置了上下文路径/wx路径下。
如果提交成功,说明你的服务已经可以被微信访问到了。如果提交失败,检查一下:
-
natapp是否正常启动
-
URL是否正确(注意两个wechat)
-
Token是否和配置文件一致
-
项目是否已经启动(哦对,我们还没启动项目,先启动项目再提交)
4.3 启动Spring Boot项目
用IDEA打开项目,找到 WechatApplication.java 启动类,右键点击运行。
或者用命令行启动:
启动成功后,控制台会显示 "Started WechatApplication",说明项目启动成功了。

4.4 验证微信接口
项目启动成功后,回到微信测试号后台,点击"提交"按钮验证接口配置。
如果提示"配置成功",恭喜你!微信接口已经通了。
如果提示"配置失败",不要慌,按照下面的顺序检查:
-
检查natapp是否正常启动,地址有没有变
-
检查URL是否正确,格式是
http://xxxx.natappfree.cc/wechat/wx -
检查Token是否和配置文件里的一致
-
检查项目是否正常启动,控制台有没有报错
-
检查防火墙是否阻止了8080端口
4.5 测试消息
接口配置成功后,我们来测试一下消息。
用微信扫描测试号的二维码关注测试号,然后发送一条消息,比如"你好"。
如果收到了回复,说明一切正常!🎉
如果没收到回复,检查一下:
-
微信测试号的接口配置是否正确
-
项目是否正常运行
-
natapp地址有没有变
-
控制台有没有报错信息
五、项目结构说明:每个文件是干嘛的
项目跑起来之后,你可能想知道每个文件是干嘛的,这样后面改起来才心里有数。这一章给你详细讲解项目结构。
5.1 整体目录结构
wechat-demo/
├── pom.xml # Maven配置文件,管理依赖
├── README.md # 项目说明文档
├── sql/
│ └── init.sql # 数据库初始化脚本
└── src/
├── main/
│ ├── java/com/example/wechat/
│ │ ├── WechatApplication.java # 启动类,项目入口
│ │ ├── controller/ # 控制器层,接收请求
│ │ │ ├── WechatController.java # 微信消息入口控制器
│ │ │ └── FileController.java # 文件下载控制器
│ │ ├── service/ # 业务层,处理核心逻辑
│ │ │ ├── WechatService.java # 业务接口
│ │ │ ├── CustomerMessageService.java # 客服消息推送服务
│ │ │ └── impl/
│ │ │ └── WechatServiceImpl.java # 业务实现,核心逻辑都在这里
│ │ ├── mapper/ # 数据访问层,操作数据库
│ │ │ └── MessageMapper.java # 消息数据库操作接口
│ │ ├── entity/ # 实体类,对应数据库表
│ │ │ └── Message.java # 消息实体类
│ │ └── util/ # 工具类,封装通用功能
│ │ ├── WechatUtil.java # 微信工具类:签名验证、XML解析
│ │ ├── AiUtil.java # AI调用工具类
│ │ ├── WechatTokenUtil.java # access_token获取和缓存
│ │ ├── SearchUtil.java # 搜索API调用工具类
│ │ ├── WordUtil.java # Word文档生成工具类
│ │ └── FileUtil.java # 文件读取工具类
│ └── resources/
│ ├── application.yml # 配置文件,所有配置都在这里
│ └── mapper/
│ └── MessageMapper.xml # MyBatis SQL映射文件
└── test/
└── java/com/example/wechat/
└── WechatApplicationTests.java # 测试类
5.2 各层职责说明
项目采用经典的三层架构,职责清晰:
Controller层(控制器层)
-
负责接收HTTP请求
-
参数校验和转换
-
调用Service层处理业务
-
返回响应结果
-
不包含业务逻辑
Service层(业务层)
-
核心业务逻辑都在这里
-
调用Mapper层操作数据库
-
调用Util层的工具类
-
事务控制一般在这一层
Mapper层(数据访问层)
-
负责数据库的增删改查
-
接口定义在Java文件里
-
SQL语句写在XML文件里
-
不包含业务逻辑
Util层(工具层)
-
封装通用的工具方法
-
比如调用第三方API、解析XML、生成文档等
-
不包含业务逻辑,可以复用
Entity层(实体层)
-
对应数据库表的Java类
-
每个字段对应表的一列
-
只有getter和setter,没有业务方法
5.3 核心文件详解
5.3.1 WechatServiceImpl.java(核心中的核心)
这个文件是整个项目的核心,大部分业务逻辑都在这里。主要功能:
-
接收微信消息,判断消息类型
-
关键词回复处理
-
AI智能回复处理
-
异步消息处理(解决5秒超时)
-
搜索增强功能
-
Word文档生成
-
图片识别
-
多轮消息合并
如果你想改业务逻辑,大部分情况都是改这个文件。
5.3.2 application.yml(配置中心)
所有的配置都在这里,包括:
-
数据库连接配置
-
微信公众号配置
-
AI API配置
-
搜索API配置
-
其他功能开关
想改配置直接改这个文件就行,不用改代码。
5.3.3 pom.xml(依赖管理)
这个文件管理项目所有的依赖包。如果你想加新的功能,需要引入新的依赖,就在这个文件里加。
比如想加Redis缓存,就在dependencies里加Redis的依赖。
5.3.4 WechatController.java(入口控制器)
微信的所有消息都会先到这里,然后转发给Service层处理。主要做两件事:
-
处理微信的服务器验证请求(GET请求)
-
接收微信的消息推送(POST请求)
一般不需要改这个文件,除非你想加新的接口。
六、如何二次开发:想加功能怎么改
项目跑起来了,结构也搞清楚了,接下来就是最关键的:想加新功能,应该怎么改?
这一章教你二次开发的一般步骤,还有三个具体的示例,跟着做就能学会。
6.1 加新功能的一般步骤
不管加什么功能,大致都是这几步:
-
判断要不要加依赖:如果功能需要新的第三方库,就在
pom.xml里加依赖 -
判断要不要加配置:如果功能需要配置项(比如API Key、开关等),就在
application.yml里加 -
判断要不要加工具类:如果是调用第三方API或者通用功能,就在
util包下加工具类 -
判断要不要加业务逻辑:核心业务逻辑在
service层,需要的话加接口和实现类 -
判断要不要加数据库表:如果需要存储新的数据,就在
entity加实体类、mapper加接口、resources/mapper加XML -
判断要不要加新接口:如果需要新的HTTP接口,就在
controller包下加控制器 -
集成到主流程:在
WechatServiceImpl里把新功能集成进去
是不是有点抽象?没关系,下面给你三个具体的例子,一看就懂了。
6.2 添加依赖:pom.xml怎么改
如果你的新功能需要第三方库,就在 pom.xml 的 <dependencies> 节点里加。
比如想加Redis缓存,就加:
<!-- Redis缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
注意事项:
-
依赖要加在
<dependencies>标签里面 -
Spring Boot的依赖一般不用写版本号,由parent管理
-
加完依赖记得刷新Maven,让IDEA下载下来
-
如果不确定依赖怎么写,去官网或者Maven中央仓库查
6.3 加配置:application.yml怎么加
如果你的功能需要配置项(比如API Key、功能开关、超时时间等),就在 application.yml 里加。
比如想加一个翻译功能的配置:
# 翻译功能配置
translate:
enabled: true # 是否开启翻译功能
app-id: your_app_id # 翻译API的appId
app-key: your_app_key # 翻译API的密钥
default-from: auto # 默认源语言
default-to: en # 默认目标语言
建议:
-
相关的配置放在一起,用注释说明是干嘛的
-
布尔类型的配置用 enabled 命名,方便开关功能
-
敏感信息(如API Key)不要硬编码在代码里,都放配置文件
在代码里读取配置:
用 @Value 注解读取:
@Value("${translate.enabled}")
private boolean translateEnabled;
@Value("${translate.app-id}")
private String translateAppId;
或者用配置类(配置项多的时候推荐):
@ConfigurationProperties(prefix = "translate")
public class TranslateProperties {
private boolean enabled;
private String appId;
private String appKey;
// getter和setter
}
6.4 要不要加新的Java类?加在哪个包?
很多同学纠结:我这个功能应该加在哪里?给你一个简单的判断方法:
| 功能类型 | 放在哪个包 | 命名规范 |
|---|---|---|
| 接收HTTP请求 | controller | XxxController |
| 业务逻辑处理 | service / service.impl | XxxService / XxxServiceImpl |
| 操作数据库 | mapper / entity | XxxMapper / Xxx |
| 调用第三方API、通用工具方法 | util | XxxUtil |
| 配置项 | config / 直接用@Value | XxxProperties |
| 异常处理 | exception | XxxException |
简单判断方法:
-
如果是对外提供接口 → 加在 controller
-
如果是核心业务逻辑 → 加在 service
-
如果是操作数据库 → 加在 mapper + entity
-
如果是通用工具、调用第三方 → 加在 util
-
如果功能很简单,只有几行代码 → 直接在 WechatServiceImpl 里加就行,不用单独建类
6.5 示例1:加一个新的关键词回复
最简单的二次开发,只需要改一个文件:WechatServiceImpl.java
场景: 想加一个关键词"帮助",用户发"帮助"就回复使用说明。
步骤:
-
打开
WechatServiceImpl.java -
找到处理文本消息的方法(一般叫 handleTextMessage 之类的)
-
在关键词判断的地方加一个新的if判断
-
// 关键词回复 if ("帮助".equals(content) || "help".equalsIgnoreCase(content)) { String helpText = "使用说明:\n" + "1. 直接聊天就能和AI对话\n" + "2. 发图片可以识别图片内容\n" + "3. 发文件可以读取文件内容\n" + "4. 发送【生成文档+内容】可以生成Word文档\n" + "5. 更多功能等你探索~"; return buildTextReplyMessage(toUserName, fromUserName, helpText); }就这么简单!加完重启项目就能用了。
进阶: 如果关键词很多,可以把关键词和回复存在数据库里,或者存在配置文件里,这样加关键词不用改代码。
6.6 示例2:接入一个新的第三方API
稍微复杂一点,以接入"百度翻译API"为例。
步骤:
第一步:申请API
-
去百度翻译开放平台注册账号
-
申请通用翻译API
-
拿到 APP ID 和 密钥第二步:加配置 在
application.yml里加配置:
# 百度翻译配置
translate:
enabled: true
app-id: your_app_id
app-key: your_app_key
第三步:加工具类 在 util 包下新建 TranslateUtil.java:
@Component
public class TranslateUtil {
@Value("${translate.app-id}")
private String appId;
@Value("${translate.app-key}")
private String appKey;
// 调用百度翻译API的方法
public String translate(String text, String from, String to) {
// 这里写调用API的代码
// 1. 拼接请求参数
// 2. 发送HTTP请求
// 3. 解析返回结果
// 4. 返回翻译后的文本
return null;
}
}
第四步:加业务逻辑 在 WechatServiceImpl 里注入工具类,然后在合适的地方调用:
@Autowired
private TranslateUtil translateUtil;
// 在处理消息的地方加判断
if (content.startsWith("翻译") || content.startsWith("翻译 ")) {
String text = content.substring(2).trim();
String result = translateUtil.translate(text, "auto", "en");
return buildTextReplyMessage(toUserName, fromUserName, result);
}
第五步:测试 重启项目,发"翻译 你好"试试,看能不能返回英文。
接入其他第三方API的思路都是一样的:申请API → 加配置 → 写工具类 → 业务逻辑调用。
6.7 示例3:加一个新的消息类型处理
微信支持很多消息类型:文本、图片、语音、视频、地理位置、链接等等。项目里已经处理了文本和图片,现在我们来加语音消息的处理。
步骤:
-
打开
WechatServiceImpl.java -
找到处理消息的主方法,里面应该有判断消息类型的地方
-
加一个语音消息的分支
if ("voice".equals(msgType)) {
// 语音消息
String recognition = map.get("Recognition"); // 语音识别结果(需要开通语音识别功能)
// 可以把识别后的文本当成普通文本消息处理
return handleTextMessage(toUserName, fromUserName, recognition, msgId, createTime);
}
微信支持的消息类型:
-
text:文本消息
-
image:图片消息
-
voice:语音消息
-
video:视频消息
-
shortvideo:短视频消息
-
location:地理位置消息
-
link:链接消息
-
event:事件消息(关注、取消关注、点击菜单等)
想支持哪种,就加对应的处理逻辑就行。
6.8 开发小建议
最后给你几个开发建议,少走弯路:
-
先小后大:先改小功能验证思路,再逐步加复杂功能,不要一上来就改一大堆
-
勤加注释:自己写的代码要加注释,过一个月你自己都忘了当时怎么想的
-
分步测试:改完一部分就测一下,不要全改完再测,出问题不知道是哪改坏的
-
配置开关:新功能最好加个enabled开关,出问题可以随时关掉,不影响主功能
-
异常处理:调用第三方API一定要加try-catch,不要因为一个功能挂了导致整个公众号用不了
七、常见问题FAQ(踩坑记录)
这一章是我开发过程中踩过的所有坑,遇到问题先看这里,基本都能找到答案。
7.1 微信验证失败怎么办?
现象: 在微信后台点击"提交"验证接口,提示"配置失败"。
排查顺序:
-
检查natapp是否正常启动
-
看看natapp窗口有没有报错
-
访问一下natapp地址,看能不能打开
-
-
检查URL是否正确
-
格式应该是:
http://xxxx.natappfree.cc/wechat/wx -
注意有两个wechat:一个是上下文路径,一个是接口路径
-
不要少了最后的
/wx
-
-
检查Token是否一致
-
微信后台填的Token和 application.yml 里的
wechat.token必须完全一致 -
注意前后不要有空格
-
-
检查项目是否启动
-
看看控制台有没有 "Started WechatApplication"
-
有没有报错信息
-
-
检查控制台日志
-
微信验证的时候,控制台应该会有请求日志
-
如果没有日志,说明请求没到你的服务,检查natapp和URL
-
如果有日志但报错,根据错误信息排查
-
7.2 收不到消息回复怎么办?
现象: 关注了测试号,发消息没反应。
排查顺序:
-
检查微信测试号接口配置
-
是不是显示"配置成功"
-
URL和Token对不对
-
-
检查项目运行状态
-
项目有没有正常启动
-
控制台有没有报错
-
-
检查natapp地址
-
免费版natapp每次重启地址都会变
-
地址变了要同时更新微信后台和配置文件
-
-
查看控制台日志
-
发消息的时候控制台有没有收到请求
-
有没有报错信息
-
有没有返回响应
-
-
检查消息类型
-
目前支持文本和图片消息
-
语音、视频等其他消息可能没有处理
-
7.3 AI调用失败怎么办?
现象: 发消息不回复,或者回复"AI调用失败"。
排查顺序:
-
检查API Key是否正确
-
application.yml 里的
ai.api-key对不对 -
注意不要有多余的空格
-
-
检查接入点名称
-
ai.model填的是接入点名称(Endpoint ID),不是模型名称 -
去火山方舟控制台确认一下
-
-
检查账户余额
-
火山引擎是按量付费的,看看账户有没有余额
-
新用户有免费额度,用完了需要充值
-
-
检查网络
-
能不能正常访问火山引擎的API地址
-
有没有被防火墙拦截
-
-
查看错误日志
-
控制台应该会打印具体的错误信息
-
根据错误码去官方文档查原因
-
7.4 natapp免费版地址总是变怎么办?
现象: 每次重启natapp,地址就变了,要改好几个地方,很麻烦。
解决方案:
-
买付费版:付费版有固定域名,省心,也不贵
-
每次重启后更新两个地方:
-
application.yml 里的
app.public-url -
微信公众号后台的接口配置URL
-
-
用其他内网穿透工具:比如cpolar、ngrok等,有些有免费固定域名
小技巧:开发的时候natapp不要关,一直开着,地址就不会变。
7.5 长消息被截断怎么办?
现象: AI回复的内容很长,但是只显示了一部分。
原因: 微信客服消息单条文本有2048字节限制,超过了就会被截断或者发送失败。
解决方案: 项目里已经做了分段处理,会把长文本拆成多条消息发送。
如果还是有问题,检查一下:
-
分段的阈值是不是设得太大了
-
编码问题导致字节数计算不对
-
有没有特殊字符占字节
7.6 为什么有时候会收到重复消息?
现象: 发一条消息,有时候会收到两条回复。
原因: 微信的5秒超时机制。如果你的服务5秒内没有返回响应,微信会重试,就会导致消息重复处理。
解决方案: 项目里已经用了异步+客服消息的架构,正常不会有这个问题。
如果还是有,检查一下:
-
是不是网络太慢,导致同步响应超过5秒
-
异步处理是不是正常工作
-
有没有做消息去重(用msgId判断)
7.7 Word文件下载链接打不开怎么办?
现象: 生成了Word文档,但是点击下载链接显示404。
原因: 大概率是公网地址配置错了,少了上下文路径。
解决方案:
-
检查
app.public-url配置 -
一定要加上
/wechat后缀 -
正确格式:
http://xxxx.natappfree.cc/wechat
7.8 搜索功能总是干扰正常回答怎么办?
现象: 问一些常识问题,AI的回答反而不对,因为被搜索结果带偏了。
原因: 搜索结果的质量参差不齐,有时候会干扰AI的判断。
解决方案:
-
优化提示词,告诉AI什么时候用搜索结果,什么时候不用
-
加一个判断,只有特定类型的问题才调用搜索
-
降低搜索结果的权重
-
不用搜索功能的话,直接把
search.enabled设为 false
7.9 access_token过期了怎么办?
现象: 客服消息发送失败,提示token过期。
原因: 微信的access_token有效期是7200秒(2小时),过期了就不能用了。
解决方案: 项目里已经做了自动刷新机制,正常不会有问题。
如果还是有问题,检查一下:
-
刷新token的定时任务有没有正常工作
-
appid和appsecret对不对
-
有没有频繁刷新导致被限流
7.10 数据库连不上怎么办?
现象: 启动项目报错,说数据库连接失败。
排查顺序:
-
检查MySQL服务是否启动
-
Windows:去服务里看MySQL服务有没有启动
-
Mac/Linux:执行
brew services list或systemctl status mysql
-
-
检查用户名密码
-
application.yml 里的用户名密码对不对
-
能不能用命令行登录:
mysql -u root -p
-
-
检查数据库是否存在
-
有没有创建
wechat_db数据库 -
执行
show databases;看看
-
-
检查端口
-
MySQL默认端口是3306
-
如果改了端口,配置文件里也要改
-
-
检查防火墙
-
本地的话一般不用考虑
-
远程数据库的话,检查防火墙和安全组
-
八、总结与拓展方向
看到这里,你应该已经能把项目跑起来,并且知道怎么改了。最后做个总结,再给你一些拓展方向。
8.1 本文总结
这篇指南主要讲了四件事:
-
怎么跑起来:下载代码 → 申请各种API → 配置项目 → 启动运行
-
项目结构:每个文件是干嘛的,各层职责是什么
-
怎么二次开发:加功能的一般步骤,三个具体示例
-
常见问题:开发过程中可能遇到的坑和解决方案
8.2 可以拓展的方向
这个项目只是基础版,你可以在这个基础上加很多功能,比如:
功能类:
-
加菜单功能:自定义公众号菜单
-
加关注回复:用户关注时自动发欢迎语
-
加签到功能:每日签到积分
-
加抽奖功能:公众号抽奖活动
-
加客服系统:人工客服接入
-
加数据统计:消息量、用户数统计
技术类:
-
接入Redis:缓存热点数据、access_token等
-
加消息队列:异步处理更可靠
-
加限流:防止恶意请求
-
加日志系统:更完善的日志记录
-
加监控:服务健康监控
-
部署到服务器:不用本地开发了,直接部署到云服务器
AI类:
-
换其他大模型:比如GPT、Claude、文心一言等
-
加人设:给AI设定特定的角色人设
-
加知识库:基于你的文档做问答
-
加多模态:支持语音、视频理解
-
加Agent:让AI能调用工具
8.3 写在最后
微信公众号开发看起来复杂,其实核心就是接收消息、处理消息、返回消息这三步。把基础流程跑通之后,加功能就是不断往里面填东西。
建议你先把项目跑起来,然后试着改一个小功能,比如加个关键词回复,感受一下整个流程。然后再慢慢加复杂的功能。
如果这篇文章对你有帮助,别忘了去GitHub给个Star~ 有问题也可以在Issues里提。
祝你开发顺利!🎉
更多推荐


所有评论(0)