前言:最初接触的时候也是一头雾水,微信的接口文档看也看不懂,最后还是百度了一段时间才出来的结果,觉得网上有些文章还是没有说清除如何简单快捷的做出这个模版,所以我自己整理了一下自己写模版的经验,废话不多说,开始!

具体流程: 其实说起来具体流程还是挺简单的,主要就是微信创建好模版后,java代码使用模版id,推送的用户的openid,还有符合推送的对象发送微信一个post就可以了.博主还是菜鸟,所以写的不好的地方多多指教,下面具体解释:

  1. 微信access_token:
    不懂的先去百度下哈,度娘伟大!简单的说就是获取用户信息,等一些高级点的功能都需要用到token如果已经知道怎么获取的或者是项目中自带的小伙伴那就略过吧…这个主要是有效时间2小时,我这里做了一个定时任务自动在过期前重新获取
    appid和appsecret都是创建公众号必须的,这里也不多说.
    我的项目使用的是spring注解,只要在配置文件里面配置:

这边因为上面配过lazy,所以使用的bean类中必须加上@lazy(false)取消懒加载@Scheduled(fixedRate = 6900000L, initialDelay = 1000L)public void getWeChatAccessToken() {String url = "https://api.weixin.qq.com/cgi-bin/token";String result = Http.sendPost(url,"&grant_type=client_credential&appid="+wechatConfig.getAppid()+"&secret="+wechatConfig.getAppSecret());Map<Object, Object> map = JsonUtils.toMap(result);Object o = map.get("access_token");if(o != null && o instanceof String){WeChatJsonController.ACCESS_TOKEN = (String)o;}}
  1. 微信中消息模版的创建:
    这个有点我想说,微信接口文档也太简洁了把,我都怀疑我看错了…=-=
    举个例子:
    你写了个模版
我是标题
你好啊: {{message.DATA}}
内容: {{content.DATA}}

java中传入message=哈哈 content = 我是内容哦!

发送模版后是:

我是标题
你好啊:哈哈
内容:我是内容哦!

简单的说就是想要怎么样的模版就写什么样,最重要的是传的对象需要标记{{XX.DATA}}到时候传什么就显示什么,颜色也是后台代码可以控制

  1. java中模版的写法:
    这里我就写了三个实体类,其实最主要的只是返回的对象和官网接口文档里写的一样:
{"touser":"OPENID",//要推送的用户对应的openid"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",//这个是点击推送消息指向的地址"topcolor":"#FF0000",//感觉这个没什么用"data":{"User": {"value":"黄先生","color":"#173177"},"Date":{"value":"06月07日 19时24分","color":"#173177"}}}

这样就行了,data里面的元素就看你模版写多少{{}}这种元素了
放上我的代码:

这个是ps做的计划图片,跟着图片确定了五个参数:用户名,商城名,时间,订单号,积分,(还有一个订单总积分没写上 =-= )
跟着写模版

下单成功通知:您好,{{userName.DATA}}
感谢您在i商城消费商品
购买时间: {{date.DATA}}
订单号为: {{bh.DATA}}
订单总价{{totalIntegral.DATA}}积分
当前您剩余{{leftIntegral.DATA}}积分

因为我是测试公众号,模版是自己创建的,正式的貌似还可以选择已有的模版

WeChatTemplateDataItem类:这个主要是data里面的每一个元素

package com.thinkgem.jeesite.modules.busi.kehu.entity;import org.apache.commons.lang3.StringUtils;/*** 微信模版消息内容内的元素* * @author Z.Bh**/
public class WeChatTemplateDataItem {private String value;private String color;/*** * @param value 设置值* @param color 对应显示的颜色,不设置默认空字符串*/public WeChatTemplateDataItem(String value,String color){if(!StringUtils.isBlank(value)){this.value = value;}else{this.value = "";}if(!StringUtils.isBlank(color)){this.color = color;}else{this.color = "#173177";}}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}
}

WeChatTemplateMessage类:这个 就是我们需要转成json对象发送的实体类了

package com.thinkgem.jeesite.modules.busi.kehu.entity;import java.util.Map;/*** 微信模版消息* @author Z.Bh**/
public class WeChatTemplateMessage {private String touser;  //要返回给指定用户的openidprivate String template_id; //模版idprivate String url;     //模版点击的urlprivate String topcolor;    //private Map<String, Object> data;       //模版内容public WeChatTemplateMessage(){this.setTopcolor("#FF0000");}public String getTemplate_id() {return template_id;}public void setTemplate_id(String template_id) {this.template_id = template_id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}public String getTopcolor() {return topcolor;}public void setTopcolor(String topcolor) {this.topcolor = topcolor;}public Map<String, Object> getData() {return data;}public void setData(Map<String, Object> data) {this.data = data;}
}

WeChatMessageTemplate类:消息模版类,主要是看业务需求来写对应的模版,额外加上了发送微信的方法

package com.thinkgem.jeesite.modules.busi.kehu.entity;import java.util.HashMap;
import java.util.Map;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSON;
import com.thinkgem.jeesite.common.config.Global;
import com.thinkgem.jeesite.common.utils.Http;
import com.thinkgem.jeesite.common.utils.JsonUtils;
import com.thinkgem.jeesite.modules.busi.JsonInterface.web.WeChatJsonController;/*** 微信模版消息返回类* 模版中,对应的颜色必须默认设置好* * @author Z.Bh**/
public class WeChatMessageTemplate {private static String  SERVERURL = Global.getConfig("serverurl");//我们服务器的地址private static final Logger Log = LoggerFactory.getLogger(WeChatMessageTemplate.class);/*** 下单成功消息模版* @param userName 用户名/昵称* @param date  具体时间(XX年xx月xx日 xx时xx分)* @param bh    订单编号* @param totalIntegral 订单总积分* @param leftIntegral  剩余积分* @param openId    要推送的微信用户的openid* @return*/public static boolean getPlaceAnOrderTemplate(String userName,String mallName, String date, String bh, String totalIntegral,String leftIntegral,String openId) {Map<String, Object> list = new HashMap<String, Object>();list.put("userName", new WeChatTemplateDataItem(userName, "#0fae39"));list.put("mallName", new WeChatTemplateDataItem(mallName, "#0fae39"));list.put("date", new WeChatTemplateDataItem(date, "#323232"));list.put("bh", new WeChatTemplateDataItem(bh, "#323232"));list.put("totalIntegral", new WeChatTemplateDataItem(totalIntegral, "#ae0f0f"));list.put("leftIntegral", new WeChatTemplateDataItem(leftIntegral, "#ae0f0f"));WeChatTemplateMessage template = new WeChatTemplateMessage();template.setTouser(openId);template.setTemplate_id("i9GEaIZdh8WumSBQ-YTlX3jvBRnhtlnzh6Jge38k0HM"); //这个要根据实际使用的模版来设置对应的idtemplate.setUrl(SERVERURL+"/garbageCollection/h5/user/order_detail.html?orderNo=" + bh);template.setData(list);return sendWeChatTemplate(template);//发送并获取结果}/*** 发送微信模版* * @param template*            包含发送对象的openid,template_id,和必须的内容* @return*/public static boolean sendWeChatTemplate(WeChatTemplateMessage template) {boolean success = false;String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";requestUrl = requestUrl.replace("ACCESS_TOKEN",WeChatJsonController.ACCESS_TOKEN);System.out.println("ACCESS_TOKEN: " + WeChatJsonController.ACCESS_TOKEN);String jsonResult = Http.httpsRequest(requestUrl, "POST",JSON.toJSONString(template));if (jsonResult != null) {Map<Object, Object> map = JsonUtils.toMap(jsonResult);Object o = map.get("errcode");if (o != null && o instanceof Integer) {int errorCode = (Integer) o;String errorMessage = (String) map.get("errmsg");if (errorCode != 0) {Log.error("模板消息发送失败: " + errorMessage + "; template_id:"+ template.getTemplate_id());} else {success = true;}}}return success;}
}
  1. 业务中调用:
/**************** 微信公众号消息推送 ******************/String leftIntegral = kehuMap.get("jifen");String mallName = "i商城";String date =new SimpleDateFormat("yyyy年MM月dd日 HH时mm分").format(new Date());String userName = kehuMap.get("nikename");String bh = orderBh;String totalIntegral = totalJifen+"";String openId = kehuMap.get("openid");if(!StringUtils.isBlank(openId)){ //没有openid无法进行推送boolean sendSuccess = WeChatMessageTemplate.getPlaceAnOrderTemplate(userName, mallName, date, bh, totalIntegral, leftIntegral, openId);if(!sendSuccess){System.out.println("微信推送失败!");}}

到这里就大功告成了,最主要的还是微信json串的生成还有数据的发送吧,希望可以帮助到你们,好好干!

这里还要感谢一个博客,发送请求的代码是借鉴过来的,哈哈,很不错

http://blog.csdn.net/walkcode/article/details/78147217

后来才发现,测试公众号这方面自定义很好用,但是实际的公众号如果不想用别人的模板,需要自己申请创建模板,很麻烦的。小伙伴们自己申请体会吧 =-= !

手把手教学java微信公众号模版消息开发相关推荐

  1. Java后端发送微信公众号模版消息自创建公用类

    微信公众号模版消息 肯定很多人都被微信的开放平台折磨,我也一样无一例外,也是根据公司的业务踩的坑,后来花时间研究了几个小时算是搞明白了. 下边不多说直接上详细说明和demo 首先打开微信开发平台 微信 ...

  2. 微信公众号 模版消息 跳转到小程序报错{ errcode: 40013, errmsg: 'invalid appid hint: [cC6RwA09011295]' }

    今天做微信公众号模版消息推送,要求点击模版消息,就直接跳转到小程序里面. 当然,我已经按照官方文档,填写了正确的小程序appid,可是还是报错. { errcode: 40013, errmsg: ' ...

  3. 微信公众号 模板消息开发

    微信公众号 模板消息开发 1. 添加模板 1)登录公众号 2)添加插件 登录之后,在左边栏的功能里面点击[添加功能插件]->[模板消息] 进入后,然后开始审核,大概要1-3天时间.下面为我们正在 ...

  4. Java微信公众号发送消息-保姆级教程附源码

    目录 1. 概念说明: 2. 开发准备: 3. 测试demo(更改配置信息即可使用) 3.1. 服务器配置 3.1.1.配置填写说明 3.1.2.校验服务器有效性: 3.1.3.URL后端接口代码和校 ...

  5. java微信开发图文_java版微信公众号图文消息开发

    1 本篇主要介绍微信公众帐号开发中图文消息的使用 以及图文消息的几种表现形式 图文消息的主要参数说明 通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示: 从图中可以了解到: 1)图 ...

  6. 微信公众号 模版消息详细教程(附代码)

    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等. 如图: 如上图所示,在我们的生活中,无论是微商城消费,还是日常生活消费,都可能收到 ...

  7. java微信公众号图文消息

    https://www.cnblogs.com/sharpest/p/10236842.html

  8. 慕课网_《Java微信公众号开发进阶》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...

  9. 微信公众号Java开发-笔记01【微信公众号介绍、开发环境搭建】

    学习网址:哔哩哔哩网站 微信公众号开发-Java版 微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] 微信公众号Java开发-笔记02[] 微信公众号Java开发-笔记03[] 微信公 ...

最新文章

  1. 乐高机器人教室布置图片大全_全国青少年机器人技术等级考试(上海宝山站)顺利举行...
  2. JavaScript高级day01-AM【WebStrom安装、数据类型分类及判断、数据-内存-变量、引用变量赋值、对象的组成】
  3. 泡面比泡MM好的16个理由
  4. 基于Ajax提交formdata数据、错误信息展示和局部钩子、全局钩子的校验。
  5. javahost:使用虚拟DNS省掉开发环境配置hosts文件
  6. linux centos系统清理垃圾,centos 清理内存缓存
  7. [转载]布谷鸟算法的程序(个人注释)
  8. vue后台管理框架配置vux记录
  9. 在普通用户下进入root用户
  10. osu计算机科学硕士,OSU的CSE「俄亥俄州立大学计算机科学与工程系」
  11. 微端服务器添加文件,微端服务器配置
  12. 高级php工程师需要掌握的知识点
  13. phpmywind目录结构
  14. 数学与计算机学院校友会,忆青春成长路 话数计奋斗情——数学与计算机学院校友会...
  15. python中θ符号怎么打出来_各种符号在键盘上怎么打出来?
  16. [irisctf 2023] rev
  17. K8s-kubectl远程管理集群
  18. 【财务】FMS财务管理系统---对账平台
  19. 苹果+android+扫码支付,苹果iOS12捷径扫码付款怎么设置 微信支付宝扫码二合一支付捷径...
  20. [转]如何修炼成某一领域的高手?

热门文章

  1. Siemens Unigraphics NX (UG NX) 8.0.0.25 正式版简体中文 多国语言版
  2. 蓝牙耳机什么类型好用?双12优质蓝牙耳机盘点
  3. 搭建 本地 远程git 仓库
  4. 隆重推荐kmplayer播放器——我的最爱播放器
  5. eyoucms添加发布内容
  6. 深入RocketMQ-消息原理篇
  7. 超好用的纯C语言矩阵运算库
  8. 什么是netty--通俗易懂
  9. zabbix6 通过脚本监控SSL证书到期时间
  10. 如何删除taskmer.exe进程灰鸽子木马