news 2026/5/6 23:53:11

基于 Spring Boot 的项目中使用微信服务号实现订阅通知的发送

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 Spring Boot 的项目中使用微信服务号实现订阅通知的发送

文章目录

    • 1. 准备工作
    • 2. 添加 Maven 依赖
    • 3. 配置文件
    • 4. 创建配置类
    • 5. 发送订阅通知
    • 6. 控制器
      • 6.1. 接收消息 & 获取 OpenID 的 Controller
      • 6.2. 发送订阅通知(使用已保存的 OpenID)
    • 7. 注意事项

上一篇文章介绍的是使用模板消息进行消息的推送,本文使用微信服务号订阅通知来推送消息;因为随着微信的发展,转向使用“订阅通知”是大势所趋。

使用微信服务号的订阅通知功能,可以向用户发送定制化的消息。本文给出 Spring Boot 的完整示例,演示如何在微信服务号中实现订阅通知的发送。

1. 准备工作

  • 公众号类型:确保你使用的是已认证的服务号。
  • 模板申请:你需要先在微信公众平台上为你的服务号申请相应的订阅通知模板,并获取到模板ID。
  • 权限配置:确保你的服务器公网IP已经添加到公众号后台的“IP白名单”中。
  • 依赖库:我们将使用 WxJava (Weixin Java Tools) 来简化开发过程。

2. 添加 Maven 依赖

首先,在你的 pom.xml 文件中加入 WxJava 相关依赖:

<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>4.5.0</version></dependency>

3. 配置文件

在 application.yml 中添加微信公众号的相关配置:

wx:mp:app-id:your_appidsecret:your_secrettoken:your_tokenaes-key:your_aes_key# 如果启用了消息加解密,则需要配置此参数

4. 创建配置类

创建一个配置类来初始化微信服务:

importme.chanjar.weixin.mp.api.WxMpService;importme.chanjar.weixin.mp.api.impl.WxMpServiceImpl;importme.chanjar.weixin.mp.config.WxMpConfigStorage;importme.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassWxMpConfiguration{@Value("${wx.mp.app-id}")privateStringappId;@Value("${wx.mp.secret}")privateStringsecret;@Value("${wx.mp.token}")privateStringtoken;@Value("${wx.mp.aes-key}")privateStringaesKey;@BeanpublicWxMpServicewxMpService(){WxMpServicewxMpService=newWxMpServiceImpl();WxMpDefaultConfigImplconfigStorage=newWxMpDefaultConfigImpl();configStorage.setAppId(appId);configStorage.setSecret(secret);configStorage.setToken(token);configStorage.setAesKey(aesKey);// 如果启用了消息加解密,则需要设置此参数wxMpService.setWxMpConfigStorage(configStorage);returnwxMpService;}}

5. 发送订阅通知

创建一个服务类用于发送订阅通知:

importme.chanjar.weixin.common.error.WxErrorException;importme.chanjar.weixin.mp.api.WxMpService;importme.chanjar.weixin.mp.bean.template.WxMpSubscribeMessage;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassWxMessageService{@AutowiredprivateWxMpServicewxMpService;/** * 发送订阅通知 * @param openid 用户的OpenID * @param templateId 模板ID * @param page 跳转的小程序页面路径 * @param data 消息数据 */publicvoidsendSubscribeMsg(Stringopenid,StringtemplateId,Stringpage,String...data)throwsWxErrorException{WxMpSubscribeMessagemessage=WxMpSubscribeMessage.builder().toUser(openid).templateId(templateId).page(page).build();// 假设模板中有两个数据字段,分别为 "thing1" 和 "time2"message.addData(newWxMpSubscribeMessage.Data("thing1",data[0],"#000000"));message.addData(newWxMpSubscribeMessage.Data("time2",data[1],"#173177"));wxMpService.getMsgService().sendSubscribeMsg(message);}}

6. 控制器

6.1. 接收消息 & 获取 OpenID 的 Controller

@RestController@RequestMapping("/wx/portal")@Slf4jpublicclassWxPortalController{@AutowiredprivateWxMpServicewxMpService;// GET:微信服务器验证 URL@GetMappingpublicStringverifyUrl(@RequestParamStringsignature,@RequestParamStringtimestamp,@RequestParamStringnonce,@RequestParamStringechostr){if(wxMpService.checkSignature(timestamp,nonce,signature)){returnechostr;// 验证成功}return"fail";}// POST:接收用户消息和事件@PostMappingpublicStringhandleMessage(@RequestBodyStringxmlData,@RequestParamStringsignature,@RequestParamStringtimestamp,@RequestParamStringnonce,HttpServletResponseresponse)throwsException{if(!wxMpService.checkSignature(timestamp,nonce,signature)){return"";}WxMpXmlMessageinMessage=WxMpXmlMessage.fromXml(xmlData);Stringopenid=inMessage.getFromUser();// 👈 获取 OpenID!log.info("收到用户消息,OpenID: {}",openid);// 示例:用户发“绑定”,我们就记录他的 OpenIDif("event".equals(inMessage.getMsgType())&&"subscribe".equals(inMessage.getEvent())){// 用户关注事件log.info("新用户关注,OpenID: {}",openid);// TODO: 保存到数据库}elseif("text".equals(inMessage.getMsgType())&&"绑定".equals(inMessage.getContent())){// 用户手动发“绑定”log.info("用户主动绑定,OpenID: {}",openid);// TODO: 保存到数据库}// 自动回复(可选)WxMpXmlOutMessageoutMessage=WxMpXmlOutMessage.TEXT().content("您好!您的OpenID已记录。").fromUser(inMessage.getToUser()).toUser(openid).build();returnoutMessage.toXml();}}

6.2. 发送订阅通知(使用已保存的 OpenID)

创建一个控制器来触发消息发送:

importme.chanjar.weixin.common.error.WxErrorException;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassWxMessageController{@AutowiredprivateWxMessageServicewxMessageService;/** * 触发发送订阅通知 */@GetMapping("/sendMsg")publicStringsendMsg(@RequestParamStringopenid,@RequestParamStringtemplateId,@RequestParamStringpage,@RequestParamStringthing1,@RequestParamStringtime2){try{wxMessageService.sendSubscribeMsg(openid,templateId,page,thing1,time2);return"发送成功";}catch(WxErrorExceptione){e.printStackTrace();return"发送失败:"+e.getError().getErrorMsg();}}}

7. 注意事项

  • 在实际项目中,openid 可以从数据库中查询得到,或者从前端传入。
  • templateId 是你在微信公众平台申请的具体模板的消息ID。
  • 数据字段(如 thing1, time2)应与模板中的字段相匹配。
  • 确保你的服务器能够访问微信接口服务器,并且网络稳定。

通过以上步骤,完成了一个简单的微信服务号订阅通知发送功能。根据业务需求的不同,可以调整和扩展这个基础示例,例如增加更多的消息模板、优化消息发送逻辑等。


“人的一生会经历很多痛苦,但回头想想,都是传奇”。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 0:27:49

开源大模型训练新选择:PyTorch-CUDA-v2.9 GPU环境评测

开源大模型训练新选择&#xff1a;PyTorch-CUDA-v2.9 GPU环境评测 在当前大模型研发如火如荼的背景下&#xff0c;一个稳定、高效、开箱即用的深度学习开发环境&#xff0c;往往能决定实验迭代的速度和团队协作的流畅度。然而&#xff0c;许多开发者仍深陷于“装驱动—配CUDA—…

作者头像 李华
网站建设 2026/5/5 1:53:32

‌游戏测试:功能、性能、兼容性与用户体验的综合剖析

在数字娱乐高速发展的今天&#xff0c;游戏测试已成为软件测试领域的关键分支。作为测试从业者&#xff0c;我们深知一款成功游戏不仅依赖于创意设计&#xff0c;更离不开严谨的测试流程。本文聚焦游戏测试的四大支柱——功能测试、性能测试、兼容性测试和用户体验测试&#xf…

作者头像 李华
网站建设 2026/4/28 3:43:43

PyTorch-CUDA-v2.9镜像助力舆情分析大模型落地

PyTorch-CUDA-v2.9镜像助力舆情分析大模型落地 在智能城市、公共治理与品牌监控日益依赖数据洞察的今天&#xff0c;舆情分析已不再只是“关键词匹配情感词典”的简单规则系统。面对海量社交媒体文本、多模态内容和实时性要求&#xff0c;基于大语言模型的情感识别、事件抽取与…

作者头像 李华
网站建设 2026/4/29 15:09:08

PyTorch-CUDA-v2.9镜像支持联邦学习框架Flower

PyTorch-CUDA-v2.9 镜像集成 Flower&#xff1a;开启高效隐私保护的联邦学习新范式 在医疗影像建模、金融风控联合分析和跨企业AI协作日益频繁的今天&#xff0c;一个核心矛盾始终存在&#xff1a;如何在不共享原始数据的前提下&#xff0c;实现多方协同训练高性能模型&#xf…

作者头像 李华
网站建设 2026/5/5 6:10:18

PyTorch-CUDA-v2.9镜像助力电商推荐系统升级

PyTorch-CUDA-v2.9镜像助力电商推荐系统升级 在电商平台日均流量动辄上亿的今天&#xff0c;用户点击行为数据呈爆炸式增长&#xff0c;如何从海量高维稀疏特征中精准捕捉兴趣偏好&#xff0c;成为提升转化率的关键。传统协同过滤与逻辑回归模型面对复杂的用户-商品交互模式已显…

作者头像 李华
网站建设 2026/5/2 14:05:04

基于SpringBoot的智能家教服务平台【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

作者头像 李华