zoukankan      html  css  js  c++  java
  • Java微信公众平台开发(五)--文本及图文消息回复的实现

    转自:http://www.cuiyongzhi.com/post/43.html

    上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为【普通消息】和【多媒体消息】,这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段【openid】,它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字!

    (一)回复文本消息

    在前面我们已经完成了对消息的分类和回复消息实体的建立,这里回复文本消息需要用到的就是我们的TextMessage,我们把回复文本消息在【文本消息】类型中给出回复!在我们做消息回复的时候需要设置消息的接收人ToUserName(openid)、消息的发送方FromUserName、消息类型MsgType、创建时间CreateTime以及消息体Content,由于我们我们的消息回复格式是需要为xml,所以最终我们需要将其装换成xml再做返回输出!

    首先我们在工具类MessageUtil的代码做出部分修改和添加,实现最后版本为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    package com.cuiyongzhi.wechat.util;
     
    import java.io.InputStream;
    import java.io.Writer;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.servlet.http.HttpServletRequest;
     
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
     
    import com.cuiyongzhi.wechat.message.resp.Article;
    import com.cuiyongzhi.wechat.message.resp.ImageMessage;
    import com.cuiyongzhi.wechat.message.resp.MusicMessage;
    import com.cuiyongzhi.wechat.message.resp.NewsMessage;
    import com.cuiyongzhi.wechat.message.resp.TextMessage;
    import com.cuiyongzhi.wechat.message.resp.VideoMessage;
    import com.cuiyongzhi.wechat.message.resp.VoiceMessage;
    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.core.util.QuickWriter;
    import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
    import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
    import com.thoughtworks.xstream.io.xml.XppDriver;
     
    /**
     * ClassName: MessageUtil
     
     * @Description: 消息工具类
     * @author dapengniao
     * @date 2016年3月7日 上午10:05:04
     */
    public class MessageUtil {
     
        /**
         * 返回消息类型:文本
         */
        public static final String RESP_MESSAGE_TYPE_TEXT = "text";
     
        /**
         * 返回消息类型:音乐
         */
        public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
     
        /**
         * 返回消息类型:图文
         */
        public static final String RESP_MESSAGE_TYPE_NEWS = "news";
     
        /**
         * 返回消息类型:图片
         */
        public static final String RESP_MESSAGE_TYPE_Image = "image";
     
        /**
         * 返回消息类型:语音
         */
        public static final String RESP_MESSAGE_TYPE_Voice = "voice";
     
        /**
         * 返回消息类型:视频
         */
        public static final String RESP_MESSAGE_TYPE_Video = "video";
     
        /**
         * 请求消息类型:文本
         */
        public static final String REQ_MESSAGE_TYPE_TEXT = "text";
     
        /**
         * 请求消息类型:图片
         */
        public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
     
        /**
         * 请求消息类型:链接
         */
        public static final String REQ_MESSAGE_TYPE_LINK = "link";
     
        /**
         * 请求消息类型:地理位置
         */
        public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
     
        /**
         * 请求消息类型:音频
         */
        public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
     
        /**
         * 请求消息类型:视频
         */
        public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
     
        /**
         * 请求消息类型:推送
         */
        public static final String REQ_MESSAGE_TYPE_EVENT = "event";
     
        /**
         * 事件类型:subscribe(订阅)
         */
        public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
     
        /**
         * 事件类型:unsubscribe(取消订阅)
         */
        public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
     
        /**
         * 事件类型:CLICK(自定义菜单点击事件)
         */
        public static final String EVENT_TYPE_CLICK = "CLICK";
     
        /**
         * 事件类型:VIEW(自定义菜单URl视图)
         */
        public static final String EVENT_TYPE_VIEW = "VIEW";
     
        /**
         * 事件类型:LOCATION(上报地理位置事件)
         */
        public static final String EVENT_TYPE_LOCATION = "LOCATION";
     
        /**
         * 事件类型:LOCATION(上报地理位置事件)
         */
        public static final String EVENT_TYPE_SCAN = "SCAN";
     
        /**
         * @Description: 解析微信发来的请求(XML)
         * @param @param request
         * @param @return
         * @param @throws Exception
         * @author dapengniao
         * @date 2016年3月7日 上午10:04:02
         */
        @SuppressWarnings("unchecked")
        public static Map<String, String> parseXml(HttpServletRequest request)
                throws Exception {
            // 将解析结果存储在HashMap中
            Map<String, String> map = new HashMap<String, String>();
            // 从request中取得输入流
            InputStream inputStream = request.getInputStream();
            // 读取输入流
            SAXReader reader = new SAXReader();
            Document document = reader.read(inputStream);
            // 得到xml根元素
            Element root = document.getRootElement();
            // 得到根元素的所有子节点
            List<Element> elementList = root.elements();
     
            // 遍历所有子节点
            for (Element e : elementList)
                map.put(e.getName(), e.getText());
     
            // 释放资源
            inputStream.close();
            inputStream = null;
     
            return map;
        }
     
        /**
         * @Description: 文本消息对象转换成xml
         * @param @param textMessage
         * @param @return
         * @author dapengniao
         * @date 2016年3月8日 下午4:13:22
         */
        public static String textMessageToXml(TextMessage textMessage) {
            xstream.alias("xml", textMessage.getClass());
            return xstream.toXML(textMessage);
        }
     
        /**
         * @Description: 图文消息对象转换成xml
         * @param @param newsMessage
         * @param @return
         * @author dapengniao
         * @date 2016年3月8日 下午4:14:09
         */
        public static String newsMessageToXml(NewsMessage newsMessage) {
            xstream.alias("xml", newsMessage.getClass());
            xstream.alias("item"new Article().getClass());
            return xstream.toXML(newsMessage);
        }
     
        /**
         * @Description: 图片消息对象转换成xml
         * @param @param imageMessage
         * @param @return
         * @author dapengniao
         * @date 2016年3月9日 上午9:25:51
         */
        public static String imageMessageToXml(ImageMessage imageMessage) {
            xstream.alias("xml", imageMessage.getClass());
            return xstream.toXML(imageMessage);
        }
     
        /**
         * @Description: 语音消息对象转换成xml
         * @param @param voiceMessage
         * @param @return
         * @author dapengniao
         * @date 2016年3月9日 上午9:27:26
         */
        public static String voiceMessageToXml(VoiceMessage voiceMessage) {
            xstream.alias("xml", voiceMessage.getClass());
            return xstream.toXML(voiceMessage);
        }
     
        /**
         * @Description: 视频消息对象转换成xml
         * @param @param videoMessage
         * @param @return
         * @author dapengniao
         * @date 2016年3月9日 上午9:31:09
         */
        public static String videoMessageToXml(VideoMessage videoMessage) {
            xstream.alias("xml", videoMessage.getClass());
            return xstream.toXML(videoMessage);
        }
     
        /**
         * @Description: 音乐消息对象转换成xml
         * @param @param musicMessage
         * @param @return
         * @author dapengniao
         * @date 2016年3月8日 下午4:13:36
         */
        public static String musicMessageToXml(MusicMessage musicMessage) {
            xstream.alias("xml", musicMessage.getClass());
            return xstream.toXML(musicMessage);
        }
     
        /**
         * 对象到xml的处理
         */
        private static XStream xstream = new XStream(new XppDriver() {
            public HierarchicalStreamWriter createWriter(Writer out) {
                return new PrettyPrintWriter(out) {
                    // 对所有xml节点的转换都增加CDATA标记
                    boolean cdata = true;
     
                    @SuppressWarnings("rawtypes")
                    public void startNode(String name, Class clazz) {
                        super.startNode(name, clazz);
                    }
     
                    protected void writeText(QuickWriter writer, String text) {
                        if (cdata) {
                            writer.write("<![CDATA[");
                            writer.write(text);
                            writer.write("]]>");
                        else {
                            writer.write(text);
                        }
                    }
                };
            }
        });
    }

    我们回复文本消息的简单实现:修改MsgDispatcher,在消息分类为【文本消息】中加入如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    String openid=map.get("FromUserName"); //用户openid
    String mpid=map.get("ToUserName");   //公众号原始ID
             
    //普通文本消息
    TextMessage txtmsg=new TextMessage();
    txtmsg.setToUserName(openid);
    txtmsg.setFromUserName(mpid);
    txtmsg.setCreateTime(new Date().getTime());
    txtmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
             
    if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { // 文本消息
        txtmsg.setContent("你好,这里是崔用志个人账号!");
        return MessageUtil.textMessageToXml(txtmsg);
    }

    启动项目,当我们发送任何文本消息后我们可以看到我们的回复内容,如图:

    1.png

    (二)图文消息回复

    图文消息的回复和文本消息的实现模式是一样的,只不过对应消息体的字段有所区别而已,这里为了和文本消息能有所区分我在【图片消息】实现图文消息的回复,修改MsgDispatcher:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        //对图文消息
    NewsMessage newmsg=new NewsMessage();
    newmsg.setToUserName(openid);
    newmsg.setFromUserName(mpid);
    newmsg.setCreateTime(new Date().getTime());
    newmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
             
    if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { // 图片消息
        System.out.println("==============这是图片消息!");
        Article article=new Article();
        article.setDescription("这是图文消息1"); //图文消息的描述
        article.setPicUrl("http://res.cuiyongzhi.com/2016/03/201603086749_6850.png"); //图文消息图片地址
        article.setTitle("图文消息1");  //图文消息标题
        article.setUrl("http://www.cuiyongzhi.com");  //图文url链接
        List<Article> list=new ArrayList<Article>();
        list.add(article);     //这里发送的是单图文,如果需要发送多图文则在这里list中加入多个Article即可!
        newmsg.setArticleCount(list.size());
        newmsg.setArticles(list);
        return MessageUtil.newsMessageToXml(newmsg);
    }      

    实现结果如下图所示:

    2.png

    在整个的谱图消息发送的过程中没有任何项目结构的变化,只是对文件内容作了简单代码增加和修改,下一篇将讲述【微信开发中的token生成】以方便后面多媒体消息发送的讲解,感谢你的查阅,如有疑问获需源码可留言!

  • 相关阅读:
    python 异常处理
    python 文件
    python 面向对象程序设计基础
    python 数据结构与算法
    python中的基本数据结构
    关于python程序设计流程(未完结)
    python的字典(dict)的键值对存储规则
    python中字符串的方法及注释
    Element.requestFullscreen()方法
    oncontextmenu 事件
  • 原文地址:https://www.cnblogs.com/sharpest/p/10236842.html
Copyright © 2011-2022 走看看