4.2.3 封装响应消息
公众账号服务器在接收到用户发送的消息后,可以通过返回特定的XML结构对消息进行响应,开发者文档的“发送被动响应消息”中定义了每种响应消息的结构,如图4-8所示。
图4-8 发送被动响应消息
1.响应消息基类
每种类型的响应消息都包含参数ToUserName、FromUserName、CreateTime和MsgType,参数的描述如表4-8所示。
表4-8 响应消息公有的参数描述
说明 响应消息中的ToUserName与请求消息中的FromUserName一致,表示用户的OpenID。响应消息中的FromUserName与请求消息中的ToUserName一致,表示公众账号的原始ID。
响应消息基类的代码如下:
- /**
- * 消息基类(公众账号 -> 普通用户)
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class BaseMessage {
- // 接收方账号(收到的OpenID)
- private String ToUserName;
- // 开发者微信号
- private String FromUserName;
- // 消息创建时间 (整型)
- private long CreateTime;
- // 消息类型(text/music/news)
- private String MsgType;
- 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 createTime) {
- CreateTime = createTime;
- }
- public String getMsgType() {
- return MsgType;
- }
- public void setMsgType(String msgType) {
- MsgType = msgType;
- }
- }
2.文本消息
当公众账号服务器收到用户发送的消息之后,如果需要回复一条文本消息给用户,需要构造如下格式的数据:
- <xml>
- <ToUserName><![CDATA[toUser]]></ToUserName>
- <FromUserName><![CDATA[fromUser]]></FromUserName>
- <CreateTime>12345678</CreateTime>
- <MsgType><![CDATA[text]]></MsgType>
- <Content><![CDATA[content]]></Content>
- </xml>
参数Content表示消息内容,长度不能超过2048字节,否则,微信服务器会放弃响应,用户则收不到回复。该数据格式对应的Java类如下:
- /**
- * 文本消息
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class TextMessage extends BaseMessage {
- // 回复的消息内容
- private String Content;
- public String getContent() {
- return Content;
- }
- public void setContent(String content) {
- Content = content;
- }
- }
3.图片消息
如果需要回复一条图片消息给用户,需要构造如下格式的数据:
- <xml>
- <ToUserName><![CDATA[toUser]]></ToUserName>
- <FromUserName><![CDATA[fromUser]]></FromUserName>
- <CreateTime>12345678</CreateTime>
- <MsgType><![CDATA[image]]></MsgType>
- <Image>
- <MediaId><![CDATA[media_id]]></MediaId>
- </Image>
- </xml>
参数MediaId是媒体文件的ID。回复图片、语音、视频等多媒体消息时,需要预先上传多媒体文件到微信服务器,上传成功后微信服务器会返回多媒体文件的ID。
图片消息对应的Java类如下:
- /**
- * 图片消息
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class ImageMessage extends BaseMessage {
- // 图片
- private Image Image;
- public Image getImage() {
- return Image;
- }
- public void setImage(Image image) {
- Image = image;
- }
- }
图片消息类ImageMessage有一个类型为Image的成员变量,该Image类的定义如下:
- /**
- * 图片model
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class Image {
- // 媒体文件ID
- private String MediaId;
- public String getMediaId() {
- return MediaId;
- }
- public void setMediaId(String mediaId) {
- MediaId = mediaId;
- }
- }
4.语音消息
如果需要回复一条语音消息给用户,需要构造如下格式的数据:
- <xml>
- <ToUserName><![CDATA[toUser]]></ToUserName>
- <FromUserName><![CDATA[fromUser]]></FromUserName>
- <CreateTime>12345678</CreateTime>
- <MsgType><![CDATA[voice]]></MsgType>
- <Voice>
- <MediaId><![CDATA[media_id]]></MediaId>
- </Voice>
- </xml>
语音消息对应的Java类如下:
- /**
- * 语音消息
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class VoiceMessage extends BaseMessage {
- // 语音
- private Voice Voice;
- public Voice getVoice() {
- return Voice;
- }
- public void setVoice(Voice voice) {
- Voice = voice;
- }
- }
Voice类的定义如下:
- /**
- * 语音model
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class Voice {
- // 媒体文件ID
- private String MediaId;
- public String getMediaId() {
- return MediaId;
- }
- public void setMediaId(String mediaId) {
- MediaId = mediaId;
- }
- }
5.视频消息
如果需要回复一条视频消息给用户,需要构造如下格式的数据:
- <xml>
- <ToUserName><![CDATA[toUser]]></ToUserName>
- <FromUserName><![CDATA[fromUser]]></FromUserName>
- <CreateTime>12345678</CreateTime>
- <MsgType><![CDATA[video]]></MsgType>
- <Video>
- <MediaId><![CDATA[media_id]]></MediaId>
- <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
- </Video>
- </xml>
参数ThumbMediaId是视频缩略图的媒体ID,与MediaId一样,ThumbMediaId的值也是通过上传多媒体文件获得。
视频消息对应的Java类如下:
- /**
- * 视频消息
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class VideoMessage extends BaseMessage {
- // 视频
- private Video Video;
- public Video getVideo() {
- return Video;
- }
- public void setVideo(Video video) {
- Video = video;
- }
- }
Video类的定义如下:
- /**
- * 视频model
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class Video {
- // 媒体文件ID
- private String MediaId;
- // 缩略图的媒体ID
- private String ThumbMediaId;
- public String getMediaId() {
- return MediaId;
- }
- public void setMediaId(String mediaId) {
- MediaId = mediaId;
- }
- public String getThumbMediaId() {
- return ThumbMediaId;
- }
- public void setThumbMediaId(String thumbMediaId) {
- ThumbMediaId = thumbMediaId;
- }
- }
6.音乐消息
如果要开发一个带歌曲点播功能的公众账号,肯定是希望用户发送歌曲名称后向用户回复一条音乐消息,用户点击该音乐消息就能够直接播放。回复音乐消息需要构造如下格式的数据:
- <xml>
- <ToUserName><![CDATA[toUser]]></ToUserName>
- <FromUserName><![CDATA[fromUser]]></FromUserName>
- <CreateTime>12345678</CreateTime>
- <MsgType><![CDATA[music]]></MsgType>
- <Music>
- <Title><![CDATA[TITLE]]></Title>
- <Description><![CDATA[DESCRIPTION]]></Description>
- <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
- <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
- </Music>
- </xml>
音乐消息中的主要参数描述如表4-9所示。
表4-9 音乐消息的主要参数描述
说明 ①ThumbMediaId不是音乐消息的必须参数,给用户回复音乐消息时可以不包含该参数。②所有公众账号都可以向用户回复音乐消息。
音乐消息对应的Java类如下:
- /**
- * 音乐消息
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class MusicMessage extends BaseMessage {
- // 音乐
- private Music Music;
- public Music getMusic() {
- return Music;
- }
- public void setMusic(Music music) {
- Music = music;
- }
- }
Music类的定义如下:
- /**
- * 音乐model
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class Music {
- // 音乐标题
- private String Title;
- // 音乐描述
- private String Description;
- // 音乐链接
- private String MusicUrl;
- // 高质量音乐链接,Wi-Fi环境优先使用该链接播放音乐
- private String HQMusicUrl;
- // 缩略图的媒体ID,通过上传多媒体文件得到的ID
- private String ThumbMediaId;
- public String getTitle() {
- return Title;
- }
- public void setTitle(String title) {
- Title = title;
- }
- public String getDescription() {
- return Description;
- }
- public void setDescription(String description) {
- Description = description;
- }
- public String getMusicUrl() {
- return MusicUrl;
- }
- public void setMusicUrl(String musicUrl) {
- MusicUrl = musicUrl;
- }
- public String getHQMusicUrl() {
- return HQMusicUrl;
- }
- public void setHQMusicUrl(String musicUrl) {
- HQMusicUrl = musicUrl;
- }
- public String getThumbMediaId() {
- return ThumbMediaId;
- }
- public void setThumbMediaId(String thumbMediaId) {
- ThumbMediaId = thumbMediaId;
- }
- }
7.图文消息
图文消息有着丰富的内容及多样化的表现形式。如果公众账号向用户回复图文消息,需要构造如下格式的数据:
- <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>
图文消息中的主要参数描述如表4-10所示。
表4-10 图文消息的主要参数描述
图文消息对应的Java类如下:
- /**
- * 文本消息
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class NewsMessage extends BaseMessage {
- // 图文消息个数,限制为10条以内
- private int ArticleCount;
- // 多条图文消息信息,默认第一个item为大图
- private List<Article> Articles;
- public int getArticleCount() {
- return ArticleCount;
- }
- public void setArticleCount(int articleCount) {
- ArticleCount = articleCount;
- }
- public List<Article> getArticles() {
- return Articles;
- }
- public void setArticles(List<Article> articles) {
- Articles = articles;
- }
- }
Article类的定义如下:
- /**
- * 图文model
- *
- * @author liufeng
- * @date 2013-09-11
- */
- public class Article {
- // 图文消息名称
- private String Title;
- // 图文消息描述
- private String Description;
- // 图片链接,支持JPG、PNG格式,较好的效果为大图640像素×320像素,小图80像素×80像素
- private String PicUrl;
- // 点击图文消息跳转链接
- private String Url;
- public String getTitle() {
- return Title;
- }
- public void setTitle(String title) {
- Title = title;
- }
- public String getDescription() {
- return null == Description ? "" : Description;
- }
- public void setDescription(String description) {
- Description = description;
- }
- public String getPicUrl() {
- return null == PicUrl ? "" : PicUrl;
- }
- public void setPicUrl(String picUrl) {
- PicUrl = picUrl;
- }
- public String getUrl() {
- return null == Url ? "" : Url;
- }
- public void setUrl(String url) {
- Url = url;
- }
- }