微信订阅号发送模板消息

参考的链接:

微信公众平台测试号——模板消息发送Demo_a816120的博客-CSDN博客

开放接口 | 微信开放文档

微信公众平台

功能一:代码实现发送微信公众平台配置的模板消息

1、事先获取好appID和appsecret

2、书写发送的工具类

package com.talk915.common.templateMsg;import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.talk915.common.redis.RedisUtil;
import com.talk915.model.pojo.WxAccessToken;
import com.talk915.model.pojo.WxOpenIdInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @ClassName : WxTemplateMsgUtil* @Author : cong* @Date : 2021/11/16 17:33* @Description : 微信模板消息工具类*/@Slf4j
public class WxTemplateMsgUtil {/*** @param* @return* @Author LK* @Description 获取accessToken* @Date 2021/7/26 17:36*/public static WxAccessToken getAccessToken() {WxAccessToken cacheInfo = RedisUtil.getWxAccessToken();if(cacheInfo != null){Long expiresIn = cacheInfo.getExpiresIn();if (expiresIn > 150){return cacheInfo;}}//重新请求String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WxTemplateMsgConstant.WX_TEMPLATE_MSG_APP_ID + "&secret=" + WxTemplateMsgConstant.WX_TEMPLATE_MSG_APP_SECRET;String ret = HttpUtil.get(url);if (StringUtils.isBlank(ret)) {return null;}Map<String, Object> map = JSONObject.parseObject(ret, Map.class);String errCode = String.valueOf(map.get("errcode"));if (StringUtils.isNotBlank(errCode) && !"null".equals(errCode)) {String errMsg = String.valueOf(map.get("errmsg"));log.error("微信获取AssessToken失败,错误码:" + errCode + ";错误消息:" + errMsg);return null;}String accessToken = String.valueOf(map.get("access_token"));String expiresIn = String.valueOf(map.get("expires_in"));WxAccessToken wxAccessToken = new WxAccessToken();wxAccessToken.setAccessToken(accessToken);wxAccessToken.setExpiresIn(Long.parseLong(expiresIn));//设置缓存RedisUtil.setWxAccessToken(wxAccessToken);return wxAccessToken;}/*** @param* @return* @Author LK* @Description 模板消息* @Date 2021/7/26 18:37*/public static String sendMsg(TemplateMessage templateMessage) {WxAccessToken accessTokenInfo = getAccessToken();String accessToken = accessTokenInfo.getAccessToken();String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;String paramStr = JSON.toJSONString(templateMessage);String ret = HttpUtil.post(url, paramStr);if (StringUtils.isBlank(ret)) {log.error("微信模板消息推送失败!");return "";}Map<String, Object> retMap = JSONObject.parseObject(ret, Map.class);Integer errCode = (Integer) retMap.get("errcode");if (errCode != 0) {String errMsg = String.valueOf(retMap.get("errmsg"));log.error("微信模板消息推送失败!,错误信息:" + errMsg);return "";}return String.valueOf(retMap.get("msgid"));}}

3、书写模板类

 

package com.talk915.common.templateMsg;import org.springframework.beans.factory.annotation.Value;/*** @ClassName : TemplateMsgContent* @Author : cong* @Date : 2021/11/16 16:54* @Description :*/public class TemplateMsgContent {private static boolean allowSiteEnvironment;//补偿课时通知(测试)public static String CLASS_COMPENSATE_MSG = "ygJSffhiKZOp5BjreTk3GSurJ8vqWticSbzaTEW5Nwc";//课程取消通知(测试)private static String CLASS_CANCEL_MSG = "7L3Zel6GFltH0xrf4-qNxC_wE22f_9t-Yi_-O8hT0xw";/*** @param* @return* @Author cong* @Description 课时补偿通知* @Date 2021/11/11 16:43*/public static TemplateMessage getCompensateClassTime(String compensationNum, String userName, String openId) {First first = new First("亲,您有" + compensationNum + "个课时返还信息!");Keyword[] keywords = new Keyword[2];Keyword keyword1 = new Keyword(compensationNum, "#173177");Keyword keyword2 = new Keyword(userName, "#173177");keywords[0] = keyword1;keywords[1] = keyword2;Remark remark = new Remark("感谢您的支持!");Data data = new Data(first, remark, keywords);return new TemplateMessage(openId, CLASS_COMPENSATE_MSG, data);}/*** @param* @return* @Author cong* @Description 取消课程通知* @Date 2021/11/11 16:43*/public static TemplateMessage getCancelClass(String className, String userName, String reason, String classTime, String openId) {First first = new First("你好,你的课程已被取消!");Keyword[] keywords = new Keyword[4];Keyword keyword1 = new Keyword(className, "#173177");Keyword keyword2 = new Keyword(userName, "#173177");Keyword keyword3 = new Keyword(reason, "#173177");Keyword keyword4 = new Keyword(classTime, "#173177");keywords[0] = keyword1;keywords[1] = keyword2;keywords[2] = keyword3;keywords[3] = keyword4;Remark remark = new Remark("敬请谅解,有疑问请联系管理员!");Data data = new Data(first, remark, keywords);return new TemplateMessage(openId, CLASS_CANCEL_MSG, data);}/*** @param* @return* @Author cong* @Description 正式服的相关配置* @Date 2021/3/20 10:21*/@Value("${allow.site.environment}")private void setAllowSend(boolean allowSiteEnvironment) {TemplateMsgContent.allowSiteEnvironment = allowSiteEnvironment;if (allowSiteEnvironment) {CLASS_COMPENSATE_MSG = "***";CLASS_CANCEL_MSG = "***";}}}
public class First {private String value;private String color;public First (String value){this.value = value;}
}public class Remark {private String value;private String color;public Remark (String value){this.value = value;}
}public class Data {private  First first;private Keyword keyword1;private Keyword keyword2;private Keyword keyword3;private Keyword keyword4;private Remark remark;public Data(First first, Remark remark, Keyword... keyword) {this.first = first;int count = 1;for (Keyword keyword1 : keyword) {if (count == 1) {this.keyword1 = keyword1;} else if (count == 2) {this.keyword2 = keyword1;} else if (count == 3) {this.keyword3 = keyword1;} else if (count == 4) {this.keyword4 = keyword1;}count++;}this.remark = remark;}

功能二:代码实现输入关键字推送对应的内容

1、首先在微信公众平台配置回调地址         url/weChat/check

2、编写接收的接口逻辑

package com.talk915.async.controller.wx;import cn.hutool.crypto.SecureUtil;
import com.talk915.async.service.UserBindService;
import com.talk915.common.templateMsg.AesException;
import com.talk915.common.templateMsg.SHA1;
import com.talk915.common.templateMsg.WxMsgInfo;
import com.talk915.common.templateMsg.WxTemplateMsgConstant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;/*** @ClassName : WeChatController* @Author : cong* @Date : 2021/11/12 14:41* @Description : 微信服务号使用*/
@RestController
@RequestMapping(value = "/weChat")
public class WeChatController {@Autowiredprivate UserBindService userBindService;/*** 微信加密字符串*/private static final String token = "talk915";/*** @param* @return* @Author LK* @Description 接收微信发送数据* @Date 2021/8/12 14:44*/@PostMapping(value = "/check",produces = MediaType.APPLICATION_XML_VALUE)public String wxPostConnect(HttpServletRequest request) {try {Marshaller marshaller;Unmarshaller unmarshal;//解析对象JAXBContext jaxbContext = JAXBContext.newInstance(WxMsgInfo.class);unmarshal = jaxbContext.createUnmarshaller();//xml解码成bean对象WxMsgInfo wxMsgInfo = (WxMsgInfo) unmarshal.unmarshal(request.getInputStream());String event = wxMsgInfo.getEvent();String msgType = wxMsgInfo.getMsgType();//关注用户openIdString fromUserName = wxMsgInfo.getFromUserName();//接收的内容String msg = wxMsgInfo.getContent();//判断 1.关注/取关  2.发送消息 3.找不到相应的就推送客服链接// 判断是否为关注,subscribe(订阅)、unsubscribe(取消订阅)String content = "";if (StringUtils.isNotBlank(event)){//关注boolean isSubscribe = "subscribe".equals(event);//关注或取关boolean subscribe = "subscribe".equals(event) || "unsubscribe".equals(event);//推送默认消息if (isSubscribe) {content = WxTemplateMsgConstant.createTextMsg(1,"");}//添加/编辑 关注/取关记录if (subscribe){userBindService.addOrEditSubscribeStatus(fromUserName,isSubscribe);}} else if (StringUtils.isNotBlank(msgType) && "text".equals(msgType) && WxTemplateMsgConstant.BIND_TEXT.contains(msg)) {content = WxTemplateMsgConstant.createTextMsg(2, SecureUtil.md5(fromUserName + "TaLk#915"));} else if (StringUtils.isNotBlank(msgType) && "text".equals(msgType) && WxTemplateMsgConstant.UN_BIND_TEXT.contains(msg)){content = WxTemplateMsgConstant.createTextMsg(3,"");} else if (StringUtils.isNotBlank(msgType) && "text".equals(msgType) && StringUtils.isNotBlank(WxTemplateMsgConstant.checkUnBindText(msg))){//解除绑定content = userBindService.unBindAccount(WxTemplateMsgConstant.checkUnBindText(msg),fromUserName);} else {content = WxTemplateMsgConstant.createTextMsg(4,"");}WxMsgInfo msgInfo = new WxMsgInfo();msgInfo.setFromUserName(wxMsgInfo.getToUserName());msgInfo.setToUserName(wxMsgInfo.getFromUserName());msgInfo.setCreateTime(new Date().getTime());msgInfo.setMsgType("text");msgInfo.setContent(content);marshaller = jaxbContext.createMarshaller();StringWriter writer = new StringWriter();marshaller.marshal(msgInfo, writer);return writer.toString();} catch (Exception e) {e.printStackTrace();}return "";}
}
package com.talk915.common.templateMsg;import com.talk915.common.pattern.PatternCheckUtil;
import com.talk915.common.util.FileUrlConstant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;import java.util.Arrays;
import java.util.List;/*** @ClassName : WxTemplateMsgConstant* @Author : cong* @Date : 2021/11/10 18:14* @Description : 微信模板信息*/public class WxTemplateMsgConstant {private static boolean allowSiteEnvironment;/*** 测试服appId*/public static String WX_TEMPLATE_MSG_APP_ID = "wx11d4e0f54f0cbbbb";/*** 测试服appSecret*/public static String WX_TEMPLATE_MSG_APP_SECRET = "774b8b69b473fd2b03930f6bfe80010b";/*** 客服地址*/public static final String DEFAULT_CS_LINK = "服务号暂时不支持其他功能,正在完善中!若您有其他问题,您可以咨询 <a href=\"https://platform.usongshu.com/im/index.html#/robot?platformType=0&platformUserId=&platformUserType=7&platformPhone=&platformNickName=&platformTerminalType=1\">在线客服</a>";/*** 账号绑定基础链接*/private static final String  BIND_BASE_URL = FileUrlConstant.getPrefixUrl() + "h5/wxBind?code=";//前缀private static final String BIND_URL_PREFIX = "<a href=\"";//后缀private static final String BIND_URL_SUFFIX = "\">点击完成账号绑定</a>";/*** 账号绑定关键词*/public static final List<String> BIND_TEXT = Arrays.asList("账号绑定","绑定账号","账号关联","关联","上课提醒","绑定","通知");/*** 账号解绑*/public static final List<String> UN_BIND_TEXT = Arrays.asList("账号解绑","解绑账号","解绑");/*** @Author  LK* @Description  创建文本消息* @Date 2021/8/16 10:18* @param* @return*/public static String createTextMsg(int type,String baseContent) {String content = "";switch (type) {//1.关注默认消息case 1://content = "感谢您关注说客英语服务号!目前服务号提供上课提醒功能,回复 绑定账号,根据提示完成账号绑定即可!";content = "感谢您关注说客英语服务号!" +"目前服务号提供课前提醒和上课迟到提醒,回复:绑定,根据提示完成帐号绑定即可接收推送信息." +"如需解绑,回复:解绑_帐号,例如:解绑_12345678901";break;//2.账号绑定case 2:content = BIND_URL_PREFIX + BIND_BASE_URL + baseContent + BIND_URL_SUFFIX;break;//账号解绑case 3:content = "按照如下格式输入您需要解绑的账号即可:解绑_13700000001";break;//其他内容暂时推送客服链接default:content = DEFAULT_CS_LINK;}return content;}/*** @Author  LK* @Description  检测解绑格式* @Date 2021/8/24 18:06* @param* @return*/public static String checkUnBindText(String text){if (StringUtils.isBlank(text)){return "";}boolean contains = text.contains("_");if(!contains){return "";}String[] arr = StringUtils.split(text, "_");if (!arr[0].equals("解绑")){return "";}String account = arr[1];if (StringUtils.isBlank(account)){return "";}boolean checked = PatternCheckUtil.isPhone(account);if (!checked){return "";}return account;}/*** @param* @return* @Author cong* @Description 正式服的相关配置* @Date 2021/3/20 10:21*/@Value("${allow.site.environment}")private void setAllowSend(boolean allowSiteEnvironment) {WxTemplateMsgConstant.allowSiteEnvironment = allowSiteEnvironment;if (allowSiteEnvironment) {WX_TEMPLATE_MSG_APP_ID = "***";WX_TEMPLATE_MSG_APP_SECRET = "***";}}
}

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

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

相关文章

微信公众号订阅消息

1、官网介绍 功能介绍 | 微信开放文档 订阅通知是一个用户主动订阅、服务号按需下发的通知能力。使用过程请遵守《微信公众平台服务协议》《微信公众平台运营规范》。 如有疑问&#xff0c;可在微信开放社区反馈。 设置订阅功能&#xff1a;服务号可以在图文消息、网页等场景…

windows11默认浏览器开启chatGPT—直接拿下

1、进入浏览器扩展设置 https://microsoftedge.microsoft.com/addons/search/Wetab?hlzh-CN 搜索此软件 2、添加到扩展后&#xff0c;打开查看显示 3、注册账号&#xff0c;然后使用即可

为你的Pycharm装一个得力助手(ChatGPT吧)

Pycharm算是我们日常工作中用到的一个非常重要的python工具&#xff0c;如果能为Pycharm安装一个小助手那么我们的办公效率一定可以事半功倍&#xff01;&#xff01; 插件安装 1、点击左上角 file——setting 2、点击Plugins——输入NexChatGpt&#xff0c;安装 即可使用&…

教你如何用Python分析出选注双色球号码

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 数据集介绍 找从19年到现在的开奖历史数据&#xff0c;我们首先要把这个历史数据拿到&#xff0c; 拿到我们再进行做分析&#xff0c;分析每个号码出现的频率是多少&#xff0c; 哪个多&#x…

自己编一个大乐透选号器

新手&#xff0c;最近自己尝试着做了一个体彩大乐透的选号器&#xff0c;感觉挺有意思的&#xff0c;下面分享给大家&#xff01; 具体步骤&#xff1a; 1、新建一个基于对话框的MFC工程。 2、按下图所示添加显示前区号码的5个编辑框&#xff0c;显示后区号码的2个编辑框&am…

彩票号码自选程序

彩票之–超级大乐透选号小程序 是不是每次买彩票的时候&#xff0c;总是不知道选什么号码好呢&#xff1f;今天来看看这个小程序吧! package Thread; import java.util.*; /*超级大乐透选号机*/ public class lottery {public static void main(String[] args) {//因为彩票号…

一种福利彩票辅助选号软件的开发

2021年10月&#xff0c;单位同事邀请几个相熟同事一起买福利彩票&#xff0c;除了以前就知道的双色球外&#xff0c;还介绍了一种快乐8的福彩玩法&#xff0c;看着大家选号绞尽脑汁&#xff0c;加上对快乐8玩法比较感性却&#xff0c;于是一口应承帮忙开发一个辅助选号工具&…

Python——彩票(大乐透)模拟随机选号

终于下手了&#xff0c;每天都路过一家体彩店&#xff0c;从没买过彩票的我今天终于带着好运&#xff08;但愿吧&#xff0c;哈哈哈&#xff09;进入了体彩店&#xff0c;跟老板说要买一个大乐透&#xff0c;老板说加个微信&#xff0c;可以送我一注&#xff0c;不知道咋玩&…

chatgpt赋能python:用Python查看电脑配置的方法

用Python查看电脑配置的方法 在计算机维护和开发过程中&#xff0c;我们常常需要了解电脑的硬件配置情况&#xff0c;比如CPU型号、内存大小、磁盘容量等等。通常我们可以在操作系统中使用系统信息工具查看这些信息&#xff0c;但是当我们需要程序化地获取这些信息&#xff0c…

chatgpt赋能python:使用Python轻松操作电脑,提高效率

使用Python轻松操作电脑&#xff0c;提高效率 随着互联网和电脑技术的飞速发展&#xff0c;电脑已经成为我们日常生活不可或缺的一部分。我们需要用电脑写文档、制作PPT、处理数据等等。但是电脑日常操作可能会耗费我们大量时间和精力&#xff0c;因此&#xff0c;学习使用Pyt…

chatgpt赋能python:Python怎么装TensorFlow,轻松学习人工智能开发!

Python怎么装TensorFlow&#xff0c;轻松学习人工智能开发&#xff01; 如今&#xff0c;人工智能AI已经成为了IT技术领域中的一大热门话题。越来越多的人想要进入人工智能开发这一领域&#xff0c;而Python便成为了其中不可或缺的一部分&#xff0c;Python不仅支持科学计算&a…

chatgpt赋能python:Python跨平台开发的优势和意义

Python跨平台开发的优势和意义 Python是一种易于学习和使用的编程语言&#xff0c;它具有很强的可读性和清晰度&#xff0c;可以满足各种类型的开发需求。Python的跨平台特性使得它成为许多开发者和企业的首选开发工具。在这篇文章中&#xff0c;我们将深入探讨Python跨平台开…

chatgpt赋能python:Python提取文件名的方法及应用

Python提取文件名的方法及应用 在日常生活和工作中&#xff0c;我们都会遇到需要获取文件名的情况&#xff0c;无论是在编写程序时还是在管理电脑文件时&#xff0c;都会用到这个功能。Python是一种非常流行的编程语言&#xff0c;也可以用来进行文件操作。本文将介绍Python中…

chatgpt赋能python:Python控制电脑开机教程

Python控制电脑开机教程 如果你想通过编写Python程序来控制电脑开机&#xff0c;你来到了正确的地方。 Python是一门简单易学&#xff0c;强大多功能的编程语言&#xff0c;可用于各种不同的应用程序。本教程将介绍如何使用Python编写程序来控制电脑开机。 控制电脑开机的工具…

chatgpt赋能python:Python实现人脸检测功能:介绍、技术原理与应用

Python实现人脸检测功能&#xff1a;介绍、技术原理与应用 人脸识别技术在现代社会已经得到广泛应用。Python是一种功能强大的编程语言&#xff0c;在人工智能领域也有广泛的应用。下面&#xff0c;我们将介绍Python在人脸识别领域的应用&#xff0c;为大家带来一些技术原理和…

chatgpt赋能python:【Python应用】如何使用Python进行距离测量

【Python应用】如何使用Python进行距离测量 Python是一种高级编程语言&#xff0c;已成为数据分析、机器学习、Web开发等领域的主要工具。在实际应用中&#xff0c;Python还可以用于测量物体的距离。这篇SEO文章将介绍如何使用Python进行距离测量&#xff0c;并分析测距原理&a…

chatgpt赋能python:Python操作Word:从简单的文档生成到复杂的自动化办公

Python操作Word&#xff1a;从简单的文档生成到复杂的自动化办公 Python是一种高级编程语言&#xff0c;可用于处理各种任务。其中&#xff0c;操作文件是最常见的任务之一。从生成简单的文档到自动化生成复杂的报告和合同&#xff0c;Python是一个很好的选择。本文将介绍Pyth…

chatgpt赋能python:如何用Python黑别人电脑

如何用Python黑别人电脑 介绍 Python作为一种功能强大的编程语言&#xff0c;广泛应用于日常生活中的各个领域。除了它的优点&#xff0c;也存在一些人会利用它做出一些不良行为&#xff0c;如黑别人电脑。在这篇文章中&#xff0c;我们将会介绍如何用Python去黑别人的电脑&a…

【TCN回归预测】基于matlab TCN时间卷积神经网络数据回归预测(多输入单输出)【含Matlab源码 2317期】

⛄一、1 网络结构 1.1 时间卷积神经网络 1.1.1 扩张卷积 针对短时交通流预测等序列任务,需要对前一段时间内的交通流进行建模,不能仅仅依靠上一时刻交通流。而传统全连接神经网络在相邻层之间进行全连接,同一层的不同单元之间没有连接,这样的全连接结构只能学到数据之间的关联…

文字转绘画的AI绘画效果不理想?结合ChatGPT关键词辅助下

​在这个快节奏的新媒体时代&#xff0c;绘画作为一种形式独特、充满趣味的表达方式&#xff0c;已经成为吸引众多网友关注的重要手段。然而&#xff0c;将文字转换成绘画并不是一件轻而易举的事情。尤其是在使用AI绘画技术进行文字转绘画时&#xff0c;很多人发现效果并不尽如…