您的位置:首页 > 移动开发 > 微信开发

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

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

具体流程: 其实说起来具体流程还是挺简单的,主要就是微信创建好模版后,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"

}

}

}


这样
d293
就行了,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串的生成还有数据的发送吧,希望可以帮助到你们,好好干!

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

http://blog.csdn.net/walkcode/article/details/78147217
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: