4.2.3 封装响应消息

公众账号服务器在接收到用户发送的消息后,可以通过返回特定的XML结构对消息进行响应,开发者文档的“发送被动响应消息”中定义了每种响应消息的结构,如图4-8所示。

4.2.3 封装响应消息 - 图1

图4-8 发送被动响应消息

1.响应消息基类

每种类型的响应消息都包含参数ToUserName、FromUserName、CreateTime和MsgType,参数的描述如表4-8所示。

表4-8 响应消息公有的参数描述

4.2.3 封装响应消息 - 图2


说明 响应消息中的ToUserName与请求消息中的FromUserName一致,表示用户的OpenID。响应消息中的FromUserName与请求消息中的ToUserName一致,表示公众账号的原始ID。


响应消息基类的代码如下:

  1. /**
  2. * 消息基类(公众账号 -> 普通用户)
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class BaseMessage {
  8. // 接收方账号(收到的OpenID)
  9. private String ToUserName;
  10. // 开发者微信号
  11. private String FromUserName;
  12. // 消息创建时间 (整型)
  13. private long CreateTime;
  14. // 消息类型(text/music/news)
  15. private String MsgType;
  16.  
  17. public String getToUserName() {
  18. return ToUserName;
  19. }
  20.  
  21. public void setToUserName(String toUserName) {
  22. ToUserName = toUserName;
  23. }
  24.  
  25. public String getFromUserName() {
  26. return FromUserName;
  27. }
  28.  
  29. public void setFromUserName(String fromUserName) {
  30. FromUserName = fromUserName;
  31. }
  32.  
  33. public long getCreateTime() {
  34. return CreateTime;
  35. }
  36.  
  37. public void setCreateTime(long createTime) {
  38. CreateTime = createTime;
  39. }
  40.  
  41. public String getMsgType() {
  42. return MsgType;
  43. }
  44.  
  45. public void setMsgType(String msgType) {
  46. MsgType = msgType;
  47. }
  48. }

2.文本消息

当公众账号服务器收到用户发送的消息之后,如果需要回复一条文本消息给用户,需要构造如下格式的数据:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[text]]></MsgType>
  6. <Content><![CDATA[content]]></Content>
  7. </xml>

参数Content表示消息内容,长度不能超过2048字节,否则,微信服务器会放弃响应,用户则收不到回复。该数据格式对应的Java类如下:

  1. /**
  2. * 文本消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class TextMessage extends BaseMessage {
  8. // 回复的消息内容
  9. private String Content;
  10.  
  11. public String getContent() {
  12. return Content;
  13. }
  14.  
  15. public void setContent(String content) {
  16. Content = content;
  17. }
  18. }

3.图片消息

如果需要回复一条图片消息给用户,需要构造如下格式的数据:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[image]]></MsgType>
  6. <Image>
  7. <MediaId><![CDATA[media_id]]></MediaId>
  8. </Image>
  9. </xml>

参数MediaId是媒体文件的ID。回复图片、语音、视频等多媒体消息时,需要预先上传多媒体文件到微信服务器,上传成功后微信服务器会返回多媒体文件的ID。

图片消息对应的Java类如下:

  1. /**
  2. * 图片消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class ImageMessage extends BaseMessage {
  8. // 图片
  9. private Image Image;
  10.  
  11. public Image getImage() {
  12. return Image;
  13. }
  14.  
  15. public void setImage(Image image) {
  16. Image = image;
  17. }
  18. }

图片消息类ImageMessage有一个类型为Image的成员变量,该Image类的定义如下:

  1. /**
  2. * 图片model
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class Image {
  8. // 媒体文件ID
  9. private String MediaId;
  10.  
  11. public String getMediaId() {
  12. return MediaId;
  13. }
  14.  
  15. public void setMediaId(String mediaId) {
  16. MediaId = mediaId;
  17. }
  18. }

4.语音消息

如果需要回复一条语音消息给用户,需要构造如下格式的数据:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[voice]]></MsgType>
  6. <Voice>
  7. <MediaId><![CDATA[media_id]]></MediaId>
  8. </Voice>
  9. </xml>

语音消息对应的Java类如下:

  1. /**
  2. * 语音消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class VoiceMessage extends BaseMessage {
  8. // 语音
  9. private Voice Voice;
  10.  
  11. public Voice getVoice() {
  12. return Voice;
  13. }
  14.  
  15. public void setVoice(Voice voice) {
  16. Voice = voice;
  17. }
  18. }

Voice类的定义如下:

  1. /**
  2. * 语音model
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class Voice {
  8. // 媒体文件ID
  9. private String MediaId;
  10.  
  11. public String getMediaId() {
  12. return MediaId;
  13. }
  14.  
  15. public void setMediaId(String mediaId) {
  16. MediaId = mediaId;
  17. }
  18. }

5.视频消息

如果需要回复一条视频消息给用户,需要构造如下格式的数据:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[video]]></MsgType>
  6. <Video>
  7. <MediaId><![CDATA[media_id]]></MediaId>
  8. <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
  9. </Video>
  10. </xml>

参数ThumbMediaId是视频缩略图的媒体ID,与MediaId一样,ThumbMediaId的值也是通过上传多媒体文件获得。

视频消息对应的Java类如下:

  1. /**
  2. * 视频消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class VideoMessage extends BaseMessage {
  8. // 视频
  9. private Video Video;
  10.  
  11. public Video getVideo() {
  12. return Video;
  13. }
  14.  
  15. public void setVideo(Video video) {
  16. Video = video;
  17. }
  18. }

Video类的定义如下:

  1. /**
  2. * 视频model
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class Video {
  8. // 媒体文件ID
  9. private String MediaId;
  10. // 缩略图的媒体ID
  11. private String ThumbMediaId;
  12.  
  13. public String getMediaId() {
  14. return MediaId;
  15. }
  16.  
  17. public void setMediaId(String mediaId) {
  18. MediaId = mediaId;
  19. }
  20.  
  21. public String getThumbMediaId() {
  22. return ThumbMediaId;
  23. }
  24.  
  25. public void setThumbMediaId(String thumbMediaId) {
  26. ThumbMediaId = thumbMediaId;
  27. }
  28. }

6.音乐消息

如果要开发一个带歌曲点播功能的公众账号,肯定是希望用户发送歌曲名称后向用户回复一条音乐消息,用户点击该音乐消息就能够直接播放。回复音乐消息需要构造如下格式的数据:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[music]]></MsgType>
  6. <Music>
  7. <Title><![CDATA[TITLE]]></Title>
  8. <Description><![CDATA[DESCRIPTION]]></Description>
  9. <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
  10. <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
  11. </Music>
  12. </xml>

音乐消息中的主要参数描述如表4-9所示。

表4-9 音乐消息的主要参数描述

4.2.3 封装响应消息 - 图3


说明 ①ThumbMediaId不是音乐消息的必须参数,给用户回复音乐消息时可以不包含该参数。②所有公众账号都可以向用户回复音乐消息。


音乐消息对应的Java类如下:

  1. /**
  2. * 音乐消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class MusicMessage extends BaseMessage {
  8. // 音乐
  9. private Music Music;
  10.  
  11. public Music getMusic() {
  12. return Music;
  13. }
  14.  
  15. public void setMusic(Music music) {
  16. Music = music;
  17. }
  18. }

Music类的定义如下:

  1. /**
  2. * 音乐model
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class Music {
  8. // 音乐标题
  9. private String Title;
  10. // 音乐描述
  11. private String Description;
  12. // 音乐链接
  13. private String MusicUrl;
  14. // 高质量音乐链接,Wi-Fi环境优先使用该链接播放音乐
  15. private String HQMusicUrl;
  16. // 缩略图的媒体ID,通过上传多媒体文件得到的ID
  17. private String ThumbMediaId;
  18.  
  19. public String getTitle() {
  20. return Title;
  21. }
  22.  
  23. public void setTitle(String title) {
  24. Title = title;
  25. }
  26.  
  27. public String getDescription() {
  28. return Description;
  29. }
  30.  
  31. public void setDescription(String description) {
  32. Description = description;
  33. }
  34.  
  35. public String getMusicUrl() {
  36. return MusicUrl;
  37. }
  38.  
  39. public void setMusicUrl(String musicUrl) {
  40. MusicUrl = musicUrl;
  41. }
  42.  
  43. public String getHQMusicUrl() {
  44. return HQMusicUrl;
  45. }
  46.  
  47. public void setHQMusicUrl(String musicUrl) {
  48. HQMusicUrl = musicUrl;
  49. }
  50.  
  51. public String getThumbMediaId() {
  52. return ThumbMediaId;
  53. }
  54.  
  55. public void setThumbMediaId(String thumbMediaId) {
  56. ThumbMediaId = thumbMediaId;
  57. }
  58. }

7.图文消息

图文消息有着丰富的内容及多样化的表现形式。如果公众账号向用户回复图文消息,需要构造如下格式的数据:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>12345678</CreateTime>
  5. <MsgType><![CDATA[news]]></MsgType>
  6. <ArticleCount>2</ArticleCount>
  7. <Articles>
  8. <item>
  9. <Title><![CDATA[title1]]></Title>
  10. <Description><![CDATA[description1]]></Description>
  11. <PicUrl><![CDATA[picurl]]></PicUrl>
  12. <Url><![CDATA[url]]></Url>
  13. </item>
  14. <item>
  15. <Title><![CDATA[title]]></Title>
  16. <Description><![CDATA[description]]></Description>
  17. <PicUrl><![CDATA[picurl]]></PicUrl>
  18. <Url><![CDATA[url]]></Url>
  19. </item>
  20. </Articles>
  21. </xml>

图文消息中的主要参数描述如表4-10所示。

表4-10 图文消息的主要参数描述

4.2.3 封装响应消息 - 图4

图文消息对应的Java类如下:

  1. /**
  2. * 文本消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class NewsMessage extends BaseMessage {
  8. // 图文消息个数,限制为10条以内
  9. private int ArticleCount;
  10. // 多条图文消息信息,默认第一个item为大图
  11. private List<Article> Articles;
  12.  
  13. public int getArticleCount() {
  14. return ArticleCount;
  15. }
  16.  
  17. public void setArticleCount(int articleCount) {
  18. ArticleCount = articleCount;
  19. }
  20.  
  21. public List<Article> getArticles() {
  22. return Articles;
  23. }
  24.  
  25. public void setArticles(List<Article> articles) {
  26. Articles = articles;
  27. }
  28. }

Article类的定义如下:

  1. /**
  2. * 图文model
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class Article {
  8. // 图文消息名称
  9. private String Title;
  10. // 图文消息描述
  11. private String Description;
  12. // 图片链接,支持JPG、PNG格式,较好的效果为大图640像素×320像素,小图80像素×80像素
  13. private String PicUrl;
  14. // 点击图文消息跳转链接
  15. private String Url;
  16.  
  17. public String getTitle() {
  18. return Title;
  19. }
  20.  
  21. public void setTitle(String title) {
  22. Title = title;
  23. }
  24.  
  25. public String getDescription() {
  26. return null == Description ? "" : Description;
  27. }
  28.  
  29. public void setDescription(String description) {
  30. Description = description;
  31. }
  32.  
  33. public String getPicUrl() {
  34. return null == PicUrl ? "" : PicUrl;
  35. }
  36.  
  37. public void setPicUrl(String picUrl) {
  38. PicUrl = picUrl;
  39. }
  40.  
  41. public String getUrl() {
  42. return null == Url ? "" : Url;
  43. }
  44.  
  45. public void setUrl(String url) {
  46. Url = url;
  47. }
  48. }