RUNTIME / 微信公众号开发—主动向用户发送消息

来源: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 "";

}

}

微信端接收到的消息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值