来源:自学PHP网 时间:2015-04-14 12:58 作者: 阅读:次
[导读] 前面完成了服务器的对接,这一篇主要是实现各类消息的接收,并封装成map形式,供后面的使用,以及回复文本消息。 前面介绍的服务器的对接是通过get请求,而微信服务器准发过来用...
前面完成了服务器的对接,这一篇主要是实现各类消息的接收,并封装成map形式,供后面的使用,以及回复文本消息。 前面介绍的服务器的对接是通过get请求,而微信服务器准发过来用户的信息则是通过post请求,因此我们的方法要在post中实现。 同样,sae在接收微信服务器发过来消息时仍需要验证消息的可靠性,与上一讲中类似,只不过当验证成功后不是返回echostr,而是对 微信服务器发过来的消息进行解析处理。 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 微信加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); if (SignUtil.checkSignature(signature, timestamp, nonce)) { // 调用核心业务类接收消息、处理消息 String respMessage = null; try { respMessage = processReqest.process(request,response); } catch (Exception e) { e.printStackTrace(); } PrintWriter out = response.getWriter(); out.print(respMessage); out.close(); } } 用户发过来的消息主要有1 文本消息2 图片消息3 语音消息4 视频消息5小视频消息6 地理位置消息7 链接消息。我们从request中拿到微信服务器发过来 的数据,由于发过来的是xml格式的数据(具体的形式,可以查看微信公众平台开发者文档),解析xml方法有很多,这里我们用Dom4j进 行xml的解析,并将解析的结果封装在map集合中。 //从request中拿到xml并封装在map中 public class RequestXML2Map { public static Map parseXml(HttpServletRequest request) throws Exception { Map<String, String> map = new HashMap<String, String>(); // 从request中取得输入流 StringBuffer sb = new StringBuffer(); InputStream is = request.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); BufferedReader br = new BufferedReader(isr); String s = ""; while ((s = br.readLine()) != null) { sb.append(s); } String xml = sb.toString(); // 读取输入流 Document document = null; try { document = DocumentHelper.parseText(xml); } catch (DocumentException e1) { e1.printStackTrace(); } // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List<Element> elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) { // 对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。 map.put(e.getName(), e.getText()); } return map; } } 通过上面的过程,我们已经完成了对微信服务器发送过来的数据封装,下面就是根据用户发送过来的消息进行回复,这里主要完成 回复文本消息。我们从之前解析好的map集合中得到用户发过来消息的类型,根据用户发过来消息的类型做出相应的回复,当然这里只 回复基本的文本消息,以后还会完成其他消息的回复。
public class processReqest { public static String process(HttpServletRequest request,HttpServletResponse response) throws Exception{ @SuppressWarnings("unchecked") Map<String, String> map = RequestXML2Map.parseXml(request); String result = ""; String msgType = map.get("MsgType"); String respContent = ""; //文本消息 if (msgType.equals("text")) { respContent = TulingRobot.robot(map.get("Content")); TextMessage textMessage = Map2Bean.parseText(map,respContent); result = Bean2ResponseXML.textMessageToXml(textMessage); } //图片消息 else if (msgType.equals("image")) { respContent = ""; return null; } //声音消息 else if (msgType.equals("voice")) { respContent = ""; return null; } //视频消息 else if (msgType.equals("video")) { respContent = ""; return null; } //地理位置 else if (msgType.equals("location")) { respContent = ""; return null; } //事件类型 else if (msgType.equals("event")) { String eventType = map.get("Event"); //订阅 if (eventType.equals("subscribe")) { respContent = "欢迎订阅我的公众号!"; TextMessage textMessage = Map2Bean.parseText(map,respContent); result = Bean2ResponseXML.textMessageToXml(textMessage); } //取消订阅 else if (eventType.equals("unsubscribe")) { // TODO return null; } //点击菜单 else if (eventType.equals("CLICK")) { // TODO return null; } } return result; } }
就此我们已经完成了基本的实现,接收用户发过来的消息并对其进行回复,赶快打开微信试一试吧!
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com