一、系统架构设计
1.1 核心组件构成
本系统采用微服务架构设计,主要包含三个核心模块:
- 定时任务调度模块:负责每日定时触发推送逻辑
- 微信消息服务模块:处理与微信公众平台的API交互
- 用户管理模块:维护用户订阅关系及个性化配置
1.2 技术栈选择
- 开发框架:SpringBoot 2.7.x
- 定时任务:Spring Task + @Scheduled注解
- 微信SDK:官方WeChat Java SDK或第三方封装库
- 数据库:MySQL 8.0(存储用户订阅信息)
- 缓存:Redis(存储Access Token等临时数据)
二、微信公众平台配置
2.1 公众号类型选择
推荐使用服务号(需认证),因其具备:
- 高级接口权限
- 每月4条群发消息限制(可通过模板消息突破)
- 支持客服消息接口(48小时内互动用户可无限推送)
2.2 接口权限配置
- 在公众号后台启用”服务器配置”
- 设置IP白名单(包含服务器公网IP)
- 配置网页授权域名(用于获取用户OpenID)
- 申请模板消息权限(需提交模板审核)
三、SpringBoot实现细节
3.1 项目初始化
<!-- pom.xml核心依赖 --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 微信SDK选择 --><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>4.4.0</version></dependency></dependencies>
3.2 定时任务配置
@Configuration@EnableSchedulingpublic class ScheduleConfig {// 每天7:30执行@Scheduled(cron = "0 30 7 * * ?")public void morningGreetingTask() {// 调用推送服务}}
3.3 微信消息服务实现
3.3.1 初始化配置
@Configurationpublic class WxMpConfig {@Beanpublic WxMpService wxMpService() {WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();config.setAppId("your_appid");config.setSecret("your_secret");WxMpService service = new WxMpServiceImpl();service.setWxMpConfigStorage(config);return service;}}
3.3.2 模板消息发送
@Servicepublic class WxMessageService {@Autowiredprivate WxMpService wxMpService;public void sendMorningGreeting(String openId, String content) {WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder().toUser(openId).templateId("your_template_id").build();templateMessage.addData(new WxMpTemplateData("first", "早安问候", "#173177"));templateMessage.addData(new WxMpTemplateData("keyword1", content, "#000000"));try {wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);} catch (WxErrorException e) {// 异常处理}}}
四、用户管理模块实现
4.1 数据库设计
CREATE TABLE `wx_user` (`id` bigint NOT NULL AUTO_INCREMENT,`open_id` varchar(64) NOT NULL COMMENT '微信唯一标识',`subscribe` tinyint NOT NULL DEFAULT '1' COMMENT '订阅状态',`nickname` varchar(64) DEFAULT NULL COMMENT '用户昵称',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),UNIQUE KEY `uk_open_id` (`open_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 订阅流程
- 用户通过菜单/关键词触发订阅
- 后端获取用户OpenID
- 验证用户是否已订阅
- 记录订阅关系到数据库
五、高级功能实现
5.1 个性化问候语
public String generatePersonalizedGreeting(WxUser user) {// 根据用户属性生成不同问候String base = "亲爱的" + (StringUtils.isNotBlank(user.getNickname()) ?user.getNickname() : "用户") + ",早上好!";// 添加天气信息(需接入天气API)String weather = getWeatherInfo(user.getCity());// 添加励志语句(从数据库或API获取)String inspiration = getDailyInspiration();return base + "\n" + weather + "\n" + inspiration;}
5.2 消息去重机制
- 使用Redis存储当日已推送用户
- 推送前检查:
public boolean canSendToday(String openId) {String key = "morning_sent:" + openId;return redisTemplate.opsForValue().setIfAbsent(key, "1",24, TimeUnit.HOURS); // 24小时过期}
六、部署与运维
6.1 服务器配置建议
- 最低配置:1核2G(推荐2核4G)
- 操作系统:CentOS 7+
- 定时任务:使用crontab备份数据库
- 日志管理:ELK日志收集系统
6.2 监控告警
- 推送成功率监控
- 微信接口调用频率监控
- 服务器资源使用率监控
七、常见问题解决方案
7.1 微信接口调用失败
- 检查Access Token是否过期
- 验证IP白名单配置
- 检查公众号权限设置
7.2 定时任务不执行
- 检查@Scheduled注解是否生效
- 验证时区配置(server.timezone=Asia/Shanghai)
- 检查任务类是否被Spring管理
7.3 消息推送延迟
- 优化数据库查询
- 增加异步处理(@Async)
- 考虑使用消息队列解耦
八、优化建议
- 引入A/B测试机制,对比不同问候语效果
- 添加用户反馈入口,收集改进意见
- 实现智能推送时间(根据用户历史互动时间)
- 接入NLP服务生成更自然的问候语
本系统通过SpringBoot的强大生态,结合微信公众平台的开放接口,实现了稳定可靠的每日早安推送功能。实际部署时,建议先在小范围用户中测试,逐步扩大推送范围。同时要密切关注微信平台的规则更新,确保系统合规运行。