zoukankan      html  css  js  c++  java
  • 玩玩微信公众号Java版之二:接收、处理及返回微信消息

    前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~
     
    可以用我们的微信号来直接进行测试,下面先看测试效果图:
     
    这是最基本的文本消息的接收、处理及返回,来看看是怎么实现的吧!
     
    首先可以参考微信消息相关的接口文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
     
    具体实现如下:
    第一步,接收微信发送的文本消息入口:
     
     1 /**
     2      * 处理微信服务器发来的消息
     3      */
     4     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     5     {
     6         // TODO 消息的接收、处理、响应
     7         System.out.println("接口调用了一次");
     8 
     9         String ret = IOUtils.toString(request.getInputStream(), "utf-8").toString();
    10         System.out.println(ret);
    11 
    12         WeChatMsgBL tWeChatMsgBL = new WeChatMsgBL();
    13         String result = tWeChatMsgBL.dealWechatMsg(ret);
    14 
    15         response.setCharacterEncoding("UTF-8");
    16 
    17         // 返回文本消息,将处理结果返回
    18         PrintWriter out = response.getWriter();
    19 
    20         System.out.println(result);
    21 
    22         out.print(result);
    23 
    24         out.close();
    25 
    26     }
    View Code

    可以先输出接收到的xml信息:

     

    第二步,解析及处理接收到数据的内容:

    从微信提供的接口文档上,我们可以发现,不论是文本消息还是语音、图片等消息,在xml报文中,有部分节点信息的一致的,因此可以创建一个父类在处理(变量名要与xml中节点名一致,大小写也一样,这样后面返回消息结果时很方便):
     1 /**
     2  * 微信消息主要类
     3  * @author user
     4  */
     5 public class WechatMsg
     6 {
     7     // 开发者微信号
     8     private String ToUserName = "";
     9 
    10     // 发送方帐号(一个OpenID)
    11     private String FromUserName = "";
    12 
    13     // 消息创建时间 (整型)
    14     private String CreateTime = "";
    15 
    16     // 消息类型
    17     private String MsgType = "";
    18 
    19     // 消息id,64位整型
    20     private String MsgId = "";
    21 
    22     public String getToUserName()
    23     {
    24         return ToUserName;
    25     }
    26 
    27     public void setToUserName(String toUserName)
    28     {
    29         ToUserName = toUserName;
    30     }
    31 
    32     public String getFromUserName()
    33     {
    34         return FromUserName;
    35     }
    36 
    37     public void setFromUserName(String fromUserName)
    38     {
    39         FromUserName = fromUserName;
    40     }
    41 
    42     public String getCreateTime()
    43     {
    44         return CreateTime;
    45     }
    46 
    47     public void setCreateTime(String createTime)
    48     {
    49         CreateTime = createTime;
    50     }
    51 
    52     public String getMsgType()
    53     {
    54         return MsgType;
    55     }
    56 
    57     public void setMsgType(String msgType)
    58     {
    59         MsgType = msgType;
    60     }
    61 
    62     public String getMsgId()
    63     {
    64         return MsgId;
    65     }
    66 
    67     public void setMsgId(String msgId)
    68     {
    69         MsgId = msgId;
    70     }
    71 
    72 
    73 
    74 }
    View Code

    然后对应的基本信息子类为(只用多一个变量):
     1 /**
     2  * 普通消息类
     3  * @author Damon
     4  */
     5 public class WechatTextMsg extends WechatMsg
     6 {
     7 
     8     // 文本内容
     9     private String Content = "";
    10 
    11     public String getContent()
    12     {
    13         return Content;
    14     }
    15 
    16     public void setContent(String content)
    17     {
    18         this.Content = content;
    19     }
    20 }
    View Code
    下面来看具体的处理,涉及新增jar包:dom4j-1.6.1.jar  
     1     /**
     2      * 处理微信信息
     3      * @param reqInfo xml信息数据
     4      * @return 处理结果
     5      */
     6     public String dealWechatMsg(String reqInfo)
     7     {
     8 
     9         String ret = reqInfo;
    10 
    11         String result = "";
    12 
    13         WechatTextMsg tReturnMsg = new WechatTextMsg();
    14 
    15         try
    16         {
    17             Document returndoc = DocumentHelper.parseText(ret);
    18 
    19             Element rootElement = returndoc.getRootElement();
    20 
    21             String tMsgType = rootElement.elementText("MsgType");
    22 
    23             // 根据MsgType 返回具体的消息类
    24 
    25             if (SysCon.TEXT_MSG_TYPE.equals(tMsgType))
    26             {
    27                 result = dealTextMsg(rootElement);
    28             }
    29 
    30             // 封装返回信息
    31             tReturnMsg.setCreateTime(new Date().getTime() + "");
    32             tReturnMsg.setToUserName(rootElement.elementText("FromUserName"));
    33             tReturnMsg.setFromUserName(rootElement.elementText("ToUserName"));
    34             tReturnMsg.setContent(result);
    35             tReturnMsg.setMsgType(SysCon.TEXT_MSG_TYPE);
    36             // 将返回结果封装成文本消息
    37             result = WeChatUtil.textToXML(tReturnMsg);
    38         }
    39         catch (DocumentException e)
    40         {
    41             // TODO Auto-generated catch block
    42             e.printStackTrace();
    43         }
    44 
    45         return result;
    46     }
    47 
    48     /**
    49      * 处理文本消息
    50      * @param msg
    51      * @return
    52      */
    53     private String dealTextMsg(Element rootElement)
    54     {
    55 
    56         WechatTextMsg tWechatTextMsg = new WechatTextMsg();
    57         // 依次赋值
    58         tWechatTextMsg.setCreateTime(rootElement.elementText("CreateTime"));
    59         tWechatTextMsg.setFromUserName(rootElement.elementText("FromUserName"));
    60         tWechatTextMsg.setToUserName(rootElement.elementText("ToUserName"));
    61         tWechatTextMsg.setMsgType(rootElement.elementText("MsgType"));
    62         tWechatTextMsg.setMsgId(rootElement.elementText("MsgId"));
    63         tWechatTextMsg.setContent(rootElement.elementText("Content"));
    64 
    65         System.out.println("传入的消息是:" + tWechatTextMsg.getContent());
    66 
    67         // 后续可处理保存到数据库及数据分析等,现在直接返回结果
    68 
    69         // 将数据转存至数据库
    70         // Connection conn = DBConnPool.getConnection();
    71 
    72         return "传入的文本消息处理完毕";
    73     }
    View Code

    其中对于参数类型判断,可以在SysCon类中添加基本参数
     
    1     // 定义微信消息类型--文本
    2     public static final String TEXT_MSG_TYPE = "text";
    View Code
    第三步,处理消息的返回
    消息处理完成后,返回文本(可返回不同类型,仅以文本为例)处理结果
    这里用到了工具类中 的方法如下:
     1     /**
     2      * 将对象转为XML输出
     3      * @param textMsg
     4      * @return
     5      */
     6     public static String textToXML(WechatTextMsg textMsg)
     7     {
     8         xstream.alias("xml", textMsg.getClass());
     9         return xstream.toXML(textMsg);
    10 
    11     }
    12 
    13     
    14     /**
    15      * 扩展xstream使其支持CDATA
    16      */
    17     private static XStream xstream = new XStream(new XppDriver()
    18     {
    19         public HierarchicalStreamWriter createWriter(Writer out)
    20         {
    21             return new PrettyPrintWriter(out)
    22             {
    23                 // 对所有xml节点的转换都增加CDATA标记
    24                 boolean cdata = true;
    25 
    26                 @SuppressWarnings("unchecked")
    27                 public void startNode(String name, Class clazz)
    28                 {
    29                     super.startNode(name, clazz);
    30                 }
    31 
    32                 protected void writeText(QuickWriter writer, String text)
    33                 {
    34                     if (cdata)
    35                     {
    36                         writer.write("<![CDATA[");
    37                         writer.write(text);
    38                         writer.write("]]>");
    39                     }
    40                     else
    41                     {
    42                         writer.write(text);
    43                     }
    44                 }
    45             };
    46         }
    47     });
    View Code

    涉及到新增jar包:xstream-1.3.1.jar
    可以在最后返回前输出处理的结果:

    微信上可接收到消息:传入的文本消息处理完毕。
     
     到这,本节内容就结束了,可以自己去扩展语音消息的接收和处理哦~
  • 相关阅读:
    解析大型.NET ERP系统 权限模块设计与实现
    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
    解析大型.NET ERP系统 单据编码功能实现
    解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
    Windows 10 部署Enterprise Solution 5.5
    解析大型.NET ERP系统 设计异常处理模块
    解析大型.NET ERP系统 业务逻辑设计与实现
    解析大型.NET ERP系统 多国语言实现
    Enterprise Solution 管理软件开发框架流程实战
    解析大型.NET ERP系统 数据审计功能
  • 原文地址:https://www.cnblogs.com/cooldamon/p/7208622.html
Copyright © 2011-2022 走看看