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 "";
}
}
微信端接收到的消息
RUNTIME / 微信公众号开发—主动向用户发送消息相关推荐
- php 向公众号发送消息,微信公众号之主动给用户发送消息功能
前一段时间项目中遇到一个稍微麻烦一点的问题. 即客户要求,他在后台编辑好文章后要主动给每个用户都发送消息,并可以让用户点击直接进入文章页面. 于是乎,当时脑子一热,想着没什么大的问题,so easy. ...
- 微信公众号开发之接收与发送消息
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 在上一篇博客中已经验证了服务器有效性:https://blog.csdn.net/qq_41782425/article/deta ...
- 【已解决】微信公众号如何主动给用户发消息
目前的教程都是调用"客服消息"接口,其实是个大坑 客服消息的定义: 当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段 ...
- 微信公众号开发——向指定用户发送模板消息
- 微信公众号开发C#系列-7、消息管理-接收事件推送
1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...
- 微信公众号实现跟关注用户进行消息的交互功能(2)实现交互功能
一.解析微信服务器传来的消息 因为微信服务器发送过来的是xml格式的消息,所以我们可以采用 开源框架dom4j去解析xml . 所用到的jar 包是:dom4j-1.6.1.jar 官网下载地址:ht ...
- 使用Python进行微信公众号开发(三)回复消息
写在前面 <使用Python进行微信公众号开发>系列文章将与大家分享如何使用Python一步步搭建微信公众号后台服务器. 效果体验 扫码"是雯子吖"公众号进行体验 配置 ...
- 微信公众号开发--开通测试号及验证消息来自服务器
微信公众号开发--开通测试号及验证消息来自服务器 一.服务器配置 1.开通测试号 2.域名申请(ngrok) 2.1.注册 2.2.下载客户端 二.验证消息来自服务器 一.服务器配置 1.开通测试号 ...
- 微信公众号开发之获取用户地理位置
使用微信的用户地理位置接口就要配置这里. 前端代码: function configWx() {var thisPageUrl = location.href.split('#')[0];$.ajax ...
最新文章
- dst matlab,DSTcode DST跟踪算法MATLAB代码,复杂环境中仿多目标 实现的单 Other systems 其他 272万源代码下载- www.pudn.com...
- python 日期_python日期操作
- a+=b 等价于 a=a+b ?
- 基于知识图谱的问答系统(以医疗行业为例)
- Win32ASM学习[8]: 进制转换的库函数
- 要求做一个从网页上导入excel
- docker存储--理解镜像文件系统aufs/device mapper、主机存储共享、容器间存储共享、分布式存储Flocker
- Shell编程基础(1)
- .NET Hacks Tips
- react-native android 和ios 集成 jpush-react-native 激光推送
- java俄罗斯方块代码_java俄罗斯方块代码.doc
- python调用通达信函数_Funcat 将同花顺、通达信等的公式写法移植到了 Python 中
- 联想笔记本怎么进入pe系统_联想笔记本怎么进入bios设置u盘启动新方法
- html罗马字母怎么打,怎么打罗马数字二 罗马数字 在电脑上怎么打出来呢?
- 2015最好用的PHP开源建站系统
- 移动端测试=== 两个概念 内存泄漏 和 内存溢出 【转】
- win8信息服务器不可用怎么办,Win8打印机出现RPC服务器不可用怎么办?
- 杂谈之Java命名规范与注释
- 用 Python 写一个天天酷跑 | 内附源码
- cesium 入门学习之一:运行cesium,展示3D地球
热门文章
- cocosCreator 控制音乐,音效的图片转换
- 达内C++21天培训视频教程
- 小米手机进行测试uiautomator出现的故障
- 力量搬运术-“势”的妙用
- 关于maven-jar-plugin报红在IDEA中配置Maven时,总是遇到org.apache.maven.plugins:maven-clean-plugin:2.4这样报错。而且一报就是全红
- android webview第三方框架,Android 中使用第三方 WebView,腾讯X5浏览器
- 使用Outlook Mail App滑动操作快速处理邮件
- PR片头模板 3D全息数字扫描大脑后展示logo开场片头PR模板
- RocketMQ吐血整理
- python 通达信上传云端_云端同步的问题-通达信知识 -程序化交易(CXH99.COM)