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

      一、了解图文消息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. 一次开放接口从需求分析到发布sdk线上包

    新年开场篇,欢迎来点赞:本篇和大家分享的是使用webapi做得接口服务验证框架,需求来源是我打算把上篇提到的图片验证码做成一种服务提供给大家,尽管我在上篇已经把代码打包开源了,但是如果有一种快速对接成 ...

  2. HUST 1586 数字排列

    1586 - 数字排列 时间限制:1秒 内存限制:128兆 91 次提交 36 次通过 题目描述 现有n个k位的数字,你的任务是重新安排数字每一位的位置,使得重新安排后这n个数字中最大的数字和最小的数 ...

  3. 一个普通底层.NET程序员关于职场瓶颈期的思考,辗转自我提升/跳槽/转行之间

    徒有工龄,没技术没学历没平台没家底,工作几年,无车无房无存款还前景不明. 时常有身边的亲友问怎么学开发怎么转互联网,说起IT行业都说工资高,动辄月薪上万动辄年薪几十万. 再看看自己,我可能是假的程序员 ...

  4. android开发过程中踩过的坑

    1) 4.X下 viewgroup 不一定会向下传递requestLayout,当onlayout的速度比较慢(比如子View比较复杂之类的原因),系统会跳帧!此时子View下层的view可能就不会再 ...

  5. Top命名的一些简单用法

    1. Top命令的显示 top 2. 按(Shift + O)是为了选择列进行排序.例如:按a是为了通过PID进行排序.然后按任意键返回主窗口. 3. 显示特定用户的进程. top -u hadoop ...

  6. Codeforces Good Bye 2016 题解

    好久没有fst题了...比赛先A了前4题然后发现room里有人已经X完题了没办法只能去打E题,结果差一点点打完...然后C题fst掉了结果就掉rating 了...下面放题解 ### [A. New ...

  7. WP8.1开发中找程序下的Assets文件夹

    这俩天在开发另一个程序时,遇到一个小问题:如何调用程序下的Assets文件夹及其下的文件和文件夹: 在网上找了两天,基本上是关于如何调用手机中库的方法,没找到有关介绍如何调用查找 编译前添加图片或其它 ...

  8. system, fileExist函数包装

    #include "stdio.h" #include <string> #include<sys/types.h> #include<fcntl.h ...

  9. zhenai

    1.2=http://files.cnblogs.com/files/bqh10086/zhenai_1.2_pack.zip

  10. 前端基本知识(三):JS的闭包理解

    JS闭包的理解 一.变量的作用域 二.如何从外部读取局部变量 三.什么是闭包 四.深入理解闭包 五.闭包的用途 六.使用闭包注意情况 七.JavaScript的垃圾回收机制 八.一些思考题 一.变量作 ...