来源:https://gitee.com/lxycx_xc/codes/mvesy65pt4lraw3u8x7gc81
模板消息:需要先在微信公众号管理后台申请该功能模板,拿到模板ID和模板上对应的字段
package msg;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.http.client.ClientProtocolException;
import org.apache.log4j.Logger;
import util.RequestPro;
/**
* 一个TemplateMsg对象表示一个模板实例。
* 模板ID相同的情况下,可以重复使用该实例
*
* @author RUNTIME
* 时间:2018年3月13日
*/
public class TemplateMsg {
private static Logger log = Logger.getLogger(TemplateMsg.class);
private String temid;//实例变量 模板ID
public TemplateMsg(String temid){
this.temid = temid;
}
/**
*
* 准备发送模板消息,并返回发送结果 0表示成功 (可重复调用)
* 创建时间:2018年3月14日
*
*/
public Integer send(String openid,String token,TMsg msg){
String json = toJson(temid,openid,msg.getUrl(),msg.getData());
return sendPost(json, token);
}
/**
* 发送模板消息
* 创建时间:2016-12-8
*
*/
private Integer sendPost(String data,String token){
try {
String str = RequestPro.submit("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token, data, null);
JSONObject retjson = JSONObject.fromObject(str);
Integer code = retjson.getInt("errcode");
if(code==40001){//授权信息有误,重新获取token再发送请求;
log.info("发送模板消息:40001 正在获取新的token重新发送");
return null;
}
log.info("发送消息模板返回:"+code+"------json:"+data);
return code;
}catch (IOException e) {
log.error(e.getMessage());
return null;
}
}
/**
* 格式化成json
* 创建时间:2016-12-7
*
*/
public static String toJson(String temid,String openid,String url,Map<String,Map<String,String>> data) {
JSONObject json = new JSONObject();
json.put("touser",openid);
json.put("template_id", temid);
json.put("url",url);
json.put("data", JSONObject.fromObject(data));
return json.toString();
}
/**
* 模板消息内容
* 时间:2018年3月13日
*/
public static class TMsg{
private String url;
private Map<String,Map<String,String>> data = new HashMap<String, Map<String,String>>();
public String getUrl(){
return url;
}
public Map<String,Map<String,String>> getData(){
return data;
}
public TMsg(String url){
this.url = url;
}
/**
* 添加消息节点
* 创建时间:2016-12-7
*/
public TMsg addData(String key,String value,String color){
Map<String,String> values = new HashMap<String, String>();
values.put("value", value);
values.put("color", color);
data.put(key, values);
return this;
}
}
}
客服消息:微信官方规定48小时内用户与公众号有发生交互,才可以发送客服消息
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
package msg;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import util.RequestPro;
/**
* 客服消息
* @author RUNTIME
* 时间:2018年3月14日
*/
public class ServiceMsg {
private static Logger log = Logger.getLogger(ServiceMsg.class);
/**
* 发送客服消息
*/
public static boolean send(String token,String body) {
log.info("发送客服消息:"+body);
try {
String res = RequestPro.submit("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="+token, body, null);
log.info("发送结果:"+res);
JSONObject json = JSONObject.fromObject(res);
if(json.containsKey("errcode")&&json.getInt("errcode")==0){
return true;//发送成功
}
}catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**普通消息转换工具类*/
public static String toSimplJson(String openid, SimplMsg msg) {
JSONObject json = new JSONObject();
json.put("touser", openid);
json.put("msgtype", msg.getMsgtype());
json.put(msg.getMsgtype(), JSONObject.fromObject(msg.getData()));
return json.toString();
}
/**多图文消息转换工具类*/
public static String toNewsJson(String openid, NewsMsg msg){
JSONObject j = new JSONObject();
j.put("articles", JSONArray.fromObject(msg.getData()));
JSONObject json = new JSONObject();
json.put("touser", openid);
json.put("msgtype", msg.getMsgtype());
json.put(msg.getMsgtype(), j);
return json.toString();
}
/**
* 简单的客服消息类
* @author RUNTIME
* 时间:2018年3月14日
*/
public static class SimplMsg{
private String msgtype;
private Map<String,String> data = new HashMap<String,String>();
public Map<String,String> getData(){
return data;
}
public String getMsgtype() {
return msgtype;
}
/**
* 实例化指定类型的消息
* */
public SimplMsg(String msgtype){
this.msgtype = msgtype;
}
/**
* 添加消息内容
*/
public SimplMsg addData(String key,String value){
data.put(key, value);
return this;
}
}
/**
* 多图文客服消息类
* @author RUNTIME
* 时间:2018年3月14日
*/
public static class NewsMsg{
private String msgtype;
private List<Map<String,String>> data = new ArrayList<Map<String,String>>();
public List<Map<String,String>> getData(){
return data;
}
public String getMsgtype() {
return msgtype;
}
/**
* 实例化指定类型的消息
* */
public NewsMsg(){
this.msgtype = "news";
}
/**
* 添加消息内容
*/
public NewsMsg addData(Map<String,String> map){
data.add(map);
return this;
}
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
public class TestMsgs {
public static void main(String[] args) {
serviceMsg();
templateMsg();
}
/**
* 发送模板消息实例
* 创建时间:2018年3月15日
*
*/
public static void templateMsg(){
String temid = "jDPJztxdN3E**************Ut-iDLBljhbw";
String openid = "oYtuCjncfU***********763aZtf2LFQ";
String url = "http://www.baidu.com";
//1.获取token
String token = getToken();
//2.构建消息
TMsg msg = new TMsg(url)
.addData("first", "zfmb_title", "#173177")
.addData("orderProductName", "鲜记环球甄选坚果礼盒", "#173177")
.addData("orderMoneySum", "188.8元", "#173177")
.addData("Remark", "zfmb_remark", "#173177");
//3.实例化指定ID的模板
TemplateMsg temp = new TemplateMsg(temid);
//4.将指定消息发送给指定用户
temp.send(openid,token,msg);
}
/**
* 发送客服消息实例
* 创建时间:2018年3月15日
*
*/
public static void serviceMsg(){
String openid = "oYtuCjncfU***********763aZtf2LFQ";
String token = getToken();
/* 一、发送简单消息*/
SimplMsg sm = new SimplMsg("text").addData("content", "你好!正在测试发送客服文本消息!");
String body = ServiceMsg.toSimplJson(openid, sm);
ServiceMsg.send(token, body);
/* 二、发送多图文消息*/
Map<String,String> m1 = new HashMap<String, String>();
m1.put("title", "标题");
m1.put("description", "描述");
m1.put("url", "http://www.baidu.com");
m1.put("picurl", "http://image.tianjimedia.com/uploadImages/2013/221/I5633H585JC6.jpg");
Map<String,String> m2 = new HashMap<String, String>();
m2.put("title", "标题2");
m2.put("description", "描述2");
m2.put("url", "http://www.baidu.com");
m2.put("picurl", "http://image.tianjimedia.com/uploadImages/2013/221/I5633H585JC6.jpg");
NewsMsg news = new NewsMsg().addData(m1).addData(m2);
ServiceMsg.send(token,ServiceMsg.toNewsJson(openid, news));
}
//----------辅助方法-------------------
/* 获取token(外部调用)*/
public static String getToken(){
//从自己的Token缓存接口获取
return "";
}
}