Java微信二次开发(二) Java微信文本消息接口请求与发送
第二篇,做微信文本消息接口请求与发送,具体内容如下
需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar
第一步:新建包com.wtz.message.response,新建类BaseMessage.java
packagecom.wtz.message.response; /** *@authorwangtianzeQQ:864620012 *@date2017年4月19日下午3:12:40 *version:1.0
*description:基础消息类
*/ publicclassBaseMessage{ //接收方 privateStringToUserName; //发送方 privateStringFromUserName; //消息的创建时间 privatelongCreateTime; //消息类型 privateStringMsgType; publicStringgetToUserName(){ returnToUserName; } publicvoidsetToUserName(StringtoUserName){ ToUserName=toUserName; } publicStringgetFromUserName(){ returnFromUserName; } publicvoidsetFromUserName(StringfromUserName){ FromUserName=fromUserName; } publiclonggetCreateTime(){ returnCreateTime; } publicvoidsetCreateTime(longcreateTime){ CreateTime=createTime; } publicStringgetMsgType(){ returnMsgType; } publicvoidsetMsgType(StringmsgType){ MsgType=msgType; } }
第二步:找到包com.wtz.message.response,新建类TextMessage.java
packagecom.wtz.message.response; /** *@authorwangtianzeQQ:864620012 *@date2017年4月19日下午3:22:33 *version:1.0
*description:文本消息类
*/ publicclassTextMessageextendsBaseMessage{ //消息内容 privateStringContent; publicStringgetContent(){ returnContent; } publicvoidsetContent(Stringcontent){ Content=content; } }
第三步:找到包com.wtz.util,新建类MessageUtil.java
packagecom.wtz.util; importjava.io.IOException; importjava.io.InputStream; importjava.io.Writer; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importjavax.servlet.http.HttpServletRequest; importorg.dom4j.Document; importorg.dom4j.DocumentException; importorg.dom4j.Element; importorg.dom4j.io.SAXReader; importcom.thoughtworks.xstream.XStream; importcom.thoughtworks.xstream.core.util.QuickWriter; importcom.thoughtworks.xstream.io.HierarchicalStreamWriter; importcom.thoughtworks.xstream.io.xml.PrettyPrintWriter; importcom.thoughtworks.xstream.io.xml.XppDriver; importcom.wtz.message.response.TextMessage; /** *@authorwangtianzeQQ:864620012 *@date2017年4月19日下午3:29:58 *version:1.0
*description:消息处理工具类
*/ publicclassMessageUtil{ //定义了消息类型(常量:文本类型) publicstaticfinalStringRESP_MESSAGE_TYPE_TEXT="text"; //从流中解析出每个节点的内容 publicstaticMapparseXml(HttpServletRequestrequest)throwsIOException{ Map map=newHashMap (); //从输入流中获取流对象 InputStreamin=request.getInputStream(); //构建SAX阅读器对象 SAXReaderreader=newSAXReader(); try{ //从流中获得文档对象 Documentdoc=reader.read(in); //获得根节点 Elementroot=doc.getRootElement(); //获取根节点下的所有子节点 List children=root.elements(); for(Elemente:children){ //遍历每一个节点,并按照节点名--节点值放入map中 map.put(e.getName(),e.getText()); System.out.println("用户发送的消息XML解析为:"+e.getName()+e.getText()); } //关闭流 in.close(); in=null; }catch(DocumentExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnmap; } /** *用于扩展节点数据按照 ,中间加了CDATA段 */ privatestaticXStreamxstream=newXStream(newXppDriver(){ publicHierarchicalStreamWritercreateWriter(Writerout){ returnnewPrettyPrintWriter(out){ booleancdata=true; publicvoidstartNode(Stringname,Classclazz){ super.startNode(name,clazz); } protectedvoidwriteText(QuickWriterwriter,Stringtext){ if(cdata){ writer.write(""); }else{ writer.write(text); } } }; } }); /** *将文本消息转换成XML格式 */ publicstaticStringmessageToXml(TextMessagetextMessage){ xstream.alias("xml",textMessage.getClass()); Stringxml=xstream.toXML(textMessage); System.out.println("响应所转换的XML:"+xml); returnxml; } }
第四步:找到包com.wtz.service,新建类ProcessService.java
packagecom.wtz.util; importjava.io.IOException; importjava.util.Date; importjava.util.Map; importjavax.servlet.http.HttpServletRequest; importcom.wtz.message.response.TextMessage; /** *@authorwangtianzeQQ:864620012 *@date2017年4月19日下午8:04:14 *version:1.0
*description:核心服务类
*/ publicclassProcessService{ publicstaticStringdealRequest(HttpServletRequestrequest)throwsIOException{ //响应的XML串 StringrespXml=""; //要响应的文本内容 StringrespContent="未知的消息类型"; MaprequestMap=MessageUtil.parseXml(request); StringfromUserName=requestMap.get("FromUserName"); StringtoUserName=requestMap.get("ToUserName"); StringMsgType=requestMap.get("MsgType"); StringContent=requestMap.get("Content"); System.out.println("用户给公众号发的消息为:"+Content); //构建一条文本消息 TextMessagetextMessage=newTextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(newDate().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); if(MsgType.equals(MessageUtil.RESP_MESSAGE_TYPE_TEXT)){ respContent="王天泽的公众号收到了您的一条文本消息:"+Content+",时间戳是:"+(newDate().getTime()); } textMessage.setContent(respContent); respXml=MessageUtil.messageToXml(textMessage); System.out.println("respXml:"+respXml); returnrespXml; } }
第五步:找到包com.wtz.service下的LoginServlet类,重写doPost方法
packagecom.wtz.service; importjava.io.IOException; importjava.io.PrintWriter; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importcom.wtz.util.MessageUtil; importcom.wtz.util.ProcessService; importcom.wtz.util.ValidationUtil; /** *@authorwangtianzeQQ:864620012 *@date2017年4月17日下午8:11:32 *version:1.0
*description:微信请求验证类
*/ publicclassLoginServletextendsHttpServlet{ @Override protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ System.out.println("get请求。。。。。。"); //1.获得微信签名的加密字符串 Stringsignature=request.getParameter("signature"); //2.获得时间戳信息 Stringtimestamp=request.getParameter("timestamp"); //3.获得随机数 Stringnonce=request.getParameter("nonce"); //4.获得随机字符串 Stringechostr=request.getParameter("echostr"); System.out.println("获得微信签名的加密字符串:"+signature); System.out.println("获得时间戳信息:"+timestamp); System.out.println("获得随机数:"+nonce); System.out.println("获得随机字符串:"+echostr); PrintWriterout=response.getWriter(); //验证请求确认成功原样返回echostr参数内容,则接入生效,成为开发者成功,否则失败 if(ValidationUtil.checkSignature(signature,timestamp,nonce)){ out.print(echostr); } out.close(); out=null; } /** *接受微信服务器发过来的XML数据包(通过post请求发送过来的) */ @Override protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //获取微信加密的签名字符串 Stringsignature=request.getParameter("signature"); //获取时间戳 Stringtimestamp=request.getParameter("timestamp"); //获取随机数 Stringnonce=request.getParameter("nonce"); PrintWriterout=response.getWriter(); if(ValidationUtil.checkSignature(signature,timestamp,nonce)){ StringrespXml=""; try{ respXml=ProcessService.dealRequest(request); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } out.print(respXml); } out.close(); out=null; } }
完成微信文本消息接口请求与发送。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。