Springboot集成微信公众号模板通知java

先看效果

1、微信模板消息官方文档

  微信公众平台

2、申请微信公众平台接口测试账号

       微信公众平台

3、创建3个实体

(1)、ConfigBean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** @Configuration 相当于 spring中的 application.xml* 参考文章:https://blog.csdn.net/PotatoWatermelon/article/details/125487951* 解决 'org.springframework.web.client.RestTemplate' that could not be found. 的问题*/
@Configuration
public class ConfigBean {@BeanRestTemplate restTemplate(){return new RestTemplate();}
}

(2)、WeChatTemplate 

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;public class WeChatTemplate {@JsonProperty("touser")private String toUser;@JsonProperty("template_id")private String templateId;private String url;private Map<String,String> miniprogram;private Map<String, Map<String, String>> data = new HashMap<>();public static Map<String, String> initData(String value, String color) {HashMap<String, String> data = new HashMap<String, String>();data.put("value", value);data.put("color", color);return data;}public String getToUser() {return toUser;}public void setToUser(String toUser) {this.toUser = toUser;}public String getTemplateId() {return templateId;}public void setTemplateId(String templateId) {this.templateId = templateId;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Map<String, String> getMiniprogram() {return miniprogram;}public void setMiniprogram(Map<String, String> miniprogram) {this.miniprogram = miniprogram;}public Map<String, Map<String, String>> getData() {return data;}public void setData(Map<String, Map<String, String>> data) {this.data = data;}}

(3)、WeiXinResponse

/*** 参数配置表 WeiXinResponse**/
public class WeiXinResponse
{private Integer errcode;private String errmsg;private Long msgid;public Integer getErrcode() {return errcode;}public void setErrcode(Integer errcode) {this.errcode = errcode;}public String getErrmsg() {return errmsg;}public void setErrmsg(String errmsg) {this.errmsg = errmsg;}public Long getMsgid() {return msgid;}public void setMsgid(Long msgid) {this.msgid = msgid;}
}

4、实现层

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.thirdpart.domain.WeChatTemplate;
import com.ruoyi.thirdpart.domain.WeiXinResponse;
import com.ruoyi.thirdpart.service.IWxOAuthchatService;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;/*** 模板通知 业务层处理*/
@Service
public class WxOAuthServiceImpl implements IWxOAuthchatService
{@Resourceprivate RestTemplate restTemplate;@Overridepublic void sendMessage(String accessToken) throws IOException {WeChatTemplate weChatTemplate = new WeChatTemplate();// 设置模板idweChatTemplate.setTemplateId("5Ag_P7K_C-iPxxxx");// 设置接收用户openId,这里填接收者的openidweChatTemplate.setToUser("owte76Js8Gexxxxxxxx");//点击详情跳转的地址weChatTemplate.setUrl("");/*** 设置模板data参数* {{keyword1.DATA}}*/weChatTemplate.getData().put("time3", WeChatTemplate.initData("2022-10-23 14:23:26","#459ae9"));//申请时间weChatTemplate.getData().put("thing1", WeChatTemplate.initData("张三","#459ae9"));//客户姓名weChatTemplate.getData().put("remark", WeChatTemplate.initData("如遇错误,请往当地社区服务中心进行解决。感谢您的使用!","#383838"));if(accessToken != null){// 发送消息的接口String pust_message_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";//调用微信接口,发送模板消息WeiXinResponse result = restTemplate.postForObject(String.format(pust_message_url, accessToken),weChatTemplate, WeiXinResponse.class);if (result.getErrcode() == 0){;System.out.println("==========成功"+result);}else{System.out.println("==========发送失败");}}else{System.out.println("==========失败");}}/*** 获取getAccessToken* @return*/@Overridepublic String getAccessToken() throws IOException {try {String appid = "xxxxxxx";//填写公众号的appidString secret = "xxxxxxxxxxx";//填写公众号的开发者密码(AppSecret)String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;StringBuilder json = new StringBuilder();URL oracle = new URL(url);URLConnection yc = oracle.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "UTF-8"));String inputLine = null;while ((inputLine = in.readLine()) != null) {json.append(inputLine);}in.close();JSONObject object = (JSONObject) JSONObject.parse(String.valueOf(json));String access_token = object.getString("access_token");if (access_token  != null) {System.out.println("=====access_token========"+access_token+"=============");return access_token;}return null;} catch (Exception e) {//log.error("获取accessToken异常" + e.getMessage());return null;}}
}

参数对应

5、调用层

@Autowiredprivate IWxOAuthchatService wxOAuthServiceImpl;/*** 微信 公众号 模板通知*/@GetMapping("/getAccessToken")public AjaxResult getAccessToken() throws IOException{AjaxResult ajax = AjaxResult.success();String token = wxOAuthServiceImpl.getAccessToken();ajax.put(AjaxResult.DATA_TAG, token);return ajax;}/*** 微信 公众号 模板通知*/@GetMapping("/sendMessage")public AjaxResult sendMessage(HttpServletRequest request) throws IOException{AjaxResult ajax = AjaxResult.success();String token = request.getParameter("token");wxOAuthServiceImpl.sendMessage(token);return ajax;}

 6、其他

import java.io.IOException;/*** 模板通知 业务层* * @author ruoyi*/
public interface IWxOAuthchatService
{void sendMessage(String accessCode) throws IOException;String getAccessToken() throws  IOException;
}

7、实现效果

8、参考文章

https://www.cnblogs.com/guduershi/p/13385293.html

 

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

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

相关文章

python中,jsonpath提取数据的时候出现TypeError: ‘bool‘ object is not subscriptable怎么解决

json格式如下&#xff1a; { success: True, result: { codeInfo: { code: 0, msg: 成功 }, uploadToken: { resId: rzJRpo, endpoint: https://sit-api-ypsx-resource.ypsx-internal.com/r…

stm32入门-----DMA直接存储器存取(上——理论篇)

目录 前言 DMA 1.简介 2.存储器映像 3.DMA结构 4.数据宽度与对齐 5.DMA工作示例 前言 本期我们就开始学习DMA直接存储器存取&#xff0c;DMA是一个数据装运的小助手&#xff0c;执行数据的搬运处理&#xff0c;减少了CPU的负担&#xff0c;在stm32中担当重要的工作。在前…

pypi如何上传自己的代码记录

目录 一. 注册pypi账号并创建token 1. 注册pypi账号并创建token 2. Pypi账号注册 3. 邮箱验证 ​编辑 4. 重新生成恢复代码 5. 输入账号密码 ​编辑 6. 保存code并继续 ​编辑7. 输入一行即可&#xff0c;然后点击verify 8. 点击左方目录内的account setting&#xff…

基于微信小程序的高校排课系统 /基于微信小程序的排课管理系统/课程管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

爱快路由的dns强制客户端代理真是个强大的功能

大致情况是这样的&#xff1a;同事说在linux服务器/etc/resolv.conf上随便写个IP地址【不在线的】&#xff0c;dns地址也能解析&#xff0c;让我帮忙查查。 我看了下也感觉纳闷&#xff0c;试了下不光在服务器上&#xff0c;我本地的pc随便设置了个dns解析也是一样的。 通过wir…

解决Qt6 error: The kit needs to define a CMake tool to parse this project.

cmake对于Qt6来说很重要&#xff0c;所以学会cmake是必须的。 上述错误&#xff0c;就是我在Windows10下运行cmake项目总是报错的一个问题。 明明路径已经配好了&#xff0c;却总是报错。 具体原因可能和cmake的版本&#xff0c;以及是否设置为默认有关。另外也和QtCreator中…

飞凌全志T527开发板实现局域网内文件传输功能

之前玩开发板的时候&#xff0c;如果需要实现主机与开发板之间的文件传输&#xff0c;通常是通过挂载NFS的方式&#xff0c;而飞凌的OKT527板载WIFI&#xff0c;并且官方提供的镜像中已经将其成功驱动&#xff0c;那我们就可以通过WIFI连接家中的路由器的方式&#xff0c;实现局…

【Redis】Centos7 安装 redis(详细教程)

查看当前 Redis 版本&#xff1a; 当前的 redis 版本太老了&#xff0c;选择安装 Redis5。 一、使用 yum 安装 1、首先安装 scl 源 yum install centos-release-scl-rh 由于我之前已经安装过了&#xff0c;所以加载速度比较快&#xff0c;且显示已经安装成功&#xff0c;是最…

MongoDB整合SpringBoot

文章目录 SpringBoot整合MongoDB环境准备文档操作相关注解创建实体添加文档查询文档更新文档删除文档 小技巧&#xff1a;如何去掉_class属性 SpringBoot整合MongoDB https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.nosql.mongodb.repositor…

prompt技巧(2) - 如何解决对话过程中角色反转问题

在一些角色扮演场景下&#xff0c;需要大模型扮演某个角色进行对话&#xff0c;但是在对话过程中偶尔会发生角色反转问题&#xff0c;如大模型扮演客户角色与销售人员进行对话&#xff0c;大模型有时会忘记自己身份&#xff0c;突然以销售人员的身份进行回答&#xff0c;这种情…

ubuntu上部署vue项目到ngixn中+SpringBoot项目+postgresql数据库

文章目录 前提1.Ubuntu上安装ngix2.部署Vue项目2.1上传vue项目2.2.配置 3.Ubuntu上安装Postgres4.部署springboot项目 前提 记一次在ubuntu部署前端vue和后端springboot项目&#xff0c;以及数据库postgresql的安装以及启动、停止等常用的命令。 1.Ubuntu上安装ngix 1、检查…

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台&#xff0c;旨在通过模拟真实的网络环境和攻击场景&#xff0c;提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点&#xff1a; 实战演练&#xff1a; 提供各种网络安全攻防演练场景&#…

yolo模型训练出的.pt文件过大

当我们使用yolov8训练时候&#xff0c;保存的模型变大&#xff0c;如下图&#xff1a; 原模型 训练出来的模型 经过仔细调查&#xff0c;发现是保存的模型中多了很多数据。 原模型 训练出来的模型 只需要把文件中.pt文件读取&#xff0c;重写一遍保存。 from ultralytics im…

深入源码:解析SpotBugs (6)jvm 字节码简介

文章目录 一、JVM字节码概述一、文件结构概述二、详细解析1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表和方法表6. 属性表 字节码Spotbugs 作为一名资深的Java开发工程师&#xff0c;对JVM及其字节码有着深入的理解。现在&#xf…

Linux基于centOS7 【进度条】【Git】【gdb】学习

目录 进度条 进度条的前置准备 sleep &#xff08;秒&#xff09;& usleep&#xff08;微秒&#xff09; sleep加\n和不加\n的区别 IO函数的缓冲区 回车&换行 10秒倒计时 进度条编写 git的使用 为什么要有git&#xff08;git版本控制器&#xff09; git的主要…

江科大/江协科技 STM32学习笔记P13

文章目录 TIM定时中断1、TIM简介计数器PSC预分频器ARR自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz&#xff0c;如果…

业绩增长新引擎:智能名片如何助力销售突破

01、智能名片&#xff0c;营销增长利器 在当今竞争激烈的市场环境下&#xff0c;企业正面临着类似品牌曝光不足、销售线索获取困难、客户关系维护复杂等诸多挑战。为帮助企业解决相关难题&#xff0c;促进业绩高效增长&#xff0c;纷享营销通的 智能名片 应运而生&#xff0…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

DB-gpt + one-api + kimi-free-api 真香

# 1. 新建文件夹 one-api 和 子目录 mkdir -p /docker/one-api/data# 运行容器one-api docker run --name one-api -d --restart always -p 3333:3000 \ -e TZAsia/Shanghai -e REDIS_CONN_STRINGredis://192.168.0.3:6379 -e SYNC_FREQUENCY60 -e SQL_DSNroot:123456tcp(192.1…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…