欢迎来到[自学php网] ①群 AG亚游集团

AG亚游集团 > 网站后台 > 微信开发 >

java开发微信公众平台(二)-- 消息的接收与回复

来源:自学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();
         }  
     }  
post方法 

  用户发过来的消息主要有1 文本消息2 图片消息3 语音消息4 视频消息5小视频消息6 地理位置消息7 链接消息。我们从request中拿到AG亚游集团微信服务器发过来

的数据,由于发过来的是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;
     }
 }
XML解析

  通过上面的过程,我们已经完成了对微信服务器发送过来的数据封装,下面就是根据用户发送过来的消息进行回复,这里主要完成

回复文本消息。我们从之前解析好的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号@版权所有AG亚游集团

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

黄金联赛海口站-也瑟体育队21分打爆晋级决赛 男子华山长空栈道跳崖 景区:初判为轻生 正在搜寻 周强:打虎拍蝇不放松 对腐败犯罪保持高压态势 奇牛国际:欧元区2月通胀疲软 欧央行退出QE速度减慢 台军今日火炮实弹演习被叫停 称与大陆台海军演无关 这些印度人被猴子“盯上了” 有人已被袭击过7次 梅西回归首训备战新赛季!假期回来微微发胖 直击浙江桐庐桥顶垮塌:事发时风雨交加 瓦片吹飞 泰达终结对华夏梦魇!开幕式主队护身符再显灵? 英媒史上最伟大评选费德勒第1 博尔特第3乔丹第4 曼城东家劝说阿森纳传奇:别走 等你接班瓜帅 女子偷标价4000多裤子售卖 尺码不符回店换号被抓
中甲最佳阵容:多米尼克独造3球 延边妖锋神钩领衔 中央巡视工作规划对巡视全覆盖提出更高质量要求 商品期货午盘普跌 有色金属重挫沪锌跌逾4% 10年老彩民揽大乐透2107万:第一次自己选号-票 港媒:在紧急关头 中国寻“芯”现金流向以色列 国务院教育督导委员会组成人员调整 孙春兰任主任 巴尔韦德:梅西无人能比 神准任意球来自练习 Uber创始人要发行1万亿枚数字加密货币 欧冠八强赛程:4月4日看皇马vs尤文 巴萨后登场 日媒:J联赛王者亚冠依旧难求一胜 显示出了意志力 思科从YouTube撤下所有广告 敏感内容频道令其担忧 你的微信公众号姓啥:流水线、纯手工还是半手工?
男子诱惑女孩拍抖音能上热搜 骗至宾馆将其强奸 棋葩说:党毅飞一杆清? 5成棋迷预测柯洁终结农心杯 心疼!穆里奇8年后再战中甲 大四喜到伤退猎豹不再 台当局阻扰台生应聘中行 国台办:扼杀台青年机遇 意杯-皮亚尼奇3角球制导 尤文4-0胜AC米兰夺4连冠 为何多地高温破极值?西太平洋副高强度超常年2倍 坦克大赛哈萨克斯坦队疯狂飙车 炮塔都脱离车体(图) 4万多英国教师罢工 17万中国留学生怎么办? 贸易战趋缓日元遭抛弃 美对俄制裁威力不减卢布重挫 谁帮我杀人我给钱 一万元猪舍建设图片 文科生可以报哪些专业 养20头牛一年赚多少钱 AG亚游集团