• 使用Java开发微信公众平台(二)——消息的接收与响应


    上一篇文章http://www.jerehedu.com/fenxiang/171807_for_detail.htm ,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接入。那么,本篇文章,我们将在此基础上,学习【消息的接收与响应】。

    当然,我们在后续的开发过程中肯定还是离不开微信提供的开发者文档http://mp.weixin.qq.com/wiki/home/ 打开开发文档,点击左侧的“消息管理”——“接受普通消息”,本节内容,我们来学习普通消息的接收与响应。

     

    之前我们强调过接入微信公众平台的时候微信将发送Get请求给我们的校验方法那当我们接收消息的时候微信将向我们发送Post请求并以XML的格式发送与接收数据。并且在开发过程中我们需要注意一点小细节

    微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

    下面我们来看一下微信发给我们的普通文本消息的XML包结构

    <xml>

            <ToUserName><![CDATA[toUser]]></ToUserName>

     <FromUserName><![CDATA[fromUser]]></FromUserName>

     <CreateTime>1348831860</CreateTime>

     <MsgType><![CDATA[text]]></MsgType>

     <Content><![CDATA[this is a test]]></Content>

     <MsgId>1234567890123456</MsgId>

     </xml>

    其中,各标签所包裹的内容,在官方文档中说的很详细:

    了解了微信给我们推送的XML包结构,下面我们就通过创建文本消息,来实现消息的接收与响应:

    继续打开我们上次编写的Servlet,即微信请求的Servlet地址。在Post方法中,接收微信发送的XML内容,当然在此之前,为了方便我们的数据处理,我们需要新建两个方法,将XML数据类型,转成我们熟悉的集合类型。反之,能够将我们的对象类型,转成XML类型,并返回给微信公众平台:

    1、 将接收到的XML格式,转为集合对象(Map)

    这里我们在我们的Util包下新建一个Message工具类

     

    首先,新建一个方法,将我们接收到的XML格式,转化为Map格式。在这个过程中,我们需要借助一个dom4j的jar包并将其放置在Web-INF下的lib包中。这个jar包很容易下载,此处提供一个下载链接,如果下载遇到问题,可加入杰瑞教育技术交流群(452379712)下载。 

     

    好了借助dom4j的jar包我们可以编写方法XML格式转化对Map对象格式方法实现如下

     

    2、 类似上述方法,我们需要编写方法,将我们的消息对象,转成XML。

    此处,我们仍需借助一个jar包:xstream-x.x.jar导入方式同dom4j

     

    当然首先我们需要新建一个实体类用于承载消息对象,实体类中6个属性,分别对应上述微信给我们发送的XML文本的6个参数,并提供对应Get/Set方法以及空参/全参构造,此处不做赘述:

     

    接下来我们编写方法来转换此文本消息类的对象,将其转换为XML格式返回:

     

    3、 写完上述两个处理方法后,我们来实现【消息的接收与响应】,

    回到我们最开始的Servlet中,在doPost方法中进行编写操作:

     

    这样我们就成功的完成了文本消息的接收与响应。实现效果如下,用户发送任何内容,将会返回各种信息:

     

    【附录】 相关代码:

    一、 Servlet中的doPost方法

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    request.setCharacterEncoding("UTF-8");

    response.setCharacterEncoding("UTF-8");

    PrintWriter out = response.getWriter();

    String str = null;

    try {

    //将request请求,传到Message工具类的转换方法中,返回接收到的Map对象

    Map<String, String> map = Message.xmlToMap(request);

    //从集合中,获取XML各个节点的内容

    String ToUserName = map.get("ToUserName");

    String FromUserName = map.get("FromUserName");

    String CreateTime = map.get("CreateTime");

    String MsgType = map.get("MsgType");

    String Content = map.get("Content");

    String MsgId = map.get("MsgId");

    if(MsgType.equals("text")){//判断消息类型是否是文本消息(text)

    TestMessage message = new TestMessage();

    message.setFromUserName(ToUserName);//原来【接收消息用户】变为回复时【发送消息用户】

    message.setToUserName(FromUserName);

    message.setMsgType("text");

    message.setCreateTime(new Date().getTime());//创建当前时间为消息时间

    message.setContent("您好,"+FromUserName+" 我是:"+ToUserName

    +" 您发送的消息类型为:"+MsgType+" 您发送的时间为"+CreateTime

    +" 我回复的时间为:"+message.getCreateTime()+"您发送的内容是"+Content);

    str = Message.objectToXml(message); //调用Message工具类,将对象转为XML字符串

    }

    } catch (DocumentException e) {

    e.printStackTrace();

    }

    out.print(str); //返回转换后的XML字符串

    out.close();

    }

    二、 Message处理工具类

    /**

     * 新建方法,将接收到的XML格式,转化为Map对象

     * @param request 将request对象,通过参数传入

     * @return 返回转换后的Map对象

     */

    public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{

    Map<String, String> map = new HashMap<String, String>();

    //从dom4j的jar包中,拿到SAXReader对象。

    SAXReader reader = new SAXReader();

    InputStream is = request.getInputStream();//从request中,获取输入流

    Document doc =  reader.read(is);//从reader对象中,读取输入流

    Element root = doc.getRootElement();//获取XML文档的根元素

    List<Element> list = root.elements();//获得根元素下的所有子节点

    for (Element e : list) {

    map.put(e.getName(), e.getText());//遍历list对象,并将结果保存到集合中

    }

    is.close();

    return map;

    }

    /**

     * 将文本消息对象转化成XML格式

     * @param message 文本消息对象

     * @return 返回转换后的XML格式

     */

    public static String objectToXml(TestMessage message){

    XStream xs = new XStream();

    //由于转换后xml根节点默认为class类,需转化为<xml>

    xs.alias("xml", message.getClass());

    return xs.toXML(message);

    }

    三、 TestMessage实体类

    package com.jredu.entity;

    public class TestMessage {

    private String ToUserName;

    private String FromUserName;

    private Long CreateTime;

    private String MsgType;

    private String Content;

    private String MsgId;

    public String getToUserName() {

    return ToUserName;

    }

    public void setToUserName(String toUserName) {

    ToUserName = toUserName;

    }

    public String getFromUserName() {

    return FromUserName;

    }

    public void setFromUserName(String fromUserName) {

    FromUserName = fromUserName;

    }

    public Long getCreateTime() {

    return CreateTime;

    }

    public void setCreateTime(long l) {

    CreateTime = l;

    }

    public String getMsgType() {

    return MsgType;

    }

    public void setMsgType(String msgType) {

    MsgType = msgType;

    }

    public String getContent() {

    return Content;

    }

    public void setContent(String content) {

    Content = content;

    }

    public String getMsgId() {

    return MsgId;

    }

    public void setMsgId(String msgId) {

    MsgId = msgId;

    }

    public TestMessage(String toUserName, String fromUserName,

    Long createTime, String msgType, String content, String msgId) {

    super();

    ToUserName = toUserName;

    FromUserName = fromUserName;

    CreateTime = createTime;

    MsgType = msgType;

    Content = content;

    MsgId = msgId;

    }

    public TestMessage() {

    super();

    }

    }

  • 相关阅读:
    [luoguP2463] [SDOI2008]Sandy的卡片(后缀数组 + st表)
    [luoguP3302] [SDOI2013]森林(主席树 + 启发式合并 + lca)
    [luoguP2526] [SHOI2001]小狗散步(二分图最大匹配)
    [luoguP3231] [HNOI2013]消毒(最小点覆盖 + 状压)
    [luoguP1963] [NOI2009]变换序列(二分图最大匹配)
    [luoguP1129] [ZJOI2007]矩阵游戏(二分图最大匹配)
    [luoguP1640] [SCOI2010]连续攻击游戏(二分图最大匹配)
    [luoguP2569] [SCOI2010]股票交易(DP + 单调队列)
    SICP:2,4 序对的过程性表示方法
    SICP:1.43重复调用函数
  • 原文地址:https://www.cnblogs.com/jerehedu/p/6534110.html
Copyright © 2020-2023  润新知