在上一篇文章中,我们实现了被关注回复与关键词回复功能。在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息。但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起来学习一下微信公众平台开发之【图文消息的发送与响应

      一、了解图文消息XML包结构

相信一直学习我们系列博文的同学,一定了解我们的“套路”了,首先,我们要来了解一下图文消息的XML包结构。微信官方提供如下参数信息:

那么,了解了图文消息的XML包结构以后,我们就需要参照文本消息的回复,在我们的Java后台,组装我们的图文消息实体类。

但是,组装之前,我们不难发现,ToUserName、FromUserName、CreateTime、MsgType等参数,在文本消息中也出现过,而且在之后各种消息中都会出现,那么回想一下我们封装的文本消息实体类,很显然,我们需要将这些相同的内容,提取到一个父类中。下面,我们使用代码操作一下。

     二、重新封装文本消息&图文消息实体类

         ① 提取文本消息实体类(子类)代码至消息实体类(父类)

首先,打开我们之前写好的文本消息实体类textMessage:

找到里面共同的属性,并将代码提取到父类中:

新建一个父类,baseMessage.java,并将上述红线区域内的代码提取到父类中,让我们的textMessage类继承此父类。

接下来,我们分析一下微信的图文消息XML包结构:

<xml>

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

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

<CreateTime>12345678</CreateTime>

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

<ArticleCount>2</ArticleCount>

<Articles>

<item>

<Title><![CDATA[title1]]></Title>

<Description><![CDATA[description1]]></Description>

<PicUrl><![CDATA[picurl]]></PicUrl>

<Url><![CDATA[url]]></Url>

</item>

<item>

<Title><![CDATA[title]]></Title>

<Description><![CDATA[description]]></Description>

<PicUrl><![CDATA[picurl]]></PicUrl>

<Url><![CDATA[url]]></Url>

</item>

</Articles>

</xml>

不难发现,在<Articles></Articles> 标签中,可以有一个或多个<item></item>标签,这也就对应着一条到多条图文消息。那么显然,在组装图文消息实体类时,我们需要构建两个实体类,分别为:News.Java 包含每条item(图文)中的Title、Description、PicUrl、Url ,并组建一个NewsMessage.java ,继承自BaseMessage.java,作为我们整个图文消息的多个item。

     ② 构建单条item的实体类News.java 属性如下

      ③ 构建整个图文消息的实体类NewsMessage.java 属性如下

      三、消息处理工具类MessageUtil中新增图文消息相关处理方法

          ① 新增图文消息转XML结构方法

我们之前说过,微信只能接受XML结构的消息内容,那么我们可以参照之前文本消息转XML的方法,新建一个方法转化图文消息:

         ② 新增初始化图文消息方法

        三、修改Servlet中的doPost方法发送图文消息

此时,我们就完成了图文消息的回复发送,有代码可知,当用户回复数字3时,可收到我们撰写的图文消息,点开后将跳转到指定网址,效果如下:

【附录】 主要代码如下(更多详细代码,可下载源码查看):

MessageUtil工具类图文消息转xml&初始化图文消息方法:

/**

* 将图文消息对象转成XML

* @param

* @return

*/

public static String newsMessageToXml(NewsMessage newsMessage){

XStream xstream = new XStream();

//将xml的根节点替换成<xml>  默认为NewsMessage的包名

xstream.alias("xml", newsMessage.getClass());

//同理,将每条图文消息News类的报名,替换为<item>标签

xstream.alias("item", new News().getClass());

return xstream.toXML(newsMessage);

}

/**

* 初始化图文消息

*/

public static String initNewsMessage(String toUSerName,String fromUserName){

List<News> newsList = new ArrayList<News>();

NewsMessage newsMessage = new NewsMessage();

//组建一条图文↓ ↓ ↓

News newsItem = new News();

newsItem.setTitle("欢迎来到杰瑞教育");

newsItem.setDescription("杰瑞教育,中国高端互联网人才培训领导品牌!");

newsItem.setPicUrl("http://www.jredu100.com/statics/images/index/top/logo.png");

newsItem.setUrl("www.jredu100.com");

newsList.add(newsItem);

//组装图文消息相关信息

newsMessage.setToUserName(fromUserName);

newsMessage.setFromUserName(toUSerName);

newsMessage.setCreateTime(new Date().getTime());

newsMessage.setMsgType(MESSAGE_NEWS);

newsMessage.setArticle(newsList);

newsMessage.setArticleCount(newsList.size());

//调用newsMessageToXml将图文消息转化为XML结构并返回

return MessageUtil.newsMessageToXml(newsMessage);

}

使用Java语言开发微信公众平台(四)——图文消息的发送与响应的更多相关文章

  1. 使用Java语言开发微信公众平台(七)——音乐消息的回复

    在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...

  2. 使用Java语言开发微信公众平台(五)——获取access_token

    在前四期的文章中,我们分别学习了"环境搭建与开发接入"."文本消息的接收与响应"."被关注回复与关键词回复"."图文消息的发送与响 ...

  3. 使用Java语言开发微信公众平台(六)——获取access_token

             在前四期的文章中,我们分别学习了“环境搭建与开发接入”.“文本消息的接收与响应”.“被关注回复与关键词回复”.“图文消息的发送与响应”等环节.那么,从本篇博文开始,我们将进去更高级的 ...

  4. 使用Java语言开发微信公众平台(三)——被关注回复与关键词回复

    在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信可提 ...

  5. 使用Java语言开发微信公众平台(五)——被关注回复与关键词回复

      在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信 ...

  6. 使用Java语言开发微信公众平台(六)

    在上一节课程中,我们来学习了微信公众平台最基础的一个接口--access_token,并且能够从微信公众平台中取到access_token. 那么,在本节课程中,我们要以上节课获取到的access_t ...

  7. 使用Java语言开发微信公众平台(三)

            在上一节课程中,我们来学习了微信公众平台最基础的一个接口——access_token,并且能够从微信公众平台中取到access_token. 那么,在本节课程中,我们要以上节课获取到的 ...

  8. 使用Java语言开发微信公众平台(八)——自定义菜单功能

    随着上一篇文章的结束,我们已经实现了所有消息的类型的回复功能.今天,我们来学习更加高大上,也更加重要的自定义菜单功能. 一.了解自定义菜单 自定义菜单是微信公众平台最常用也是最重要的功能之一.根据微信 ...

  9. PHP语言开发微信公众平台(订阅号)之开启开发者模式

    (1)打开上一篇我们从花生壳官网获得的外网网址就会看到localhost根目录下的文件(这里不再赘述php环境的搭建).注:因为外网网址在能联网时,访问外网网址的任何人都能看到根目录下的所有文件,不仅 ...

随机推荐

  1. XCode中设置字体大小

    XCode中设置字体大小 1)打开Preferences,快捷键是“Command + ,”(注意,是三个键,按住command键,然后再快速地按“+”和“,”两个键即可) 2)选择“Fonts &a ...

  2. C#npoi导出excel一些自己的看法

    之前转过一篇类似的文章,那个是用C#自带的excel类操作Excel的,还有一种在c#上操作excel的方法便是npoi了,npoi是poi的C#版本. npoi操作excel有两种形式,一种是hss ...

  3. 使用express.js框架一步步实现基本应用以及构建可扩展的web应用

    最近过年在家有点懈怠,但是自己也不断在学习新的前端技术,在家琢磨了express.js的web框架. 框架的作用就是提高开发效率,快速产出结果.即使不使用框架,我们也会在开发过程中逐渐形成构成框架. ...

  4. TCP/IP协议族(二) HTTP报文头解析

    本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该字段名所对应的值,每 ...

  5. java的位运算符

    1.与运算&,同为1为1,否则为0: 例如:10001(二进制)&10000(二进制)=10000(二进制) 2.或运算|,只要有1就是1: 例如:10001(二进制)&100 ...

  6. [Linux] PHP程序员玩转Linux系列-怎么安装使用

    现在服务器主流都是Linux系统,主流发行版是CentOS,最新的CentOS版本号是7.3,我公司使用的是CentOS6.5,所以,我还是主要去学习6.x版本的CentOS.桌面版的Linux系统中 ...

  7. 关于AR,你想要的全在这儿了

    定义 增强现实(Augmented Reality,简称AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动.这种技术估计由19 ...

  8. pyqt的 .ui 转换为 .py 后的操作注意事项

    1. 增加 import sys 2. 将 Ui_MainWindow(object) 中的 object 修改成修改成 QtGui.QMainWindow 3. 在 Ui_MainWindow 类中 ...

  9. 访问内网中的sql server数据库的简便方法

    前言: 有时候我们要访问局域网内的 sql server服务器,比如测试环境数据库在公司内网,回到家或在客户现场要连接内网中的数据库 第一步:假如可以连接局域网的数据库 192.168.150.129 ...

  10. windows下部署免费ssl证书(letsencrypt)

    随着网络的发展,网络安全也越来越重要,对于网站来说,从Http升级到https也是我们要做的首要事情.要实现https,首先我们需要申请一张SSL证书,这篇文章我主要介绍下边这几个方面: 1. SSL ...