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

  前面完成了服务器的对接,这一篇主要是实现各类消息的接收,并封装成map形式,供后面的使用,以及回复文本消息。  

  前面介绍的服务器的对接是通过get请求,而微信服务器准发过来用户的信息则是通过post请求,因此我们的方法要在post中实现。

同样,sae在接收微信服务器发过来消息时仍需要验证消息的可靠性,与上一讲中类似,只不过当验证成功后不是返回echostr,而是对

微信服务器发过来的消息进行解析处理。

 1   protected void doPost(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3         request.setCharacterEncoding("UTF-8");
 4         response.setCharacterEncoding("UTF-8");
 5          // 微信加密签名
 6         String signature = request.getParameter("signature");
 7         // 时间戳
 8         String timestamp = request.getParameter("timestamp");
 9         // 随机数
10         String nonce = request.getParameter("nonce");
11         if (SignUtil.checkSignature(signature, timestamp, nonce)) {
12             // 调用核心业务类接收消息、处理消息
13             String respMessage = null;
14             try {
15                 respMessage = processReqest.process(request,response);
16             } catch (Exception e) {
17                 e.printStackTrace();
18             }
19             PrintWriter out = response.getWriter();
20             out.print(respMessage);
21             out.close();
22         }
23     }  

post方法 

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

的数据,由于发过来的是xml格式的数据(具体的形式,可以查看微信公众平台开发者文档),解析xml方法有很多,这里我们用Dom4j进

行xml的解析,并将解析的结果封装在map集合中。

 1 //从request中拿到xml并封装在map中
 2 public class RequestXML2Map {
 3     public static Map parseXml(HttpServletRequest request) throws Exception {
 4         Map<String, String> map = new HashMap<String, String>();
 5         // 从request中取得输入流
 6         StringBuffer sb = new StringBuffer();
 7         InputStream is = request.getInputStream();
 8         InputStreamReader isr = new InputStreamReader(is, "UTF-8");
 9         BufferedReader br = new BufferedReader(isr);
10         String s = "";
11         while ((s = br.readLine()) != null) {
12             sb.append(s);
13         }
14         String xml = sb.toString();
15
16         // 读取输入流
17         Document document = null;
18         try {
19             document = DocumentHelper.parseText(xml);
20         } catch (DocumentException e1) {
21             e1.printStackTrace();
22         }
23         // 得到xml根元素
24         Element root = document.getRootElement();
25         // 得到根元素的所有子节点
26         List<Element> elementList = root.elements();
27         // 遍历所有子节点
28         for (Element e : elementList) {
29             // 对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
30             map.put(e.getName(), e.getText());
31         }
32         return map;
33     }
34 }

XML解析

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

回复文本消息。我们从之前解析好的map集合中得到用户发过来消息的类型,根据用户发过来消息的类型做出相应的回复,当然这里只

回复基本的文本消息,以后还会完成其他消息的回复。

 1 public class processReqest {
 2     public static String process(HttpServletRequest request,HttpServletResponse response) throws Exception{
 3         @SuppressWarnings("unchecked")
 4         Map<String, String> map = RequestXML2Map.parseXml(request);
 5         String result = "";
 6         String msgType = map.get("MsgType");
 7         String respContent = "";
 8         //文本消息
 9         if (msgType.equals("text")) {
10             respContent = TulingRobot.robot(map.get("Content"));
11             TextMessage textMessage = Map2Bean.parseText(map,respContent);
12             result = Bean2ResponseXML.textMessageToXml(textMessage);
13         }
14         //图片消息
15         else if (msgType.equals("image")) {
16             respContent = "";
17             return null;
18         }
19         //声音消息
20         else if (msgType.equals("voice")) {
21             respContent = "";
22             return null;
23         }
24         //视频消息
25         else if (msgType.equals("video")) {
26             respContent = "";
27             return null;
28         }
29         //地理位置
30         else if (msgType.equals("location")) {
31             respContent = "";
32             return null;
33         }
34         //事件类型
35         else if (msgType.equals("event")) {
36             String eventType = map.get("Event");
37             //订阅
38             if (eventType.equals("subscribe")) {
39                 respContent = "欢迎订阅我的公众号!";
40                 TextMessage textMessage = Map2Bean.parseText(map,respContent);
41                 result = Bean2ResponseXML.textMessageToXml(textMessage);
42             }
43             //取消订阅
44             else if (eventType.equals("unsubscribe")) {
45                 // TODO
46                 return null;
47             }
48             //点击菜单
49             else if (eventType.equals("CLICK")) {
50                 // TODO
51                 return null;
52             }
53         }
54         return result;
55     }
56 }

回复文本消息

  就此我们已经完成了基本的实现,接收用户发过来的消息并对其进行回复,赶快打开微信试一试吧!

  

时间: 2024-10-09 03:20:08

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

运用Java对微信公众平台二次开发技术——开发者模式接入

当初我在这碰到了很多问题,市面上以及网络上的资料特别少,所以当初碰了很多壁,所以现在跟大家分享一下,如何用Java,对微信公众平台进行二次开发. 一.开发预备知识: 最基本的JavaSE与JavaWeb知识:JSP/Servlet/JDBC/EL 二.开发环境 Eclipse EE JDK 1.7(用JDK1.8会报错!用JDK1.8会报错!用JDK1.8会报错!用JDK1.8会报错!重要的事情说4遍,当初被坑了,愣是不知道错在哪,检查了无数遍代码,就是不知道哪里错了) 三.注册微信号 http

使用Java语言开发微信公众平台(三)——被关注回复与关键词回复

在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信可提供的消息类型 在上一篇文章中,在我们的Servalet中,我们有这样的一段代码: 我们说这是用于判断接收的消息类型是否为text,即是否为文本消息时,将用户发送的给信息拼接后返回.但这个这个功能现在不足以满足我们的时候,我们将重写代码,实现被关注时自动回复,以及根据关键词自动回复.而首先,我们需要了

使用JAVA开发微信公众平台(一)——环境搭建与开发接入

一. 初始微信公众平台 微信公众平台,即我们平时所说的“公众号”,曾用名“官方平台”.“媒体平台”,但最终命名为“公众平台”.从微信的命名我可以发现,公众平台不只是官方.媒体使用的平台,而是对所有公众都开放的统一平台. 微信公众平台地址:https://mp.weixin.qq.com/ 微信公众平台公分4大板块:订阅号.服务号.小程序.企业号.按照微信2016年公开课规划,企业号后续将与企业微信合并,因此我们主要针对前三部分开始讲解: 简单的对比一下前三者的区别以及本次课程即后续课程的讲解重点

java开发微信公众平台(一)-- 服务器配置

微信公众平台开发好像已经火了很长一段时间,我好像有点后知后觉.但只从了解它后便有点不可收拾之势,脑袋里总想着开发一个自己的公众号,虽然不知道具体做什么. 下面就说说自己这段时间对公众号的学习. 欲善其事,必先利其器.在开发之前先要申请一个公众号,公众号有三种,个人比较容易申请的是订阅号,服务号还要审核,稍微麻烦一点,对于个人开发我建议申请服务号, 因为后面会做自定义菜单的功能.再就是我们需要有一个公网的服务器,这个可以申请sina的sae和百度的bae,个人比较喜欢sina的一点,比较容易上手.

java开发微信公众平台备忘

简单记录下前段时间开发的电子书的 公众平台的一些备忘及开发心得经验等 eclipse的一些技巧: 1.ctrl+shift+o 自动添加必要import空间及移除无用import 项目备忘+说明 1.struts配置 :resources->struts.xml 经验心得: 1.struts在前台显示后台属性:${属性名称},

Delphi XE7 用indy开发微信公众平台(4)- 接收普通消息

接收普通消息 type TMsgType = (event, text, image, voice, video, location, link); TMessage = Record ToUserName: String; FromUserName: String; CreateTime: Integer; MsgType: String; end; uses System.SysUtils, System.JSON, TypInfo, Xml.XMLIntf, Xml.XMLDoc, Act

Delphi XE7 用indy开发微信公众平台(4)- 接收事件推送

接收事件推送 type TEventType = (subscribe, unsubscribe, SCAN, LOCATION, CLICK, VIEW); function ResponseEvent(M: TMessage; X: IXMLDocument): RawByteString; var event: TEventType; temp, menu: String; begin temp := X.DocumentElement.ChildNodes.Nodes['Event'].

[转载]微信公众平台二次开发之自定义菜单接口

原文地址:微信公众平台二次开发之自定义菜单接口作者:糊涂人 今天在SAE上运行代码时出现了一个小问题,所以发一篇博客与大家分享,这也是我第一次写关于技术上的博客,希望大家帮忙顶顶 步骤1. 你要有一个公众号,自己申请,过程略,很简单的. 步骤2. 登陆进去->高级功能,这时候要想开发必须要输入url和token,这里方法我引一下别人的文章http://www.cnblogs.com/txw1958/p/wechat-tutorial.html. 步骤3. 如果上面的工作完成了,这个时候你会在高级

基于java的微信公众号二次开发视频教程

详情请交流  QQ  709639943 00.基于java的微信公众号二次开发视频教程 00.leetcode 算法 面试 00.北风网 零基础到数据(大数据)分析专家-首席分析师 00.快速上手JMeter 00.Jmeter 00.2017年Java web开发工程师成长之路 00.R语言速成实战 00.R语言数据分析实战 00.Python+Django+Ansible Playbook自动化运维项目实战 00.Java深入微服务原理改造房产销售平台 00.Python3入门机器学习 经