微信接口文档地址:模板消息 | 微信开放文档

发送模板消息接口:

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

获取accessToken的接口:

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

发送模板消息的参数说明:

 结果图:

####################################### 代码部分 ############################################

1.首先创建相关实体类:存放AccessToken的类

public class AccessToken {/*** 获取到的凭证*/private String access_token;/*** 凭证有效时间,单位:秒*/private int expires_in;public String getAccess_token() {return access_token;}public void setAccess_token(String access_token) {this.access_token = access_token;}public int getExpires_in() {return expires_in;}public void setExpires_in(int expires_in) {this.expires_in = expires_in;}
}

微信模板类:

/*** Created by yxz on 2018/7/12.** 微信模板类*/
public class WeChatTemplate {/*** 模板id*/private String template_id;/*** 接收者 openId*/private String touser;/*** 模板跳转链接*/private String url;/*** data的数据*/private TreeMap<String, TreeMap<String, String>> data;/*** data 里的数据* @param value :模板参数* @param color :颜色 可选* @return*/public static TreeMap<String, String> item(String value, String color) {TreeMap<String, String> params = new TreeMap<String, String>();params.put("value", value);params.put("color", color);return params;}

}

2.提供方法的service类:

/*** Created by yxz on 2018/7/12.** 微信模板消息*/
@Component
public class WeChatTemplateService {@AutowiredRestTemplate restTemplate;private static Logger logger = LoggerFactory.getLogger(WeChatTemplateService.class);/*** 获取access_token的接口地址*/public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";/**发送模板消息*/public static final String SEND_TEMPLATE_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";/*** 通过APPID 和 APPSECRET* 获取assess_token* @return*/public AccessToken getAccessToken(String appid, String appsecret) {AccessToken accessToken = null;String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);JSONObject jsonObject = restTemplate.getForObject(requestUrl,JSONObject.class);// 如果请求成功if (null != jsonObject) {try {accessToken = new AccessToken();accessToken.setAccess_token(jsonObject.getString("access_token"));accessToken.setExpires_in(jsonObject.getInt("expires_in"));} catch (JSONException e) {accessToken = null;// 获取token失败logger.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}return accessToken;}/*** 发送模板消息* @param accessToken* @param data* @return*/public void sendTemplateMsg(String accessToken, WeChatTemplate data){String jsonString =new Gson().toJson(data.toString());String requestUrl =SEND_TEMPLATE_MESSAGE.replace("ACCESS_TOKEN",accessToken);JSONObject jsonObject = restTemplate.postForObject(requestUrl,jsonString,JSONObject.class);logger.error("jsonObject值:"+jsonObject);if (null != jsonObject) {int errorCode = jsonObject.getInt("errcode");if (0 == errorCode) {logger.info("模板消息发送成功");} else {String errorMsg = jsonObject.getString("errmsg");logger.info("模板消息发送失败,错误是 "+errorCode+",错误信息是"+ errorMsg);}}}}

3.消费者类:(监听activeMq的消息,调用发送模板的方法,发送)

/**** @author yxz* @date 2018/7/13*/
@Component
public class WxTemplateConsumer {Logger logger = LoggerFactory.getLogger(WxTemplateConsumer.class);@AutowiredWeChatTemplateService weChatTemplateService;@Value("${weixin.appid}")public String appId;  //spring读取配置文件@Value("${weixin.appsecret}")public String appsecret;/*** 内网发送模板** @param data* @param data*/@JmsListener(destination = "WxMsg", containerFactory = "outConnectionFactory")public void sendWxTemplate(String data) {sendWxMsg(data);}private void sendWxMsg(String data) {AccessToken access = weChatTemplateService.getAccessToken(appId,appsecret);logger.error("accessToken:" + access.getAccess_token(),"data:" + data);JSONObject jsonObject = (JSONObject) JSONObject.parse(data);//获取openidString touser = null;if (jsonObject.containsKey("touser")){touser= jsonObject.get("touser").toString();}else {logger.error("touser键为空");}//获取template_idString templateId= null;if (jsonObject.containsKey("template_id")){templateId = jsonObject.get("template_id").toString();}else {logger.error("template_id键为空");}//获取模板跳转urlString url =null;if (jsonObject.containsKey("url")){url =jsonObject.get("url").toString();}//获取dataString params =null;if (jsonObject.containsKey("data")){params =jsonObject.get("data").toString();}else {logger.error("data键为空");}JSONObject jsonObjectData =null;String firstValue =null;JSONObject jsonObjectValue1 = null;String value2 =null;String keyword1Value =null;String value3 =null;String value4 =null;String keyword2Value =null;String remarkValue =null;String firstColor =null;String keyword1Color =null;String keyword2Color =null;String remarkColor =null;if (params != null){jsonObjectData = (JSONObject) JSONObject.parse(params);if (jsonObjectData != null){//获取first值String value1 = null;if (jsonObjectData.containsKey("first")){   //判断是否有键,否则会报异常value1=jsonObjectData.get("first").toString();if (value1 != null){JSONObject jsonObjectValue = (JSONObject) JSONObject.parse(value1);if (jsonObjectValue.containsKey("value")){firstValue = jsonObjectValue.get("value").toString();}else {logger.error("first缺少value键");}if (jsonObjectValue.containsKey("color")){firstColor = jsonObjectValue.get("color").toString();}else {logger.error("first缺少color键");}}}else {logger.error("first键为空");}//获取keyword1值if (jsonObjectData.containsKey("keyword1")){value2 = jsonObjectData.get("keyword1").toString();if (value2 != null){jsonObjectValue1 = (JSONObject) JSONObject.parse(value2);if (jsonObjectValue1.containsKey("value")){keyword1Value = jsonObjectValue1.get("value").toString();}else {logger.error("keyword1缺少value键");}if (jsonObjectValue1.containsKey("color")){keyword1Color = jsonObjectValue1.get("color").toString();}else {logger.error("keyword1缺少color键");}}}else {logger.error("keyword1键为空");}//获取keyword2值if (jsonObjectData.containsKey("keyword2")){value3 = jsonObjectData.get("keyword2").toString();if (value3 != null){JSONObject jsonObjectValue2 = (JSONObject) JSONObject.parse(value3);if (jsonObjectValue2.containsKey("value")){keyword2Value = jsonObjectValue2.get("value").toString();}else {logger.error("keyword2缺少value键");}if (jsonObjectValue2.containsKey("color")) {keyword2Color = jsonObjectValue2.get("color").toString();}else {logger.error("keyword2缺少color键");}}}else {logger.error("keyword2键为空");}//获取remark值if (jsonObjectData.containsKey("remark")){value4 = jsonObjectData.get("remark").toString();if (value4 != null){JSONObject jsonObjectValue3 = (JSONObject) JSONObject.parse(value4);if (jsonObjectValue3.containsKey("value")) {remarkValue = jsonObjectValue3.get("value").toString();} else {logger.error("remark缺少value键");}if (jsonObjectValue3.containsKey("color")) {remarkColor = jsonObjectValue3.get("color").toString();}else {logger.error("remark缺少color键");}}}else {logger.error("remark键为空");}}}else {logger.error("参数data为null");}TreeMap<String ,TreeMap<String ,String>> allData =new TreeMap<>();allData.put("first",WeChatTemplate.item(firstValue,firstColor));allData.put("keyword1",WeChatTemplate.item(keyword1Value,keyword1Color));allData.put("keyword2",WeChatTemplate.item(keyword2Value,keyword2Color));allData.put("remark",WeChatTemplate.item(remarkValue,remarkColor));WeChatTemplate template =new WeChatTemplate();if (touser != null){template.setTouser(touser);}else{logger.error("openId为null");}if (templateId != null){template.setTemplate_id(templateId);}else{logger.error("template_id为null");}template.setUrl(url);template.setData(allData);weChatTemplateService.sendTemplateMsg(access.getAccess_token(),template);}}

关于ActiveMq:下载ActiveMq,解压到本地,启动(bin下的32/64位,activemq.bat),浏览器打开localhost:8161进入界面,输入用户名密码。

点击queues,进入发送消息的页面:

 在message body发送消息测试。

java微信模板消息发送功能。activeMq监听消息,返回模板并发送相关推荐

  1. django多任务开启rabbitmq,并进行声明队列、发送、阻塞监听消息

    一,编写rabbitmq基础模块类 1,安装pika模块 pip install pika 这里需要注意的是: pika官网明确说明 pika==0.11.0版本只支持python2.6以前的版本. ...

  2. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

  3. android融云监听消息,关于android:融云-IMkit-拦截或监听所有发送消息

    融云 IMkit 拦挡或监听所有发送音讯 最近集成融云 IMkit 的 SDK, 有一个需要是要监听所有收回去的音讯, 依据音讯类型拦挡或者进行批改. 在官网文档上着了一遍, 都没有找到, 偶尔在看 ...

  4. Android监听消息(一)——应用消息捕获

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为3679字,预计阅读7分钟 前言 上一篇<智能手表接收两台手机消息?最近计划>说了这个计划,将任务也做了拆解,想要备 ...

  5. Android监听消息(二)——电话及短信监听

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为2747字,预计阅读6分钟 前言 前面一篇<Android监听消息(一)--应用消息捕获>我们使用Notificat ...

  6. android通知栏的点击事件,Android监听消息通知栏点击事件

    Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class N ...

  7. php mysql 站内消息_php如何开发网易云信消息抄送功能之聊天室消息保存到本地数据库...

    在开发APP时,需要使用到即时通讯功能.这里选择了网易云信.我们要将开发消息抄送功能,并且将聊天室的消息保存到本地的数据库中.其他的比如P2P聊天消息,群组聊天消息,群组操作,好友操作等消息,我这里就 ...

  8. wp:涅普冬令营(2021) 监听消息

    wp:涅普冬令营(2021) 监听消息 为数不多独立做出来的题,留个纪念 首先,网页下载附件 用wireshark打开 发现里面有很多"user7",结合题目"流量监听& ...

  9. 微信公众号监听手机返回键事件jssdk—wx.closeWindow

    需求场景: 只有扫码初始进入异业联盟活动页,0元券直接弹框领取成功(如图1) 抛出问题: 进入优惠券包后到另一个页面(如图1) 然后按手机返回会回到异业联盟活动页,始终弹出领取活动页面 解决方案: 在 ...

最新文章

  1. 高科技领域零的突破永不嫌多 --- 我看嫦娥四号成功登陆月球背面
  2. 列联表分析程序,以卢淑华书上的例子为例
  3. 商业周刊:Facebook为何价值100亿美元(转)
  4. 难道我的事,又要落空么。。。
  5. 指南--安装带GTK前端的 F-Prot(杀毒)
  6. 蓝桥杯2017初赛-油漆面积-枚举
  7. c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...
  8. 推荐一款 IDEA 神器 ,人工智能帮你写代码,再也不用加班了!!
  9. ios 绘制线框_iOS开发 给View添加指定位置的边框线
  10. 网络-1集线器/交换机/路由器
  11. emacs coding UTF-8 保存报错
  12. python爬虫爬取公众号_Python爬虫案例:爬取微信公众号文章
  13. as几个常用模拟器连接命令
  14. vmware整套实施项目文档(包含vmware安装配置,emc存储安装配置,emc光纤交换配置,...
  15. 短信API接口怎么调用?
  16. mutation和action 区别
  17. 家里的垃圾移动光猫和tp路由器设置
  18. 英语发音规则---E字母常见的发音组合有哪些
  19. 私人浏览黄网算不算违法?
  20. solaris服务器系统,Sun Solaris系统服务器RAID-5数据恢复实例分析

热门文章

  1. 码云新建仓库上传电脑本地代码
  2. vue 页面闪烁的问题_vue项目解决路由跳转页面闪烁问题(过度动画)
  3. 1 python介绍 课前甜点【python3.8入门手册摘录】
  4. Python——tkinter关不掉的表白弹窗
  5. 神经辐射场 (NeRF) 概念
  6. Vue 路由的基本使用
  7. 网络文件系统——NFS
  8. CSS3绘制跳动的橙子动画js特效
  9. 腾达fh450虚拟服务器,腾达(Tenda)FH450路由器上网设置
  10. css减去自身宽度的一半,xHTML / CSS:如何使内部div获得100%的宽度减去另一个div的宽度...