4.2.1 封装请求消息

当微信用户向公众账号发送消息时,微信服务器会将消息以XML格式通过POST方式发送到我们填写的URL(公众账号服务器的入口)上,开发者文档的“接收普通消息”中定义了每种请求消息的结构,如图4-5所示。

4.2.1 封装请求消息 - 图1

图4-5 接收普通消息

1.请求消息基类

为了减少代码冗余,我们将每种类型的请求消息都包含的参数提取出来封装成消息基类,这些参数包括:ToUserName、FromUserName、CreateTime、MsgType和MsgId。参数的描述如表4-1所示。

表4-1 请求消息公有的参数描述

4.2.1 封装请求消息 - 图2

表4-1中参数的详细说明如下。

●ToUserName是公众账号的原始微信号(原始ID),格式为ghxxxxxxxxxxxx(gh加上12位的字母、数字组合),可以在公众平台的账号信息中看到账号的原始ID。在公众平台发展初期,可以通过原始ID实现一键关注公众账号,后来由于种种原因原始ID的作用逐渐被弱化。

●FromUserName又称为OpenID,是一个类似于 "o5T57jihAcQVTgzbNvBx1m4jKk8s "的字符串,并不是用户的微信号。对于同一个公众账号,用户的OpenID是固定不变的,因此通过OpenID能够唯一标识一个用户。但对于不同的公众账号,同一个用户的OpenID是不一样的。

●CreateTime是一个整型的时间,它表示从1970年1月1日0时0分0秒至消息创建时所间隔的秒数。

●MsgType表示消息类型,公众账号服务器通过它来判断用户发送的是哪种类型的消息。其中,text表示文本消息,image表示图片消息,voice表示语音消息,video表示视频消息,location表示地理位置消息,link表示链接消息。

请求消息基类的代码如下:

  1. /**
  2. * 请求消息基类(普通用户 -> 公众账号)
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class BaseMessage {
  8. // 开发者微信号
  9. private String ToUserName;
  10. // 发送方账号(一个OpenID)
  11. private String FromUserName;
  12. // 消息创建时间 (整型)
  13. private long CreateTime;
  14. // 消息类型(text/image/location/link/voice)
  15. private String MsgType;
  16. // 消息ID,64位整型
  17. private long MsgId;
  18.  
  19. public String getToUserName() {
  20. return ToUserName;
  21. }
  22.  
  23. public void setToUserName(String toUserName) {
  24. ToUserName = toUserName;
  25. }
  26.  
  27. public String getFromUserName() {
  28. return FromUserName;
  29. }
  30.  
  31. public void setFromUserName(String fromUserName) {
  32. FromUserName = fromUserName;
  33. }
  34.  
  35. public long getCreateTime() {
  36. return CreateTime;
  37. }
  38.  
  39. public void setCreateTime(long createTime) {
  40. CreateTime = createTime;
  41. }
  42.  
  43. public String getMsgType() {
  44. return MsgType;
  45. }
  46.  
  47. public void setMsgType(String msgType) {
  48. MsgType = msgType;
  49. }
  50.  
  51. public long getMsgId() {
  52. return MsgId;
  53. }
  54.  
  55. public void setMsgId(long msgId) {
  56. MsgId = msgId;
  57. }
  58. }

2.文本消息

当用户向公众账号发送一段文字时,微信服务器会向公众账号服务器发送如下格式的消息:

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

其中,Content表示文本消息的内容。文本消息类需要继承基类BaseMessage,代码如下:

  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>1348831860</CreateTime>
  5. <MsgType><![CDATA[image]]></MsgType>
  6. <PicUrl><![CDATA[this is a url]]></PicUrl>
  7. <MsgId>1234567890123456</MsgId>
  8. </xml>

其中,PicUrl表示图片链接,开发者可以通过该链接从微信服务器上下载用户发送的图片。图片消息类的代码如下:

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

4.语音消息

当用户向公众账号发送语音时,公众账号服务器会收到如下格式的消息:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>1357290913</CreateTime>
  5. <MsgType><![CDATA[voice]]></MsgType>
  6. <MediaId><![CDATA[media_id]]></MediaId>
  7. <Format><![CDATA[Format]]></Format>
  8. <Recognition><![CDATA[腾讯微信团队]]></Recognition>
  9. <MsgId>1234567890123456</MsgId>
  10. </xml>

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

表4-2 语音消息的主要参数描述

4.2.1 封装请求消息 - 图3

语音消息类的代码如下:

  1. /**
  2. * 语音消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class VoiceMessage extends BaseMessage {
  8. // 媒体ID
  9. private String MediaId;
  10. // 语音格式
  11. private String Format;
  12. // 语音识别结果,UTF8编码
  13. private String Recognition;
  14.  
  15. public String getMediaId() {
  16. return MediaId;
  17. }
  18.  
  19. public void setMediaId(String mediaId) {
  20. MediaId = mediaId;
  21. }
  22.  
  23. public String getFormat() {
  24. return Format;
  25. }
  26.  
  27. public void setFormat(String format) {
  28. Format = format;
  29. }
  30.  
  31. public String getRecognition() {
  32. return Recognition;
  33. }
  34.  
  35. public void setRecognition(String recognition) {
  36. Recognition = recognition;
  37. }
  38. }

5.视频消息

当用户向公众账号发送视频消息时,公众账号服务器会收到如下格式的消息:

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

视频消息中的主要参数描述如表4-3所示。

表4-3 视频消息的主要参数描述

4.2.1 封装请求消息 - 图4

视频消息类的代码如下:

  1. /**
  2. * 视频消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class VideoMessage extends BaseMessage {
  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>1351776360</CreateTime>
  5. <MsgType><![CDATA[location]]></MsgType>
  6. <Location_X>23.134521</Location_X>
  7. <Location_Y>113.358803</Location_Y>
  8. <Scale>20</Scale>
  9. <Label><![CDATA[位置信息]]></Label>
  10. <MsgId>1234567890123456</MsgId>
  11. </xml>

地理位置消息中的主要参数描述如表4-4所示。

表4-4 地理位置消息的主要参数描述

4.2.1 封装请求消息 - 图5

地理位置消息类的代码如下:

  1. /**
  2. * 地理位置消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class LocationMessage extends BaseMessage {
  8. // 地理位置维度
  9. private String Location_X;
  10. // 地理位置经度
  11. private String Location_Y;
  12. // 地图缩放大小
  13. private String Scale;
  14. // 地理位置信息
  15. private String Label;
  16.  
  17. public String getLocation_X() {
  18. return Location_X;
  19. }
  20.  
  21. public void setLocation_X(String location_X) {
  22. Location_X = location_X;
  23. }
  24.  
  25. public String getLocation_Y() {
  26. return Location_Y;
  27. }
  28.  
  29. public void setLocation_Y(String location_Y) {
  30. Location_Y = location_Y;
  31. }
  32.  
  33. public String getScale() {
  34. return Scale;
  35. }
  36.  
  37. public void setScale(String scale) {
  38. Scale = scale;
  39. }
  40.  
  41. public String getLabel() {
  42. return Label;
  43. }
  44.  
  45. public void setLabel(String label) {
  46. Label = label;
  47. }
  48. }

7.链接消息

当用户向公众账号发送网页链接时,公众账号服务器会收到如下格式的消息:

  1. <xml>
  2. <ToUserName><![CDATA[toUser]]></ToUserName>
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>
  4. <CreateTime>1351776360</CreateTime>
  5. <MsgType><![CDATA[link]]></MsgType>
  6. <Title><![CDATA[公众平台官网链接]]></Title>
  7. <Description><![CDATA[公众平台官网链接]]></Description>
  8. <Url><![CDATA[url]]></Url>
  9. <MsgId>1234567890123456</MsgId>
  10. </xml>

链接消息中的主要参数描述如表4-5所示。

表4-5 链接消息的主要参数描述

4.2.1 封装请求消息 - 图6


说明 微信目前的版本(v5.1.0)还不支持用户向公众账号发送链接消息,链接消息只能发给朋友或微信群。链接消息的发送方法:通过微信内置浏览器打开网页,点击右上角分享按钮,选择“发送给朋友”,会弹出最近聊天的朋友和微信群列表,选择一个目标,点击“发送”即可向对方发送一条链接消息。对方在收到链接消息时,能够看到网页的标题和链接,点击链接消息会通过微信内置浏览器访问该网页。


链接消息类的代码如下:

  1. /**
  2. * 链接消息
  3. *
  4. * @author liufeng
  5. * @date 2013-09-11
  6. */
  7. public class LinkMessage extends BaseMessage {
  8. // 消息标题
  9. private String Title;
  10. // 消息描述
  11. private String Description;
  12. // 消息链接
  13. private String Url;
  14.  
  15. public String getTitle() {
  16. return Title;
  17. }
  18.  
  19. public void setTitle(String title) {
  20. Title = title;
  21. }
  22.  
  23. public String getDescription() {
  24. return Description;
  25. }
  26.  
  27. public void setDescription(String description) {
  28. Description = description;
  29. }
  30.  
  31. public String getUrl() {
  32. return Url;
  33. }
  34.  
  35. public void setUrl(String url) {
  36. Url = url;
  37. }
  38. }