Java微信公众平台之消息管理
Java微信公众平台开发之消息管理,一定要先看下官方文档
微信消息管理分为接收普通消息、接收事件推送、发送消息(被动回复)、客服消息、群发消息、模板消息这几部分
一、接收普通消息
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
关于MsgId,官方给出解释,相当于每个消息ID,关于重试的消息排重,推荐使用msgid排重。微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
比如文本消息的Xml示例
1348831860 1234567890123456
其他的消息去官方文档查看,简单封装如下
消息抽象基类AbstractMsg.java
packagecom.phil.wechat.msg.model.req;
importjava.io.Serializable;
/**
*基础消息类
*
*@authorphil
*
*/
publicabstractclassAbstractMsgimplementsSerializable{
privatestaticfinallongserialVersionUID=-6244277633057415731L;
privateStringToUserName;//开发者微信号
privateStringFromUserName;//发送方帐号(一个OpenID)
privateStringMsgType=SetMsgType();//消息类型例如/text/image
privatelongCreateTime;//消息创建时间(整型)
privatelongMsgId;//消息id,64位整型
/**
*消息类型
*
*@return
*/
publicabstractStringSetMsgType();
}
文本消息TextMsg.java
packagecom.phil.wechat.msg.model.req;
/**
*文本消息
*@authorphil
*@date2017年6月30日
*
*/
publicclassTextMsgextendsAbstractMsg{
privatestaticfinallongserialVersionUID=-1764016801417503409L;
privateStringContent;//文本消息
@Override
publicStringSetMsgType(){
return"text";
}
}
其他的依样画葫芦......
二、被动回复用户消息
微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
如果出现“该公众号暂时无法提供服务,请稍后再试”,原因有两个
- 开发者在5秒内未回复任何内容
- 开发者回复了异常数据
比如回复的文本消息Xml示例
12345678
简单封装下
回复消息抽象基类RespAbstractMsg.java
packagecom.phil.wechat.msg.model.resp;
importjava.io.Serializable;
/**
*消息基类(公众帐号->普通用户)
*
*@authorphil
*
*/
publicabstractclassRespAbstractMsg{
//接收方帐号(收到的OpenID)
privateStringToUserName;
//开发者微信号
privateStringFromUserName;
//消息创建时间(整型)
privatelongCreateTime;
//消息类型(text/music/news)
privateStringMsgType=setMsgType();//消息类型
publicabstractStringsetMsgType();
}
回复文本消息RespTextMsg.java
packagecom.phil.wechat.msg.model.resp;
/**
*回复图片消息
*
*@authorphil
*@data2017年3月26日
*
*/
publicclassRespImageMsgextendsRespAbstractMsg{
privateImageImage;
@Override
publicStringsetMsgType(){
return"image";
}
/**
*
*@authorphil
*@date2017年7月19日
*
*/
publicclassImage{
//通过素材管理中的接口上传多媒体文件,得到的id。
privateStringMediaId;
publicStringgetMediaId(){
returnMediaId;
}
publicvoidsetMediaId(StringmediaId){
MediaId=mediaId;
}
}
}
其他消息类型依样画葫芦......
三、消息的处理
掌握xml解析
packagecom.phil.wechat.msg.controller;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Map;
importjava.util.Objects;
importorg.apache.commons.lang3.StringUtils;
importorg.dom4j.DocumentException;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importcom.phil.modules.config.WechatConfig;
importcom.phil.modules.util.MsgUtil;
importcom.phil.modules.util.SignatureUtil;
importcom.phil.modules.util.XmlUtil;
importcom.phil.wechat.base.controller.BaseController;
importcom.phil.wechat.base.result.WechatResult;
importcom.phil.wechat.msg.model.req.BasicMsg;
importcom.phil.wechat.msg.model.resp.RespAbstractMsg;
importcom.phil.wechat.msg.model.resp.RespNewsMsg;
importcom.phil.wechat.msg.service.WechatMsgService;
/**
*@authorphil
*@date2017年9月19日
*
*/
@Controller
@RequestMapping("/wechat")
publicclassWechatMsgControllerextendsBaseController{
privateLoggerlogger=LoggerFactory.getLogger(this.getClass());
@Autowired
privateWechatMsgServicewechatMsgService;
/**
*校验信息是否是从微信服务器发出,处理消息
*@paramout
*@throwsIOException
*/
@RequestMapping(value="/handler",method={RequestMethod.GET,RequestMethod.POST})
publicvoidprocessPost()throwsException{
this.getRequest().setCharacterEncoding("UTF-8");
this.getResponse().setCharacterEncoding("UTF-8");
booleanispost=Objects.equals("POST",this.getRequest().getMethod().toUpperCase());
if(ispost){
logger.debug("接入成功,正在处理逻辑");
StringrespXml=defaultMsgDisPose(this.getRequest().getInputStream());//processRequest(request,response);
if(StringUtils.isNotBlank(respXml)){
this.getResponse().getWriter().write(respXml);
}
}else{
Stringsignature=this.getRequest().getParameter("signature");
//时间戳
Stringtimestamp=this.getRequest().getParameter("timestamp");
//随机数
Stringnonce=this.getRequest().getParameter("nonce");
//通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if(SignatureUtil.checkSignature(signature,timestamp,nonce)){
//随机字符串
Stringechostr=this.getRequest().getParameter("echostr");
logger.debug("接入成功,echostr{}",echostr);
this.getResponse().getWriter().write(echostr);
}
}
}
/**
*默认处理方法
*@paraminput
*@return
*@throwsException
*@throwsDocumentException
*/
privateStringdefaultMsgDisPose(InputStreaminputStream)throwsException{
Stringresult=null;
if(inputStream!=null){
Mapparams=XmlUtil.parseStreamToMap(inputStream);
if(params!=null&¶ms.size()>0){
BasicMsgmsgInfo=newBasicMsg();
StringcreateTime=params.get("CreateTime");
StringmsgId=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"));
WechatResultresultObj=coreHandler(msgInfo,params);
if(resultObj==null){//
returnnull;
}
booleansuccess=resultObj.isSuccess();//如果为true,则表示返回xml文件,直接转换即可,否则按类型
if(success){
result=resultObj.getObject().toString();
}else{
inttype=resultObj.getType();//这里规定1图文消息否则直接转换
if(type==WechatResult.NEWSMSG){
RespNewsMsgnewsMsg=(RespNewsMsg)resultObj.getObject();
result=MsgUtil.newsMsgToXml(newsMsg);
}else{
RespAbstractMsgbasicMsg=(RespAbstractMsg)resultObj.getObject();
result=MsgUtil.msgToXml(basicMsg);
}
}
}else{
result="msgiswrong";
}
}
returnresult;
}
/**
*核心处理
*
*@parammsg
*消息基类
*@paramparams
*xml解析出来的数据
*@return
*/
privateWechatResultcoreHandler(BasicMsgmsg,Mapparams){
WechatResultresult=null;
StringmsgType=params.get("MsgType");
if(StringUtils.isEmpty(msgType)){
switch(msgType){
caseWechatConfig.REQ_MESSAGE_TYPE_TEXT://文本消息
result=wechatMsgService.textMsg(msg,params);
break;
caseWechatConfig.REQ_MESSAGE_TYPE_IMAGE://图片消息
result=wechatMsgService.imageMsg(msg,params);
break;
caseWechatConfig.REQ_MESSAGE_TYPE_LINK://链接消息
result=wechatMsgService.linkMsg(msg,params);
break;
caseWechatConfig.REQ_MESSAGE_TYPE_LOCATION://地理位置
result=wechatMsgService.locationMsg(msg,params);
break;
caseWechatConfig.REQ_MESSAGE_TYPE_VOICE://音频消息
result=wechatMsgService.voiceMsg(msg,params);
break;
caseWechatConfig.REQ_MESSAGE_TYPE_SHORTVIDEO://短视频消息
result=wechatMsgService.shortvideo(msg,params);
break;
caseWechatConfig.REQ_MESSAGE_TYPE_VIDEO://视频消息
result=wechatMsgService.videoMsg(msg,params);
break;
caseWechatConfig.REQ_MESSAGE_TYPE_EVENT://事件消息
StringeventType=params.get("Event");//
if(eventType!=null&&!"".equals(eventType)){
switch(eventType){
caseWechatConfig.EVENT_TYPE_SUBSCRIBE:
result=wechatMsgService.subscribe(msg,params);
break;
caseWechatConfig.EVENT_TYPE_UNSUBSCRIBE:
result=wechatMsgService.unsubscribe(msg,params);
break;
caseWechatConfig.EVENT_TYPE_SCAN:
result=wechatMsgService.scan(msg,params);
break;
caseWechatConfig.EVENT_TYPE_LOCATION:
result=wechatMsgService.eventLocation(msg,params);
break;
caseWechatConfig.EVENT_TYPE_CLICK:
result=wechatMsgService.eventClick(msg,params);
break;
caseWechatConfig.EVENT_TYPE_VIEW:
result=wechatMsgService.eventView(msg,params);
break;
caseWechatConfig.KF_CREATE_SESSION:
result=wechatMsgService.kfCreateSession(msg,params);
break;
caseWechatConfig.KF_CLOSE_SESSION:
result=wechatMsgService.kfCloseSession(msg,params);
break;
caseWechatConfig.KF_SWITCH_SESSION:
result=wechatMsgService.kfSwitchSession(msg,params);
break;
default:
wechatMsgService.eventDefaultReply(msg,params);
break;
}
}
break;
default:
wechatMsgService.defaultMsg(msg,params);
}
}
returnresult;
}
}
只是提供个思路,如若参考代码请移步
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。