手把手教学java微信公众号模版消息开发
前言:最初接触的时候也是一头雾水,微信的接口文档看也看不懂,最后还是百度了一段时间才出来的结果,觉得网上有些文章还是没有说清除如何简单快捷的做出这个模版,所以我自己整理了一下自己写模版的经验,废话不多说,开始!
具体流程: 其实说起来具体流程还是挺简单的,主要就是微信创建好模版后,java代码使用模版id,推送的用户的openid,还有符合推送的对象发送微信一个post就可以了.博主还是菜鸟,所以写的不好的地方多多指教,下面具体解释:
- 微信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;
}
}
- 微信中消息模版的创建:
这个有点我想说,微信接口文档也太简洁了把,我都怀疑我看错了…=-=
举个例子:
你写了个模版
我是标题
你好啊: {{message.DATA}}
内容: {{content.DATA}}
java中传入message=哈哈 content = 我是内容哦!
发送模版后是:
我是标题
你好啊:哈哈
内容:我是内容哦!
简单的说就是想要怎么样的模版就写什么样,最重要的是传的对象需要标记{{XX.DATA}}到时候传什么就显示什么,颜色也是后台代码可以控制
- 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; //要返回给指定用户的openid
private String template_id; //模版id
private String url; //模版点击的url
private 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"); //这个要根据实际使用的模版来设置对应的id
template.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;
}
}
- 业务中调用:
/**************** 微信公众号消息推送 ******************/
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串的生成还有数据的发送吧,希望可以帮助到你们,好好干!
这里还要感谢一个博客,发送请求的代码是借鉴过来的,哈哈,很不错
后来才发现,测试公众号这方面自定义很好用,但是实际的公众号如果不想用别人的模板,需要自己申请创建模板,很麻烦的。小伙伴们自己申请体会吧 =-= !