热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信开发之消息回复--文本消息(三)

一、消息格式1<xml>2<ToUserName><![CDATA[toUser]]>3<ToUserName

一、消息格式

 1 <xml>
 2     <ToUserName>< ![CDATA[toUser] ]>
 3     ToUserName>
 4     <FromUserName>< ![CDATA[fromUser] ]>
 5     FromUserName>
 6     <CreateTime>1348831860CreateTime>
 7     <MsgType>< ![CDATA[text] ]>
 8     MsgType>
 9     <Content>< ![CDATA[this is a test] ]>
10     Content>
11     <MsgId>1234567890123456MsgId>
12 xml>

二、参数介绍

参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType image
PicUrl 图片链接(由系统生成)
MediaId 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId 消息id,64位整型

三、文本消息实体类

 1 public class TextMessage {
 2     private String ToUserName;//开发者微信号
 3     private String FromUserName;//发送方帐号(一个OpenID)
 4     private String CreateTime;//消息创建时间 (整型)
 5     private String MsgType;//消息类型
 6     private String Content;//内容
 7     private String MsgId;//消息id,64位整型
 8     public String getToUserName() {
 9         return ToUserName;
10     }
11     public void setToUserName(String toUserName) {
12         ToUserName = toUserName;
13     }
14     public String getFromUserName() {
15         return FromUserName;
16     }
17     public void setFromUserName(String fromUserName) {
18         FromUserName = fromUserName;
19     }
20     public String getCreateTime() {
21         return CreateTime;
22     }
23     public void setCreateTime(String createTime) {
24         CreateTime = createTime;
25     }
26     public String getMsgType() {
27         return MsgType;
28     }
29     public void setMsgType(String msgType) {
30         MsgType = msgType;
31     }
32     public String getContent() {
33         return Content;
34     }
35     public void setContent(String content) {
36         COntent= content;
37     }
38     public String getMsgId() {
39         return MsgId;
40     }
41     public void setMsgId(String msgId) {
42         MsgId = msgId;
43     }
44     @Override
45     public String toString() {
46         return "TextMessage [ToUserName=" + ToUserName + ", FromUserName="
47                 + FromUserName + ", CreateTime=" + CreateTime + ", MsgType="
48                 + MsgType + ", COntent=" + Content + ", MsgId=" + MsgId + "]";
49     }
50     
51 }

三、编写消息类(读取xml)

  1.消息类型及事件类型

 1 package com.weixin.msgparam;
 2 /**
 3  * 常用参数类
 4  * @author 付先生
 5  * @date 2018年1月26日 下午4:40:50
 6  * @TODO TODO
 7  */
 8 public class MsgTypeParam {
 9     
10     public static final String MESSAGE_TEXT="text";//文本
11     public static final String MESSAGE_IMAGE="image";//图片
12     public static final String MESSAGE_NEWS="news";
13     public static final String MESSAGE_VOICE="voice";//语音
14     public static final String MESSAGE_VIDEO="video";//视频
15     public static final String MESSAGE_MUSIC="music";//音乐
16     public static final String MESSAGE_LOCATION="location";//位置
17     public static final String MESSAGE_LINK="link";//链接消息
18     public static final String MESSAGE_EVENT="event";//事件
19     public static final String MESSAGE_SUBSCRIBE="subscribe";//关注
20     public static final String MESSAGE_UNSUBSCRIBE="unsubscribe";//取消关注
21     public static final String MESSAGE_CLICK="CLICK";//点击
22     public static final String MESSAGE_VIEW="VIEW";//点击菜单跳转链接时的事件推送
23     public static final String MESSAGE_SCANCODE= "scancode_push";//扫码
24 }

        2.MessageUtil.java  --》解析接收的xml信息、封装返回的xml信息

        注意:这里用到了2个JAR包:xstream-1.3.jar、dom4j.jar

public class MessageUtil {
    /**
     * xml 转 map
     * @param request
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    public static Map xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
        Map map = new HashMap();
        SAXReader reader = new SAXReader();
        InputStream ins = request.getInputStream();
        Document doc = reader.read(ins);
        Element root = doc.getRootElement();
        List list = root.elements();
        for(Element e : list){
            map.put(e.getName(), e.getText());
        }
        ins.close();
        return map;
    }
    
    /**
     * 将文本消息对象转换成xml
     * @param textMessage
     * @return
     * 注意事项:添加xstream.jar
     */
    public static String textMessageToXml(TextMessage textMessage){
        //XStream xStream = new XStream(new StaxDriver());
        xStream.alias("xml", textMessage.getClass());
        return xStream.toXML(textMessage);
    }
    
    /**
     * xStream本身不支持生成cdata块生成,对xstream扩展,让其自动生成cdata块
     */
    private static XStream xStream = new XStream(new StaxDriver(){
        public HierarchicalStreamWriter createWriter(Writer out){
            return new PrettyPrintWriter(out){
                boolean cdata = true;
                
                public void startNode(String name,Class clazz){
                    super.startNode(name, clazz);
                }
                protected void writeText(QuickWriter writer,String text){
                    if(cdata){
                        writer.write(");
                        writer.write(text);
                        writer.write("]]>");
                    }else{
                        writer.write(text);
                    }
                }
            };
        }
    });
        
}

  3.初始化文本信息方法

/**
 * 初始化消息内容工具类
 * @author 付先生
 * @date 2018年1月26日 下午4:49:25
 * @TODO TODO
 */
public class InitMsgContentUtil {

    //初始化文本消息
    public static String initText(String toUserName,String fromUserName,String content){
        String message = "";
        TextMessage text = new TextMessage();
        text.setFromUserName(toUserName);
        text.setToUserName(fromUserName);
        text.setMsgType(MsgTypeParam.MESSAGE_TEXT);
        text.setCreateTime(new Date().getTime()+"");
        text.setContent(content);
        message = MessageUtil.textMessageToXml(text);
        return message;
    }
}

四、修改Servlet中的Post方法,加入如下代码:

 1 @Override
 2     protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
 3         req.setCharacterEncoding("UTF-8");
 4         resp.setCharacterEncoding("UTF-8");
 5         PrintWriter out = resp.getWriter();
 6         try {
 7             Map map = MessageUtil.xmlToMap(req);
 8             String fromUserName = map.get("FromUserName");
 9             String toUserName = map.get("ToUserName");
10             //消息类型
11             String msgType = map.get("MsgType");
12             String cOntent= map.get("Content");
13             //回复文本消息
14             String message = null;
15             //消息类型判断
16             if(MsgTypeParam.MESSAGE_TEXT.equals(msgType)){
17                 String text = "山东京帝软件微信公众号测试";
18                 //调用初始化文本消息方法
19                 message = InitMsgContentUtil.initText(toUserName, fromUserName, text);
20             }
21             out.print(message);
22         } catch (DocumentException e) {
23             e.printStackTrace();
24         }finally{
25             out.close();
26         }
27     }

五、项目部署及查看结果  

  向公众号发送信息,看是否能够正常返回信息。

  给各位推荐一个在线测试的平台:http://debug.fangbei.org/

  操作步骤:

  录入我们接入微信平台的URL和TOKEN

  选择消息类型:文本

  内容:输入要发送给公众号的内容,在右侧可看到效果的预览。

 


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
小胖菜鸟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有