java消息平台_Java微信公众平台之消息管理
Java微信公众平台开发之消息管理,一定要先看下官方文档
微信消息管理分为接收普通消息、接收事件推送、发送消息(被动回复)、客服消息、群发消息、模板消息这几部分
一、接收普通消息
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
关于MsgId,官方给出解释,相当于每个消息ID,关于重试的消息排重,推荐使用msgid排重。微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
比如文本消息的Xml示例
1348831860
1234567890123456
其他的消息去官方文档查看,简单封装如下
消息抽象基类AbstractMsg.java
package com.phil.wechat.msg.model.req;
import java.io.Serializable;
/**
* 基础消息类
*
* @author phil
*
*/
public abstract class AbstractMsg implements Serializable {
private static final long serialVersionUID = -6244277633057415731L;
private String ToUserName; // 开发者微信号
private String FromUserName; // 发送方帐号(一个OpenID)
private String MsgType = SetMsgType(); // 消息类型 例如 /text/image
private long CreateTime; // 消息创建时间 (整型)
private long MsgId; // 消息id,64位整型
/**
* 消息类型
*
* @return
*/
public abstract String SetMsgType();
}
文本消息TextMsg.java
package com.phil.wechat.msg.model.req;
/**
* 文本消息
* @author phil
* @date 2017年6月30日
*
*/
public class TextMsg extends AbstractMsg {
private static final long serialVersionUID = -1764016801417503409L;
private String Content; // 文本消息
@Override
public String SetMsgType() {
return "text";
}
}
其他的依样画葫芦......
二、被动回复用户消息
微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
如果出现“该公众号暂时无法提供服务,请稍后再试”,原因有两个
开发者在5秒内未回复任何内容
开发者回复了异常数据
比如回复的文本消息Xml示例
12345678
简单封装下
回复消息抽象基类RespAbstractMsg.java
package com.phil.wechat.msg.model.resp;
import java.io.Serializable;
/**
* 消息基类(公众帐号 -> 普通用户)
*
* @author phil
*
*/
public abstract class RespAbstractMsg{
// 接收方帐号(收到的OpenID)
private String ToUserName;
// 开发者微信号
private String FromUserName;
// 消息创建时间 (整型)
private long CreateTime;
// 消息类型(text/music/news)
private String MsgType = setMsgType(); // 消息类型
public abstract String setMsgType();
}
回复文本消息RespTextMsg.java
package com.phil.wechat.msg.model.resp;
/**
* 回复图片消息
*
* @author phil
* @data 2017年3月26日
*
*/
public class RespImageMsg extends RespAbstractMsg {
private Image Image;
@Override
public String setMsgType() {
return "image";
}
/**
*
* @author phil
* @date 2017年7月19日
*
*/
public class Image {
// 通过素材管理中的接口上传多媒体文件,得到的id。
private String MediaId;
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
}
}
其他消息类型依样画葫芦......
三、消息的处理
掌握xml解析
package com.phil.wechat.msg.controller;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.DocumentException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.phil.modules.config.WechatConfig;
import com.phil.modules.util.MsgUtil;
import com.phil.modules.util.SignatureUtil;
import com.phil.modules.util.XmlUtil;
import com.phil.wechat.base.controller.BaseController;
import com.phil.wechat.base.result.WechatResult;
import com.phil.wechat.msg.model.req.BasicMsg;
import com.phil.wechat.msg.model.resp.RespAbstractMsg;
import com.phil.wechat.msg.model.resp.RespNewsMsg;
import com.phil.wechat.msg.service.WechatMsgService;
/**
* @author phil
* @date 2017年9月19日
*
*/
@Controller
@RequestMapping("/wechat")
public class WechatMsgController extends BaseController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private WechatMsgService wechatMsgService;
/**
* 校验信息是否是从微信服务器发出,处理消息
* @param out
* @throws IOException
*/
@RequestMapping(value = "/handler", method = { RequestMethod.GET, RequestMethod.POST })
public void processPost() throws Exception {
this.getRequest().setCharacterEncoding("UTF-8");
this.getResponse().setCharacterEncoding("UTF-8");
boolean ispost = Objects.equals("POST", this.getRequest().getMethod().toUpperCase());
if (ispost) {
logger.debug("接入成功,正在处理逻辑");
String respXml = defaultMsgDisPose(this.getRequest().getInputStream());//processRequest(request, response);
if (StringUtils.isNotBlank(respXml)) {
this.getResponse().getWriter().write(respXml);
}
} else {
String signature = this.getRequest().getParameter("signature");
// 时间戳
String timestamp = this.getRequest().getParameter("timestamp");
// 随机数
String nonce = this.getRequest().getParameter("nonce");
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (SignatureUtil.checkSignature(signature, timestamp, nonce)) {
// 随机字符串
String echostr = this.getRequest().getParameter("echostr");
logger.debug("接入成功,echostr {}", echostr);
this.getResponse().getWriter().write(echostr);
}
}
}
/**
* 默认处理方法
* @param input
* @return
* @throws Exception
* @throws DocumentException
*/
private String defaultMsgDisPose(InputStream inputStream) throws Exception {
String result = null;
if (inputStream != null) {
Map params = XmlUtil.parseStreamToMap(inputStream);
if (params != null && params.size() > 0) {
BasicMsg msgInfo = new BasicMsg();
String createTime = params.get("CreateTime");
String msgId = params.get("MsgId");
msgInfo.setCreateTime((createTime != null && !"".equals(createTime)) ? Integer.parseInt(createTime) : 0);
msgInfo.setFromUserName(params.get("FromUserName"));
msgInfo.setMsgId((msgId != null && !"".equals(msgId)) ? Long.parseLong(msgId) : 0);
msgInfo.setToUserName(params.get("ToUserName"));
WechatResult resultObj = coreHandler(msgInfo, params);
if(resultObj == null){ //
return null;
}
boolean success = resultObj.isSuccess(); //如果 为true,则表示返回xml文件, 直接转换即可,否则按类型
if (success) {
result = resultObj.getObject().toString();
} else {
int type = resultObj.getType(); // 这里规定 1 图文消息 否则直接转换
if (type == WechatResult.NEWSMSG) {
RespNewsMsg newsMsg = (RespNewsMsg) resultObj.getObject();
result = MsgUtil.newsMsgToXml(newsMsg);
} else {
RespAbstractMsg basicMsg = (RespAbstractMsg) resultObj.getObject();
result = MsgUtil.msgToXml(basicMsg);
}
}
} else {
result = "msg is wrong";
}
}
return result;
}
/**
* 核心处理
*
* @param msg
* 消息基类
* @param params
* xml 解析出来的 数据
* @return
*/
private WechatResult coreHandler(BasicMsg msg, Map params) {
WechatResult result = null;
String msgType = params.get("MsgType");
if (StringUtils.isEmpty(msgType)) {
switch (msgType) {
case WechatConfig.REQ_MESSAGE_TYPE_TEXT: // 文本消息
result = wechatMsgService.textMsg(msg, params);
break;
case WechatConfig.REQ_MESSAGE_TYPE_IMAGE: // 图片消息
result = wechatMsgService.imageMsg(msg, params);
break;
case WechatConfig.REQ_MESSAGE_TYPE_LINK: // 链接消息
result = wechatMsgService.linkMsg(msg, params);
break;
case WechatConfig.REQ_MESSAGE_TYPE_LOCATION: // 地理位置
result = wechatMsgService.locationMsg(msg, params);
break;
case WechatConfig.REQ_MESSAGE_TYPE_VOICE: // 音频消息
result = wechatMsgService.voiceMsg(msg, params);
break;
case WechatConfig.REQ_MESSAGE_TYPE_SHORTVIDEO: // 短视频消息
result = wechatMsgService.shortvideo(msg, params);
break;
case WechatConfig.REQ_MESSAGE_TYPE_VIDEO: // 视频消息
result = wechatMsgService.videoMsg(msg, params);
break;
case WechatConfig.REQ_MESSAGE_TYPE_EVENT: // 事件消息
String eventType = params.get("Event"); //
if (eventType != null && !"".equals(eventType)) {
switch (eventType) {
case WechatConfig.EVENT_TYPE_SUBSCRIBE:
result = wechatMsgService.subscribe(msg, params);
break;
case WechatConfig.EVENT_TYPE_UNSUBSCRIBE:
result = wechatMsgService.unsubscribe(msg, params);
break;
case WechatConfig.EVENT_TYPE_SCAN:
result = wechatMsgService.scan(msg, params);
break;
case WechatConfig.EVENT_TYPE_LOCATION:
result = wechatMsgService.eventLocation(msg, params);
break;
case WechatConfig.EVENT_TYPE_CLICK:
result = wechatMsgService.eventClick(msg, params);
break;
case WechatConfig.EVENT_TYPE_VIEW:
result = wechatMsgService.eventView(msg, params);
break;
case WechatConfig.KF_CREATE_SESSION:
result = wechatMsgService.kfCreateSession(msg, params);
break;
case WechatConfig.KF_CLOSE_SESSION:
result = wechatMsgService.kfCloseSession(msg, params);
break;
case WechatConfig.KF_SWITCH_SESSION:
result = wechatMsgService.kfSwitchSession(msg, params);
break;
default:
wechatMsgService.eventDefaultReply(msg, params);
break;
}
}
break;
default:
wechatMsgService.defaultMsg(msg, params);
}
}
return result;
}
}
只是提供个思路,如若参考代码请移步
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java消息平台_Java微信公众平台之消息管理相关推荐
- java微信开发平台_Java微信公众平台开发(1) 接入微信公众平台
前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接! (一)接入流程解析 通 ...
- java微信公众号支付开发平台_Java微信公众平台开发之公众号支付(微信内H5调起支付)...
官方文档 准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败) 借鉴了很多大神的文章,在此先谢过了 整个支付流程,看懂就很好写了 一.设置支付目录 在微信公众平台设置您的公众号 ...
- 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备...
相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结. 所以下面给大家分享一下我的经验: 第一部分 介绍微信公众号的一些简单 ...
- 网络架构、云平台和微信公众平台开发接入
云与后端相关的技术似乎并不属于嵌入式和物联智能硬件开发工程师的范畴,但是嵌入式开发工程师有必要认识成熟的网络架构和相关的云技术,以拓展自己在系统架构方面的视野.大数据分析是物联网背后的核心价值,物联智 ...
- 结合百度云平台和微信公众平台开发(二)
距离第一章的入门讲解已经有一段时间了,最近的确没有空,今天我们在上一次的基础上来进行一个扩展,实现天气查询功能,大概就是,我们在手机上想我们的公众账号发送一个消息,比如"weather&qu ...
- 结合百度云平台和微信公众平台进行开发(一)
套话大话我就不说了,网上一大堆,我们就直接进入正题吧,相信对百度云平台和微信公众平台没有了解的也不会关注这篇文章. 上面的标题到底是个什么意思呢?下面让我们一步一步来完成一个测试小项目. 两者是怎样结 ...
- 公众平台 php,微信公众平台PHP开发(转载)
最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的- 今天来分享一下开发经验~ 微信公众平台提供的接口很简单,先看看消息交互流程: 说的通俗一些,用户使用微信发送消息 -> 微信将数据 ...
- 公众平台 php,微信公众平台PHP开发
最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的- 今天来分享一下开发经验~ 微信公众平台提供的接口很简单,先看看消息交互流程: 说的通俗一些,用户使用微信发送消息 -> 微信将数据 ...
- 微信公众平台、微信公众平台.小程序、微信.开放平台三者关系及unionid
以下内容,仅限于根据自己开发以及阅读微信文档总结,错误之处敬请指出,共同进步! 一.微信公众平台.微信公众平台.小程序.微信.开放平台登录地址 项目 微信公众平台 微信公众平台.小程序 微信.开放平台 ...
最新文章
- 【新手向】什么是“框架”?
- 注意!我们熟知的“摩尔定律”被废了...
- qt判断读入的字符串是否含有英文_459. 重复的子字符串
- 手把手教你使用 VuePress 搭建个人博客
- 爬虫第四章 单线程+多任务异步协程
- 李航博士:《统计学习方法》第二版上线啦!增加无监督学习!
- Java 并发和多线程(一) Java并发性和多线程介绍[转]
- 三、Oracle 游标、存储过程、存储函数、触发器
- nginx 反向代理及负载均衡
- matlab仿真之大尺度衰落因子的产生
- Mac程序开机启动项优化
- 模拟cmos集成电路 第二版 razavi
- Navicat Premium15安装与激活(完整激活版)
- c语言计算燃烧温度,f与c温度换算(温度f和c换算计算器)
- 如何用计算机制作pop海报,ai怎么制作pop海报字体?ai简单快速制作pop字体教程
- CRM软件的未来发展趋势
- OpenCV+Python简单实践之硬币检测以及条形码检测
- 5G时代下的光模块:腾讯云计算技术投资5000亿元(附下载)
- 【案例9】sysConfig 中文乱码(方块)
- MySQL千万级别表数据中提高RAND随机查询的实验