SpringBoot 对接微信公众号模板消息通知

效果图见测试结果,有问题评论@

模板消息

开通模板消息功能

登录微信公众平台开通模板消息功能 (未开通时)

在这里插入图片描述

添加模板消息

  1. 审核通过后,登录微信公众平台,点击 广告与服务 --> 模板消息
  2. 公众号如果未设置服务类目,则需要先设置服务类目。
  3. 然后在模板库中挑选合适的模板消息即可,如下图。

在这里插入图片描述

对接开发

模板消息官方文档(建议看完,少走弯路)

引入依赖

参考:https://github.com/Wechat-Group/weixin-java-tools

<!-- 微信框架 -->
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>3.6.0</version>
</dependency>

添加模板消息工具类

在业务类中注入工具类即可
commonSendTemplateMsg公共消息通知发送 模板相同的消息
sendTemplateMsg 发送不同的模板消息,需要在业务类中构建消息内容。

/*** 微信公众号消息通知工具类*/
@Slf4j
@Component
public class WeChatTemplateMsgUtils{@Autowiredprivate WxMpService wxMpService;//公共消息通知public boolean commonSendTemplateMsg(String openId) {//实例化模板对象WxMpTemplateMessage wxMpTemplateMessage = new WxMpTemplateMessage();//设置模板IDwxMpTemplateMessage.setTemplateId(TEMPLATE_ID);//设置详情跳转链接wxMpTemplateMessage.setUrl(WX_TEMPLATE_DETAILS_URL);//设置发送给哪个用户wxMpTemplateMessage.setToUser(openId);//构建消息格式//消息格式自行修改List<WxMpTemplateData> listData = new ArrayList<>();//WxMpTemplateData:key (time4) 对应 模板消息中的关键词 {{time4.DATA}}listData.addAll(Arrays.asList(new WxMpTemplateData("time4",DateUtils.parseDateToStr("yyyy-MM-dd hh:mm:ss",sessionInfo.getBiddingStartTime())),new WxMpTemplateData("time5",DateUtils.parseDateToStr("yyyy-MM-dd hh:mm:ss",sessionInfo.getBiddingEndTime()))));//放进模板对象。准备发送wxMpTemplateMessage.setData(listData);//接收发送模板消息结果,就是msgIdboolean flag = false;try {//发送模板String json = wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage);if (StringUtils.isNotEmpty(json)){flag = true;}} catch (WxErrorException e) {log.error("发送模板消息异常:{}", e.getMessage());}return flag;}/*** 设置所属行业*/public boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException {Boolean flag = wxMpService.getTemplateMsgService().setIndustry(wxMpIndustry);return flag;}/*** 获取设置的行业信息*/public WxMpTemplateIndustry getIndustry() throws WxErrorException {WxMpTemplateIndustry wxMpTemplateIndustry = wxMpService.getTemplateMsgService().getIndustry();return wxMpTemplateIndustry;}/*** 发送模板消息*/public boolean sendTemplateMsg(WxMpTemplateMessage templateMessage) {//标识消息是否发送成功,true 成功,false 失败boolean flag = false;try {// result 为消息idString result = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);if (StringUtils.isNotEmpty(result)){flag = true;}} catch (WxErrorException e) {log.error("发送模板消息异常:{}", e.getMessage());}return flag;}/*** 获得模板ID*/public String addTemplate(String shortTemplateId) throws WxErrorException {String result = wxMpService.getTemplateMsgService().addTemplate(shortTemplateId);return result;}/*** 获得模板列表*/List<WxMpTemplate> getAllPrivateTemplate() throws WxErrorException {List<WxMpTemplate> templateList = wxMpService.getTemplateMsgService().getAllPrivateTemplate();return templateList;}/*** 删除模板* templateId: 公众帐号下模板消息ID*/boolean delPrivateTemplate(String templateId) throws WxErrorException {Boolean flag = wxMpService.getTemplateMsgService().delPrivateTemplate(templateId);return flag;}}

wxMpService 注入为空解决

详情见demo 参考:https://github.com/Wechat-Group/weixin-java-tools
完成下面3步即可。
1、application.yml 添加配置

# 微信公众号配置
wx:mp:configs:- appId: xxx # 公众号appidsecret: xxx # 公众号密钥

2、添加 WxMpProperties 类

@Data
@ConfigurationProperties(prefix = "wx.mp")
public class WxMpProperties {/*** 多个公众号配置信息*/private List<MpConfig> configs;@Datapublic static class MpConfig {/*** 设置微信公众号的appid*/private String appId;/*** 设置微信公众号的app secret*/private String secret;}@Overridepublic String toString() {return JSONUtil.toJsonStr(this);}
}

3、添加 WxMpConfiguration 类

@AllArgsConstructor
@Configuration
@EnableConfigurationProperties(WxMpProperties.class)
public class WxMpConfiguration {private final WxMpProperties properties;@Beanpublic WxMpService wxMpService() {final List<WxMpProperties.MpConfig> configs = this.properties.getConfigs();if (configs == null) {throw new RuntimeException("添加下相关配置,注意别配错了!");}WxMpService service = new WxMpServiceImpl();service.setMultiConfigStorages(configs.stream().map(a -> {WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();;configStorage.setAppId(a.getAppId());configStorage.setSecret(a.getSecret());return configStorage;}).collect(Collectors.toMap(WxMpDefaultConfigImpl::getAppId, a -> a, (o, n) -> o)));return service;}
}

测试结果

手机显示结果

在这里插入图片描述

Postman测试结果

access_token可以从微信公众平台接口调试工具中获取,如下图

若获取不成功,需要在公众号平台IP白名单中添加本机IP地址。
设置与开发 ---> 安全中心 ----> IP白名单

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 中的 cronjob

引言 最近做了一个需求&#xff0c;是定时任务相关的。以前定时任务都是通过 linux crontab 去实现的&#xff0c;现在服务上云(k8s)了&#xff0c;尝试了 k8s 的 CronJob&#xff0c;由于公司提供的是界面化工具&#xff0c;使用、查看起来很不方便。于是有了本文&#xff0c…

【iOS】Cocoapods的安装以及使用

文章目录 前言一、Cocoapods的作用二、安装Cocoapods三、使用Cocoapods总结 前言 最近笔者在仿写天气预报App时用到了api调用数据&#xff0c;一般的基本数据类型我们用Xcode中自带的框架就可以转换得到。但是在和风天气api中的图标的格式为svg格式。 似乎iOS13之后Xcode中可…

mybatis_分页

目的&#xff1a; 减少数据处理量&#xff0c;提高效率 普通sql&#xff1a; 语法&#xff1a;select * from user limit startIndex,pageSize; SELECT * from user limit 3; #[0,n] mybatis_sql: 接口&#xff1a; //分页查询List<User> getUserByLimit(Map<…

如何提高代码效率——时间复杂度与空间复杂度——【C语言】

当我们面对一个问题时&#xff0c;会有许多种解题思路。我们现在的计算机技术已经达到非常先进的地步&#xff0c;所以当我们用不同的方法对待问题时&#xff0c;时间差异不会很明显&#xff0c;内存差异我们一般在平常小问题时感受不到&#xff0c;所以我们不会去纠结程序的优…

JavaEE——Bean的生命周期

目录 1、实例化Bean 2、设置Bean的属性 3、初始化Bean &#xff08;1&#xff09;、执行通知 &#xff08;2&#xff09;、初始化的前置方法 &#xff08;3&#xff09;、初始化方法 &#xff08;4&#xff09;、执行自定义方法 &#xff08;5&#xff09;、初始化的后置…

短视频账号矩阵系统源码开发部署路径

一、短视频批量剪辑的开发逻辑算法 1.视频剪辑之开发算法 自己研发视频剪辑是指通过对视频素材进行剪切、调整、合并等操作&#xff0c;利用后台计算机算法&#xff0c;进行抽帧抽组抽序进行排列以达到对视频内容进行修改和优化的目的。自己研发的视频剪辑工具可以通过后台码…

iOS中的一些锁

多线程在日常开发中能起到性能优化的作用&#xff0c;但是一旦没用好就会造成线程不安全&#xff0c;本文就来讲讲如何保证线程安全 锁 线程安全 当一个线程访问数据的时候&#xff0c;其他的线程不能对其进行访问&#xff0c;直到该线程访问完毕。简单来讲就是在同一时刻&a…

单片机中的通用LED驱动

前言 项目中需要用到很多的LED灯&#xff0c;存在不同的闪烁方式&#xff0c;比如单闪&#xff0c;双闪&#xff0c;快闪&#xff0c;慢闪等等&#xff0c;我需要一个有如下特性的LED驱动 方便的增加不同闪烁模式可以切换闪烁模式增加LED数目不会有太多的改动方便移植&#x…

【C++杂货铺】模板(文末有彩蛋哟)

文章目录 一、泛型编程二、函数模板2.1 函数模板的原理2.2 函数模板的实例化2.3 模板参数的匹配原则 三、类模板四、非类型模板参数五、模板的特化5.1 函数模板特化5.2 类模板特化 六、模板分离编译七、模板总结好书推荐&#x1f381;彩蛋 一、泛型编程 &#x1f4d6;实现一个…

Spring Boot单元测试入门指南

Spring Boot单元测试入门指南 JUnit是一个成熟和广泛应用的Java单元测试框架&#xff0c;它提供了丰富的功能和灵活的扩展机制&#xff0c;可以帮助开发人员编写高质量的单元测试。通过JUnit&#xff0c;开发人员可以更加自信地进行重构、维护和改进代码&#xff0c;同时提高代…

volley 学习笔记1--发送请求

一、概览 Volley 具有以下优势&#xff1a; 自动网络请求调度。 多个并发网络连接。 透明磁盘和具有标准 HTTP 缓存一致性的内存响应缓存。 支持请求优先级。 取消请求 API。您可以取消单个请求&#xff0c;也可以设置要取消的请求的时间段或范围。 可轻松自定义&#xff…

linux下i2c调试神器i2c-tools安装及使用

i2c-tools介绍 在嵌入式linux开发中&#xff0c;有时候需要确认i2c硬件是否正常连接&#xff0c;设备是否正常工作&#xff0c;设备的地址是多少等等&#xff0c;这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools。 i2c-tools是一个专门调试i2c的开源工具&#xff…

Kafka 入门到起飞系列 - 消费者组管理、位移管理

消费者组 - Consumer Group 上文我们已经讲过消费者组了&#xff0c;我们知道消费组的存在可以保证一个主题下一个分区的消息只会被组内一个消费者消费&#xff0c;从而避免了消息的重复消费 什么是消费组 - Consumer Group&#xff1f; 消费者组是Kafka 提供的可扩展且具有容…

事后多重比较方法

一、案例介绍 由单因素方差分析案例中&#xff0c;为研究郁金对低张性缺氧小鼠存活时间的影响&#xff0c;将36只小鼠随机生成A、B以及 C 三组&#xff0c;每组12个&#xff0c;雌雄各半&#xff0c;分别以10g/kg、20g/kg、40g/kg三种不同剂量的郁金灌胃&#xff0c;各组小鼠均…

从原理到实践,分析 Redisson 分布式锁的实现方案(二)

上篇讲解了如何用 Redis 实现分布式锁的方案&#xff0c;它提供了简单的原语来实现基于Redis的分布式锁。然而&#xff0c;Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。 一、Redisson是什么 Redisson是一个基于Redis的分布式Java框架。它提…

信息安全:网络安全体系 与 网络安全模型.

信息安全&#xff1a;网络安全体系 与 网络安全模型. 网络安全保障是一项复杂的系统工程&#xff0c;是安全策略、多种技术、管理方法和人员安全素质的综合。一般而言&#xff0c;网络安全体系是网络安全保障系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规…

抖音seo短视频矩阵系统源代码开发技术分享

抖音SEO短视频矩阵系统是一种通过优化技术&#xff0c;提高在抖音平台上视频的排名和曝光率的系统。以下是开发该系统的技术分享&#xff1a; 熟悉抖音平台的算法 抖音平台的算法是通过分析用户的兴趣爱好和行为习惯&#xff0c;对视频进行排序和推荐。因此&#xff0c;开发人员…

Visitor设计模式访问元素方法的问题

Visitor设计模式访问元素方法的问题 GPT给出的答案寻找灵感前置声明Element层次的实例Visitor interface的声明Element interface的声明Element实际类的声明及实现实现一个Visitor客户端代码 实战测试结果 针对C来说&#xff0c;若要实现Visitor设计模式&#xff0c;则会面临循…

SAP安装笔记

1、准备安装介质&#xff0c;SWPM10SP25&#xff0c;51050829_NW750_JavaExport、SAP_HANA_CLIENT、kernel放到/sapcd/NetWeaver目录下 ​​​​​​​ 进入SWPM10SP25执行./sapinst安装 2、待出现 “Open your browser and paste the following URL address to access the G…

上门家政系统开发|上门预约家政小程序定制系统

随着人们生活水平的提高&#xff0c;对于家政服务的需求也越来越高。上门家政小程序的开发为家政服务商家提供了一个全新的经营和服务渠道。本文将介绍上门家政小程序适合的商家以及其优势。   1. 家政公司   家政公司是最直接受益于上门家政小程序开发的商家。通过开发家政…