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…

7月29日,每日信息差

第一、淘宝天猫计划全面优化运费险策略&#xff0c;与合作伙伴进行多轮磋商&#xff0c;部分新政策有望在今年 9 月试运行。策略调整后&#xff0c;商家将获得更多运费险补贴&#xff0c;降低经营成本 第二、三星电子与全国三星电子工会将于 7 月 29 日下午展开为期三天的薪资…

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

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

密码错误springboot也正常启动了

1 项目背景 在日常开发中&#xff0c;开发有时候拿不到数据库&#xff0c;依赖组件的密码&#xff0c;例如由devops进行配置&#xff0c;甚至放到一些密码管理组件中。这样就会出现密码错误的情况。项目发布成功&#xff0c;那么依赖项例如Mysql, 访问别的系统的ak, sk真的准备…

解决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;实现局…

codeforce(2024年7月29日)B

我的代码 ai比然与bi和bi-1的的二进制含有1的相同&#xff08;有一同一&#xff09; #include <bits/stdc.h>using namespace std; typedef long long ll; typedef double db; typedef long double ldb; typedef pair<int, int> pii; typedef pair<ll, ll>…

redis优化 持久化

redis缓存中间件 nginx web服务器 缓存数据库 php 转发动态请求 tomcat 即是web页面也可以转发动态请求 springboot 自带tomcat redis也是一个数据库&#xff0c;不单单是一个缓存工具。 redis 非关系型数据库 nosql not only sql 不仅仅是sql。 键值对形式 ky value …

【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;这种情…

Postman中API测试的艺术:测试用例复用的高级技巧

Postman中API测试的艺术&#xff1a;测试用例复用的高级技巧 在API测试过程中&#xff0c;复用测试用例可以显著提高测试效率和一致性。Postman作为一个强大的API开发工具&#xff0c;提供了多种机制来实现测试用例的复用。本文将深入探讨Postman中API测试用例复用的技巧&…

开源一个react路由缓存库

Github仓库 背景 产品希望可以像浏览器那样每打开一个路由&#xff0c;会多一个tab&#xff0c;用户可以切换tab访问之前加载过的页面&#xff0c;且不会重新加载。真就产品一句话…… Github上有轮子了吗 Github上开箱即用的轮子是基于react-router-dom V5实现的&#xff…

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、检查…

java解决全排列问题

java解决全排列问题 全排列问题1 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序返回所有不重复的全排列。 思路 我们把问题看成n个排列成一行的空格&#xff0c;从左往右依次填入给定的n个数&#xff0c;每个数只能使用一次&#xff0c;可以使用回溯法。 递归函数…

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

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

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

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