SpringBoot+微信模板消息:每日早安与天气自动推送方案

一、项目背景与核心价值

在数字化生活场景中,个性化服务需求日益增长。本方案通过SpringBoot框架整合微信官方模板消息接口,实现每日7:30自动向指定微信用户推送包含动态天气数据和温馨问候的消息。相较于传统短信,微信模板消息具有零成本、高触达率的特点,尤其适合开发个人关怀类应用。

核心价值体现在三方面:技术实现层面展示SpringBoot与第三方API的整合能力;生活应用层面提供可定制的个性化服务模板;开发参考层面为类似定时消息推送场景提供完整解决方案。

二、技术架构解析

1. 系统组成模块

  • 定时任务模块:基于Spring Task实现每日7:30准时触发
  • 天气数据模块:集成第三方天气API(如和风天气)
  • 消息生成模块:动态拼接问候语与天气信息
  • 微信推送模块:调用微信模板消息接口
  • 配置管理模块:集中管理微信模板ID、用户OpenID等参数

2. 关键技术点

微信模板消息配置

需在微信公众平台申请”事务型消息”模板,示例模板内容:

  1. {{first.DATA}}
  2. 天气:{{weather.DATA}}
  3. 温度:{{temperature.DATA}}
  4. 建议:{{suggestion.DATA}}
  5. {{remark.DATA}}

重点参数说明:

  • template_id:需在公众号后台申请
  • url:可设置点击消息跳转链接
  • miniprogram:小程序跳转配置(可选)

天气数据获取

推荐使用和风天气免费API,响应示例:

  1. {
  2. "status": "ok",
  3. "daily": [{
  4. "date": "2023-06-15",
  5. "text_day": "晴",
  6. "temp_max": 28,
  7. "temp_min": 18,
  8. "wind_scale": "3-4"
  9. }]
  10. }

需处理的数据字段:天气现象、最高温、最低温、风力等级。

三、源码实现详解

1. 项目结构

  1. src/main/java/
  2. ├── config/ # 配置类
  3. └── WeChatConfig.java
  4. ├── controller/ # 测试接口(可选)
  5. ├── entity/ # 数据实体
  6. ├── service/ # 核心服务
  7. ├── WeatherService.java
  8. └── MessageService.java
  9. ├── task/ # 定时任务
  10. └── DailyTask.java
  11. └── util/ # 工具类
  12. └── HttpUtil.java

2. 核心代码实现

定时任务配置

  1. @Configuration
  2. @EnableScheduling
  3. public class ScheduleConfig {
  4. @Scheduled(cron = "0 30 7 * * ?") // 每日7:30
  5. public void sendMorningGreeting() {
  6. // 调用消息服务
  7. }
  8. }

天气服务实现

  1. @Service
  2. public class WeatherService {
  3. private static final String WEATHER_URL = "https://devapi.qweather.com/v7/weather/3d";
  4. public WeatherData getWeather(String city) {
  5. String response = HttpUtil.get(WEATHER_URL +
  6. "?key=YOUR_KEY&location=" + city);
  7. return JSON.parseObject(response, WeatherData.class);
  8. }
  9. }

消息组装与推送

  1. @Service
  2. public class MessageService {
  3. @Autowired
  4. private WeChatConfig weChatConfig;
  5. public boolean sendTemplateMessage(String openId, WeatherData weather) {
  6. String url = "https://api.weixin.qq.com/cgi-bin/message/template/send";
  7. Map<String, Map<String, String>> data = new HashMap<>();
  8. data.put("first", Map.of("value", "早安呀!"));
  9. data.put("weather", Map.of("value", weather.getTextDay()));
  10. data.put("temperature", Map.of("value",
  11. weather.getTempMin() + "℃ ~ " + weather.getTempMax() + "℃"));
  12. data.put("suggestion", Map.of("value", getSuggestion(weather)));
  13. data.put("remark", Map.of("value", "记得吃早餐哦~"));
  14. JSONObject params = new JSONObject();
  15. params.put("touser", openId);
  16. params.put("template_id", weChatConfig.getTemplateId());
  17. params.put("data", data);
  18. return HttpUtil.postJson(url, params.toJSONString(),
  19. weChatConfig.getAccessToken());
  20. }
  21. }

四、部署与配置指南

1. 环境准备

  • JDK 1.8+
  • Maven 3.6+
  • 微信公众平台测试账号(需获取AppID和AppSecret)
  • 天气API Key(推荐和风天气免费版)

2. 配置步骤

  1. application.yml中配置:

    1. wechat:
    2. appid: your_appid
    3. secret: your_secret
    4. template-id: your_template_id
    5. weather:
    6. api-key: your_weather_key
    7. city: 101010100 # 北京城市代码
  2. 获取微信AccessToken(需定时刷新):

    1. public String getAccessToken() {
    2. String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
    3. "&appid=" + appid + "&secret=" + secret;
    4. JSONObject response = JSON.parseObject(HttpUtil.get(url));
    5. return response.getString("access_token");
    6. }

五、扩展与优化建议

  1. 多用户支持:通过数据库存储用户OpenID,实现批量发送
  2. 内容个性化:根据天气情况动态调整问候语(如下雨天提醒带伞)
  3. 异常处理:增加天气API调用失败的重试机制
  4. 部署优化:使用Docker容器化部署,配合Nginx负载均衡
  5. 监控告警:集成Prometheus监控消息发送成功率

六、典型问题解决方案

  1. 微信接口调用频率限制

    • 解决方案:控制发送频率,不超过45000次/分钟
    • 优化建议:对批量用户采用异步发送+队列缓冲
  2. 天气数据获取失败

    • 解决方案:配置备用天气API(如心知天气)
    • 代码示例:
      1. public WeatherData getWeatherWithFallback(String city) {
      2. try {
      3. return primaryWeatherService.getWeather(city);
      4. } catch (Exception e) {
      5. return fallbackWeatherService.getWeather(city);
      6. }
      7. }
  3. 模板消息被拒收

    • 常见原因:内容包含敏感词、用户72小时内无互动
    • 解决方案:提前进行内容审核,引导用户主动触发消息

本方案完整实现了从天气数据获取到微信消息推送的完整链路,源码包含详细注释和配置说明。开发者可根据实际需求调整问候语模板、天气显示格式等参数,快速构建个性化的定时消息服务。