微信公众号开发处理客户端消息
使用客户端关注公众号并发送消息,你会发现配置成功是在doGet里面,但是处理消息是在doPost。
微信服务端处理客户消息:
1、接受客户消息
2、转发给自定义服务器,但是转发方式为一个xml流。
获取:
ServletInputStream is = request.getInputStream(); byte[] b = new byte[1024]; int len ; StringBuilder sb = new StringBuilder(); while((len = is.read(b)) != -1){ sb.append(new String(b,0,len)); } System.out.println(sb.toString()); } |
<xml> <ToUserName><![CDATA[gh_123cccc6635c]] > </ToUserName>开发者微信号 <FromUserName><![CDATA[oc_ZF52wmsg-N7Oyxj9-l3Z_abcd]]> </FromUserName> 发送方帐号 <CreateTime>1567154787</CreateTime>消息创建时间 (整型) <MsgType><![CDATA[text]]></MsgType>消息类型,文本为text、还有其他,例如视频、音频、图片 <Content><![CDATA[闃挎柉椤縘]> </Content>文本消息内容 <MsgId>22436262916012345</MsgId>消息id,64位整型 </xml> |
这样获取消息虽然可以打印看见,但是对于开发来说并不是这样的xml文件---
所以我们需要将它转化为Map,使之更方便获取相关参数:
1、导入dom4j.jar
//主要用于处理用户消息
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //调用转换方法将xml转化为Map并返回 Map<String,String> map = MyService.parseXML(request.getInputStream()); System.out.println(map); } |
public static Map<String, String> parseXML(InputStream is) { Map<String,String> map = new HashMap<>(); //定义一个xml解析器 SAXReader reder = new SAXReader();
try { //获取xml文件 Document document = reder.read(is); //获取文件根节点 Element root = document.getRootElement(); //获取根节点下所有子元素 List<Element> elements = root.elements(); //遍历List,并将每一个元素装入Map for (Element e : elements) { map.put(e.getName(), e.getStringValue()); } } catch (DocumentException e1) { e1.printStackTrace(); }
return map; } |