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
    可以在最后返回前输出处理的结果:

    微信上可接收到消息:传入的文本消息处理完毕。
     
     到这,本节内容就结束了,可以自己去扩展语音消息的接收和处理哦~
  • 相关阅读:
    局部人物磨皮(二)
    可选颜色--六中色调的调整(二)
    可选颜色--六中色调的调整(一)
    通道混合器
    系统提权
    在NSObject类中,和继承它的类中,弹出UIAlertcontroller和push、present到其它界面
    oc中代理的简单运用
    单击和双击手势冲突的解决,取消页面所有手势
    iOS中主题切换模拟
    iOS 中各种手势的用法
  • 原文地址:https://www.cnblogs.com/cooldamon/p/7208622.html
Copyright © 2011-2022 走看看