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,Map params){ 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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。