Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回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消息体的接收及消息的处理