在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装。
(一)封装请求信息
首先打开微信提供的开发者文档:http://mp.weixin.qq.com/wiki/home/ ,点击左侧的“消息管理”----“接收普通消息”,在右侧我们可以看到微信普通消息类型大致有:文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息、链接消息;通过查看开发者文档,我们可以发现消息类型的格式为xml,以文本消息为例:
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType>< ![CDATA[text] ]></MsgType>
<Content>< ![CDATA[this is a test] ]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
当我们接收消息的时候,微信将向我们发送Post请求,并以XML的格式发送与接收数据。那么此时我们就需要一个工具类来处理XML格式的文件:MessageType.parseXml()
1 package com.webchat.util.weixin;
2
3 import java.io.InputStream;
4 import java.io.Writer;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 import org.dom4j.Document;
13 import org.dom4j.Element;
14 import org.dom4j.io.SAXReader;
15
16 import com.thoughtworks.xstream.XStream;
17 import com.thoughtworks.xstream.core.util.QuickWriter;
18 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
19 import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
20 import com.thoughtworks.xstream.io.xml.XppDriver;
21 import com.webchat.entity.PageData;
22
23 public class MessageType {
24 /*
25 * 文本消息
26 */
27 public static final String TEXT_MESSAGE = "text";
28 /*
29 * 图片消息
30 */
31 public static final String IMAGE_MESSAGE = "image";
32 /*
33 * 语音消息
34 */
35 public static final String VOICE_MESSAGE = "voice";
36 /*
37 * 视频消息
38 */
39 public static final String VIDEO_MESSAGE = "video";
40 /*
41 * 小视频消息消息
42 */
43 public static final String SHORTVIDEO_MESSAGE = "shortvideo";
44 /*
45 * 地理位置消息
46 */
47 public static final String POSOTION_MESSAGE = "location";
48 /*
49 * 链接消息
50 */
51 public static final String LINK_MESSAGE = "link";
52 /*
53 * 音乐消息
54 */
55 public static final String MUSIC_MESSAGE = "music";
56 /*
57 * 图文消息
58 */
59 public static final String IMAGE_TEXT_MESSAGE = "news";
60 /*
61 * 请求消息类型:事件推送
62 */
63 public static final String REQ_MESSAGE_TYPE_EVENT = "event";
64 /*
65 * 事件类型:subscribe(订阅)
66 */
67 public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
68 /*
69 * 事件类型:unsubscribe(取消订阅)
70 */
71 public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
72 /*
73 * 事件类型:scan(用户已关注时的扫描带参数二维码)
74 */
75 public static final String EVENT_TYPE_SCAN = "scan";
76 /*
77 * 事件类型:LOCATION(上报地理位置)
78 */
79 public static final String EVENT_TYPE_LOCATION = "location";
80 /*
81 * 事件类型:CLICK(自定义菜单)
82 */
83 public static final String EVENT_TYPE_CLICK = "click";
84
85 /*
86 * 响应消息类型:文本
87 */
88 public static final String RESP_MESSAGE_TYPE_TEXT = "text";
89 /*
90 * 响应消息类型:图片
91 */
92 public static final String RESP_MESSAGE_TYPE_IMAGE = "image";
93 /*
94 * 响应消息类型:语音
95 */
96 public static final String RESP_MESSAGE_TYPE_VOICE = "voice";
97 /*
98 * 响应消息类型:视频
99 */
100 public static final String RESP_MESSAGE_TYPE_VIDEO = "video";
101 /*
102 * 响应消息类型:音乐
103 */
104 public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
105 /*
106 * 响应消息类型:图文
107 */
108 public static final String RESP_MESSAGE_TYPE_NEWS = "news";
109
110 /**
111 * @Title parseXml
112 * @Description 将用户的xml消息提取成map key value 类型
113 * @param request
114 * @param response
115 * @return
116 * @throws Exception
117 */
118 public static Map<String, String> parseXml(HttpServletRequest request, HttpServletResponse response)
119 throws Exception {
120 // 将解析结果存储在HashMap中
121 Map<String, String> map = new HashMap<String, String>();
122 // 从request中取得输入流
123 InputStream inputStream = request.getInputStream();
124 // 读取输入流
125 SAXReader reader = new SAXReader();
126 Document document = reader.read(inputStream);
127 // 得到xml根元素
128 Element root = document.getRootElement();
129 // 得到根元素的所有子节点
130 List<Element> elementList = root.elements();
131 // 遍历所有子节点
132 for (Element e : elementList) {
133 map.put(e.getName(), e.getText());
134 }
135 // 释放资源
136 inputStream.close();
137 inputStream = null;
138 return map;
139 }
140 }
通过对开发文档的分析我们可以发现这些消息类型中,都会传回来这些公共的字段如:
ToUserName(开发者微信号);
FromUserName(发送方帐 号,OPEN_ID);
CreateTime(消息的创建时间);
MsgType(消息类型);
MsgId(消息ID)。
我们把这些封装成一个基类,然后 不同的部分,分别封装为各自的类然后继承这个基类,提高代码的重用性。
(一)消息实体基础类 -- BaseMessage
1 package com.webchat.entity.message;
2
3 /**
4 * 请求消息的公共字段类
5 *
6 * @author Administrator
7 *
8 */
9 public abstract class BaseMessage {
10 // 开发者微信号
11 private String ToUserName;
12 // 发送方帐号(一个OpenID)
13 private String FromUserName;
14 // 消息创建时间 (整型)
15 private long CreateTime;
16 // 消息id,64位整型
17 private long MsgId;
18 /**
19 * 获取 消息类型
20 *
21 * @return 消息类型
22 */
23 public abstract String getMsgType();
24
25 public String getToUserName() {
26 return ToUserName;
27 }
28
29 public void setToUserName(String toUserName) {
30 ToUserName = toUserName;
31 }
32
33 public String getFromUserName() {
34 return FromUserName;
35 }
36
37 public void setFromUserName(String fromUserName) {
38 FromUserName = fromUserName;
39 }
40
41 public long getCreateTime() {
42 return CreateTime;
43 }
44
45 public void setCreateTime(long createTime) {
46 CreateTime = createTime;
47 }
48
49 public long getMsgId() {
50 return MsgId;
51 }
52
53 public void setMsgId(long msgId) {
54 MsgId = msgId;
55 }
56 }
(二)普通消息类
1,文本消息
1 package com.webchat.entity.message;
2
3 import com.webchat.util.weixin.MessageType;
4
5 /**
6 * 文本消息
7 * @author Administrator
8 *
9 */
10 public class TextMessage extends BaseMessage {
11 //文本消息内容
12 private String Content;
13
14 public String getContent() {
15 return Content;
16 }
17
18 public void setContent(String content) {
19 Content = content;
20 }
21
22 @Override
23 public String getMsgType() {
24 return MessageType.TEXT_MESSAGE.toString();
25 }
26
27 }
2,图片消息
1 package com.webchat.entity.message;
2
3 import com.webchat.util.weixin.MessageType;
4 /**
5 * 图片消息
6 * @author Administrator
7 *
8 */
9 public class ImageMessage extends BaseMessage{
10 // 图片链接
11 private String PicUrl;
12 //图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
13 private String MediaId;
14
15 public String getPicUrl() {
16 return PicUrl;
17 }
18
19 public void setPicUrl(String picUrl) {
20 PicUrl = picUrl;
21 }
22
23 public String getMediaId() {
24 return MediaId;
25 }
26
27 public void setMediaId(String mediaId) {
28 MediaId = mediaId;
29 }
30
31 @Override
32 public String getMsgType() {
33 return MessageType.IMAGE_MESSAGE.toString();
34 }
35
36 }
3,语音消息
1 package com.webchat.entity.message;
2
3 import com.webchat.util.weixin.MessageType;
4
5 /**
6 * 语音消息
7 *
8 * @author Administrator
9 *
10 */
11 public class VoiceMessage extends BaseMessage {
12 // 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
13 private String MediaId;
14 // 语音格式,如amr,speex等
15 private String Format;
16 // 语音识别结果,使用UTF8编码
17 private String Recognition;
18
19 public String getMediaId() {
20 return MediaId;
21 }
22
23 public void setMediaId(String mediaId) {
24 MediaId = mediaId;
25 }
26
27 public String getFormat() {
28 return Format;
29 }
30
31 public void setFormat(String format) {
32 Format = format;
33 }
34
35 public String getRecognition() {
36 return Recognition;
37 }
38
39 public void setRecognition(String recognition) {
40 Recognition = recognition;
41 }
42
43 @Override
44 public String getMsgType() {
45 return MessageType.VOICE_MESSAGE.toString();
46 }
47
48 }
4,视频消息
1 package com.webchat.entity.message;
2
3 import com.webchat.util.weixin.MessageType;
4 /**
5 * 视频消息
6 * @author Administrator
7 *
8 */
9 public class VideoMessage extends BaseMessage {
10 // 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
11 private String MediaId;
12 // 视频消息 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
13 private String ThumbMediaId;
14
15 public String getMediaId() {
16 return MediaId;
17 }
18
19 public void setMediaId(String mediaId) {
20 MediaId = mediaId;
21 }
22
23 public String getThumbMediaId() {
24 return ThumbMediaId;
25 }
26
27 public void setThumbMediaId(String thumbMediaId) {
28 ThumbMediaId = thumbMediaId;
29 }
30
31 @Override
32 public String getMsgType() {
33 return MessageType.VIDEO_MESSAGE.toString();
34 }
35
36 }
5,小视频消息
1 package com.webchat.entity.message;
2
3 import com.webchat.util.weixin.MessageType;
4 /**
5 * 小视频消息
6 * @author Administrator
7 *
8 */
9 public class ShortVideoInputMessage extends BaseMessage {
10 // 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
11 private String MediaId;
12 // 视频消息 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
13 private String ThumbMediaId;
14
15 public String getMediaId() {
16 return MediaId;
17 }
18
19 public void setMediaId(String mediaId) {
20 MediaId = mediaId;
21 }
22
23 public String getThumbMediaId() {
24 return ThumbMediaId;
25 }
26
27 public void setThumbMediaId(String thumbMediaId) {
28 ThumbMediaId = thumbMediaId;
29 }
30
31 @Override
32 public String getMsgType() {
33 return MessageType.SHORTVIDEO_MESSAGE.toString();
34 }
35 }
6,地理位置消息
1 package com.webchat.entity.message;
2
3 import com.webchat.util.weixin.MessageType;
4
5 /**
6 * 地理位置消息
7 *
8 * @author Administrator
9 *
10 */
11 public class LocationMessage extends BaseMessage {
12 // 地理位置维度
13 private String Location_X;
14 // 地理位置经度
15 private String Location_Y;
16 // 地图缩放大小
17 private Long Scale;
18 // 地理位置信息
19 private String Label;
20
21 public String getLocation_X() {
22 return Location_X;
23 }
24
25 public void setLocation_X(String location_X) {
26 Location_X = location_X;
27 }
28
29 public String getLocation_Y() {
30 return Location_Y;
31 }
32
33 public void setLocation_Y(String location_Y) {
34 Location_Y = location_Y;
35 }
36
37 public Long getScale() {
38 return Scale;
39 }
40
41 public void setScale(Long scale) {
42 Scale = scale;
43 }
44
45 public String getLabel() {
46 return Label;
47 }
48
49 public void setLabel(String label) {
50 Label = label;
51 }
52
53 @Override
54 public String getMsgType() {
55 return MessageType.POSOTION_MESSAGE.toString();
56 }
57
58 }
7,链接消息
1 package com.webchat.entity.message;
2
3 import com.webchat.util.weixin.MessageType;
4
5 /**
6 * 链接消息
7 *
8 * @author Administrator
9 *
10 */
11 public class LinkMessage extends BaseMessage {
12 // 消息标题
13 private String Title;
14 // 消息描述
15 private String Description;
16 // 消息链接
17 private String Url;
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 getUrl() {
36 return Url;
37 }
38
39 public void setUrl(String url) {
40 Url = url;
41 }
42
43 @Override
44 public String getMsgType() {
45 return MessageType.LINK_MESSAGE.toString();
46 }
47
48 }
(二)封装事件
点击左侧的“消息管理”----“接收事件推送”,在右侧我们可以看到微信接收事件推送的目录:关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件、点击菜单拉取消息时的事件推送、点击菜单跳转链接时的事件推送;推送XML数据包 和消息文本的类似,详情参考开发者文档
提取公共字段创建基础类
1 package com.webchat.entity.event;
2
3 /**
4 * 事件消息
5 *
6 * @author Administrator
7 *
8 */
9 public abstract class BaseEvent {
10 // 开发者微信号
11 private String ToUserName;
12 // 发送方帐号(一个OpenID)
13 private String FromUserName;
14 // 消息创建时间 (整型)
15 private long CreateTime;
16 // 消息类型
17 private String MsgType;
18 // 事件类型
19 private String Event;
20
21 public String getEvent() {
22 return Event;
23 }
24
25 public void setEvent(String event) {
26 Event = event;
27 }
28
29 public String getToUserName() {
30 return ToUserName;
31 }
32
33 public void setToUserName(String toUserName) {
34 ToUserName = toUserName;
35 }
36
37 public String getFromUserName() {
38 return FromUserName;
39 }
40
41 public void setFromUserName(String fromUserName) {
42 FromUserName = fromUserName;
43 }
44
45 public long getCreateTime() {
46 return CreateTime;
47 }
48
49 public void setCreateTime(long createTime) {
50 CreateTime = createTime;
51 }
52
53 public String getMsgType() {
54 return MsgType;
55 }
56
57 public void setMsgType(String msgType) {
58 MsgType = msgType;
59 }
60 }
事件封装
1,关注/取消事件
1 package com.webchat.entity.event;
2 /**
3 * 关注取消事件
4 * @author Administrator
5 *
6 */
7 public class SubscribeEvent extends BaseEvent{
8
9 }
2,扫描参数带二维码事件
1 package com.webchat.entity.event;
2
3 /**
4 * 扫描带参数二维码事件
5 *
6 * @author Administrator
7 *
8 */
9 public class QRCodeEvent extends BaseEvent {
10 // 事件KEY值
11 private String EventKey;
12 // 用于换取二维码图片
13 private String Ticket;
14
15 public String getEventKey() {
16 return EventKey;
17 }
18
19 public void setEventKey(String eventKey) {
20 EventKey = eventKey;
21 }
22
23 public String getTicket() {
24 return Ticket;
25 }
26
27 public void setTicket(String ticket) {
28 Ticket = ticket;
29 }
30
31 }
3,上报地理位置事件
1 package com.webchat.entity.event;
2
3 /**
4 * 上报地理位置事件
5 *
6 * @author Administrator
7 *
8 */
9 public class LocationEvent extends BaseEvent {
10 // 地理位置纬度
11 private String Latitude;
12 // 地理位置经度
13 private String Longitude;
14 // 地理位置精度
15 private String Precision;
16
17 public String getLatitude() {
18 return Latitude;
19 }
20
21 public void setLatitude(String latitude) {
22 Latitude = latitude;
23 }
24
25 public String getLongitude() {
26 return Longitude;
27 }
28
29 public void setLongitude(String longitude) {
30 Longitude = longitude;
31 }
32
33 public String getPrecision() {
34 return Precision;
35 }
36
37 public void setPrecision(String precision) {
38 Precision = precision;
39 }
40
41 }
4,自定义菜单事件
1 package com.webchat.entity.event;
2
3 /**
4 * 自定义菜单事件
5 * @author Administrator
6 *
7 */
8 public class MenuEvent extends BaseEvent {
9 // 事件KEY值,与自定义菜单接口中KEY值对应
10 private String EventKey;
11
12 public String getEventKey() {
13 return EventKey;
14 }
15
16 public void setEventKey(String eventKey) {
17 EventKey = eventKey;
18 }
19
20 }
(三)回复消息的分类及实体的封装
点击左侧的“消息管理”----“被动回复用户消息”,当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。详情请查看开发者文档
同样,把消息回复中定义的所有消息都有的字段提取出来,封装成一个公共类,
响应消息的基类BaseOutMessage
1 package com.webchat.entity.output;
2
3 /**
4 * 回复消息的公共字段类
5 *
6 * @author Administrator
7 *
8 */
9 public abstract class BaseOutMessage {
10 // 接收方帐号(收到的OpenID)
11 private String ToUserName;
12 // 开发者微信号
13 private String FromUserName;
14 // 消息创建时间 (整型)
15 private long CreateTime;
16
17 // 获取消息类型
18 public abstract String getMsgType();
19
20 public String getToUserName() {
21 return ToUserName;
22 }
23
24 public void setToUserName(String toUserName) {
25 ToUserName = toUserName;
26 }
27
28 public String getFromUserName() {
29 return FromUserName;
30 }
31
32 public void setFromUserName(String fromUserName) {
33 FromUserName = fromUserName;
34 }
35
36 public long getCreateTime() {
37 return CreateTime;
38 }
39
40 public void setCreateTime(long createTime) {
41 CreateTime = createTime;
42 }
43
44 }
普通消息回复实体实现
1,回复文本消息
1 package com.webchat.entity.output;
2
3 import com.webchat.util.weixin.MessageType;
4
5 /**
6 * 文本回复消息
7 *
8 * @author Administrator
9 *
10 */
11 public class TextMessage extends BaseOutMessage {
12 // 文本消息
13 private String Content;
14
15 public String getContent() {
16 return Content;
17 }
18
19 public void setContent(String content) {
20 Content = content;
21 }
22
23 @Override
24 public String getMsgType() {
25 return MessageType.RESP_MESSAGE_TYPE_TEXT.toString();
26 }
27 }
2,回复图片消息
1 package com.webchat.entity.output;
2
3
4 /**
5 * 图片回复消息
6 * @author Administrator
7 *
8 */
9 public class Image{
10 //通过上传多媒体文件,得到的id
11 private String MediaId;
12
13 public String getMediaId() {
14 return MediaId;
15 }
16
17 public void setMediaId(String mediaId) {
18 MediaId = mediaId;
19 }
20 }
1 package com.webchat.entity.output;
2
3 import com.webchat.util.weixin.MessageType;
4 /**
5 * 图片输出内容
6 * @author Administrator
7 *
8 */
9 public class ImageOutputMessage extends BaseOutMessage{
10 private Image Image;
11 public Image getImage() {
12 return Image;
13 }
14 public void setImage(Image image) {
15 Image = image;
16 }
17 @Override
18 public String getMsgType() {
19 return MessageType.RESP_MESSAGE_TYPE_IMAGE.toString();
20 }
21 }
3,回复语音消息
1 package com.webchat.entity.output;
2 /**
3 * 语音model
4 * @author Administrator
5 *
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
19 }
1 package com.webchat.entity.output;
2
3 import com.webchat.util.weixin.MessageType;
4 /**
5 * 语音回复消息
6 * @author Administrator
7 *
8 */
9 public class VoiceOutputMessage extends BaseOutMessage{
10 private Voice voice;
11
12 public Voice getVoice() {
13 return voice;
14 }
15
16 public void setVoice(Voice voice) {
17 this.voice = voice;
18 }
19
20 @Override
21 public String getMsgType() {
22 return MessageType.RESP_MESSAGE_TYPE_VOICE.toString();
23 }
24 }
4,回复视频消息
1 package com.webchat.entity.output;
2 /**
3 * 视频model
4 * @author Administrator
5 *
6 */
7 public class Video {
8 // 媒体文件id
9 private String MediaId;
10 // 缩略图的媒体id
11 private String ThumbMediaId;
12 //视频消息的标题
13 private String Title;
14 //视频消息的描述
15 private String Description;
16 public String getMediaId() {
17 return MediaId;
18 }
19
20 public void setMediaId(String mediaId) {
21 MediaId = mediaId;
22 }
23
24 public String getThumbMediaId() {
25 return ThumbMediaId;
26 }
27
28 public void setThumbMediaId(String thumbMediaId) {
29 ThumbMediaId = thumbMediaId;
30 }
31
32 public String getTitle() {
33 return Title;
34 }
35
36 public void setTitle(String title) {
37 Title = title;
38 }
39
40 public String getDescription() {
41 return Description;
42 }
43
44 public void setDescription(String description) {
45 Description = description;
46 }
47
48 }
1 package com.webchat.entity.output;
2
3 import com.webchat.util.weixin.MessageType;
4
5 /**
6 * 回复视频消息
7 *
8 * @author Administrator
9 *
10 */
11 public class VideoOutPutMessage extends BaseOutMessage {
12 private Video Video;
13
14 public Video getVideo() {
15 return Video;
16 }
17
18 public void setVideo(Video video) {
19 Video = video;
20 }
21
22 @Override
23 public String getMsgType() {
24 return MessageType.RESP_MESSAGE_TYPE_VIDEO.toString();
25 }
26 }
5,回复音乐消息
1 package com.webchat.entity.output;
2 /**
3 * 回复音乐消息中的音乐对象
4 * @author Administrator
5 *
6 */
7 public class Music {
8 // 音乐标题
9 private String Title;
10 // 音乐描述
11 private String Description;
12 // 音乐链接
13 private String MusicUrl;
14 // 高质量音乐链接,WIFI环境优先使用该链接播放音乐
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 hQMusicUrl) {
48 HQMusicUrl = hQMusicUrl;
49 }
50
51 public String getThumbMediaId() {
52 return ThumbMediaId;
53 }
54
55 public void setThumbMediaId(String thumbMediaId) {
56 ThumbMediaId = thumbMediaId;
57 }
58
59 }
1 package com.webchat.entity.output;
2
3 import com.webchat.util.weixin.MessageType;
4 /**
5 * 回复音乐消息
6 * @author Administrator
7 *
8 */
9 public class MusicOutputMessage extends BaseOutMessage {
10 private Music Music;
11
12 public Music getMusic() {
13 return Music;
14 }
15
16 public void setMusic(Music music) {
17 Music = music;
18 }
19
20 @Override
21 public String getMsgType() {
22 return MessageType.RESP_MESSAGE_TYPE_MUSIC.toString();
23 }
24 }
6,回复图文消息
1 package com.webchat.entity.output;
2 /**
3 * 图文消息实体类对象
4 * @author Administrator
5 *
6 */
7 public class Articles {
8 private String Title;
9 // 图文消息描述
10 private String Description;
11 // 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80
12 private String PicUrl;
13 // 点击图文消息跳转链接
14 private String Url;
15
16 public String getTitle() {
17 return Title;
18 }
19
20 public void setTitle(String title) {
21 Title = title;
22 }
23
24 public String getDescription() {
25 return Description;
26 }
27
28 public void setDescription(String description) {
29 Description = description;
30 }
31
32 public String getPicUrl() {
33 return PicUrl;
34 }
35
36 public void setPicUrl(String picUrl) {
37 PicUrl = picUrl;
38 }
39
40 public String getUrl() {
41 return Url;
42 }
43
44 public void setUrl(String url) {
45 Url = url;
46 }
47 }
1 package com.webchat.entity.output;
2
3 import java.util.List;
4 import com.webchat.util.weixin.MessageType;
5
6 /**
7 * 提供了获取多条图文消息信息
8 *
9 * @author Administrator
10 *
11 */
12 public class NewsOutputMessage extends BaseOutMessage {
13 // 图文消息个数,限制为10条以内
14 private int ArticleCount;
15 // 多条图文消息信息,默认第一个item为大图
16 private List<Articles> Articles;
17
18 public int getArticleCount() {
19 return ArticleCount;
20 }
21
22 public void setArticleCount(int articleCount) {
23 ArticleCount = articleCount;
24 }
25
26 public List<Articles> getArticles() {
27 return Articles;
28 }
29
30 public void setArticles(List<Articles> articles) {
31 Articles = articles;
32 }
33
34 @Override
35 public String getMsgType() {
36 return MessageType.RESP_MESSAGE_TYPE_NEWS.toString();
37 }
38 }
至此,我们所有的内容已经封装完成
接下来会更新:微信服务器 post 消息体的接收及消息处理的内容
如果在操作过程中有问题,欢迎随时讨论^.^
百度云链接:https://pan.baidu.com/s/1xQIAl14_9JKJi1BsFe7yvw 密码:ybnv
备注:我的是maven项目,此链接只为分享封装的实体类,如果项目中出现错误,可不用理会,只拿自己想要的东西即可
其他文章关联
(一)Java开发微信公众号(一)---初识微信公众号以及环境搭建
(二)Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
(三)Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
(四)Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
来源:oschina
链接:https://my.oschina.net/u/4317818/blog/3835287