上一篇说了如何连接微信服务器,这篇来实现消息的接收和响应
先来看一下微信的消息是如何传递的,上代码
@RestController
public class WeChatController {
@Autowired
private WeChatService weChatService;
@RequestMapping(value="/WeixinServlet", method= RequestMethod.POST)
public String WeixinServlet(HttpServletRequest request)throws Exception{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String xml = weChatService.deal(request, response);
return xml;
}
}
@Service
public class WeChatService {
@Autowired
private DealMessageUtil dealMessageUtil;
@Autowired
private WeixinMessageInfo weixinMessageInfo;
public String deal(HttpServletRequest request, HttpServletResponse response) {
String respMessage = null;
try {
String respContent = null;
Map<String, String> map = dealMessageUtil.parseXml(request);
String fromUserName = map.get("FromUserName");
weixinMessageInfo.setFromUserName(fromUserName);
String toUserName = map.get("ToUserName");
weixinMessageInfo.setToUserName(toUserName);
String msgType = map.get("MsgType");
weixinMessageInfo.setMessageType(msgType);
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(dealMessageUtil.RESP_MESSAGE_TYPE_TEXT);
if (msgType.equals(dealMessageUtil.REQ_MESSAGE_TYPE_TEXT)){
respContent = "文本";
textMessage.setContent(respContent);
respMessage = dealMessageUtil.textMessageToXml(textMessage);
}
else if (msgType.equals(dealMessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = "图片";
textMessage.setContent(respContent);
respMessage = dealMessageUtil.textMessageToXml(textMessage);
}
else if (msgType.equals(dealMessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
respContent = "语音";
textMessage.setContent(respContent);
respMessage = dealMessageUtil.textMessageToXml(textMessage);
}
else if (msgType.equals(dealMessageUtil.REQ_MESSAGE_TYPE_VIDEO)) {
respContent = "视频";
textMessage.setContent(respContent);
respMessage = dealMessageUtil.textMessageToXml(textMessage);
}
else if (msgType.equals(dealMessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = "位置";
textMessage.setContent(respContent);
respMessage = dealMessageUtil.textMessageToXml(textMessage);
}
else if (msgType.equals(dealMessageUtil.REQ_MESSAGE_TYPE_LINK)) {
respContent = "链接";
textMessage.setContent(respContent);
respMessage = dealMessageUtil.textMessageToXml(textMessage);
}
else if (msgType.equals(dealMessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
String eventType =map.get("Event");
// 关注
if (eventType.equals(dealMessageUtil.EVENT_TYPE_SUBSCRIBE)){
//此处可以写自己的逻辑
}
// 取消关注
else if (eventType.equals(dealMessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
//此处可以写自己的逻辑
}
else if (eventType.equals(dealMessageUtil.EVENT_TYPE_SCAN)) {
System.out.println("扫描带参数二维码");
}
else if (eventType.equals(dealMessageUtil.EVENT_TYPE_LOCATION)) {
System.out.println("地理位置");
}
else if (eventType.equals(dealMessageUtil.EVENT_TYPE_CLICK)) {
// 事件KEY值,与创建自定义菜单时指定的KEY值对应
String eventKey=map.get("EventKey");
}
else if (eventType.equals(dealMessageUtil.EVENT_TYPE_VIEW)) {
System.out.println("跳转页面");
}
}
} catch (Exception e) {
e.printStackTrace();
respMessage = null;
}
return respMessage;
}
}
@Component
public class DealMessageUtil {
public final String REQ_MESSAGE_TYPE_TEXT = "text";
public final String REQ_MESSAGE_TYPE_IMAGE="image";
public final String REQ_MESSAGE_TYPE_VOICE="voice";
public final String REQ_MESSAGE_TYPE_VIDEO="video";
public final String REQ_MESSAGE_TYPE_LINK = "link";
public final String REQ_MESSAGE_TYPE_LOCATION="location";
public final String REQ_MESSAGE_TYPE_SHORTVIDEO="shortvideo";
public final String REQ_MESSAGE_TYPE_EVENT = "event";
public final String RESP_MESSAGE_TYPE_TEXT = "text";
public final String RESP_MESSAGE_TYPE_IMAGE="image";
public final String RESP_MESSAGE_TYPE_VOICE = "voice";
public final String RESP_MESSAGE_TYPE_MUSIC = "music";
public final String RESP_MESSAGE_TYPE_NEWS = "news";
public final String RESP_MESSAGE_TYPE_VIDEO="video";
public final String EVENT_TYPE_SUBSCRIBE = "subscribe";
public final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
public final String EVENT_TYPE_SCAN = "scan";
public final String EVENT_TYPE_LOCATION = "location";
public final String EVENT_TYPE_CLICK ="CLICK";
public final String EVENT_TYPE_VIEW ="VIEW";
public Map<String, String> parseXml(HttpServletRequest request)throws Exception{
Map<String, String>map =new HashMap<String, String>();
InputStream inputStream=request.getInputStream();
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> elementList = root.elements();
if (elementList.size()==0){
map.put(root.getName(), root.getText());
}else {
for (Element e : elementList)
map.put(e.getName(), e.getText());
}
inputStream.close();
inputStream = null;
return map;
}
//文本消息对象转换成xml
public String textMessageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
//图文消息对象转换成xml
public String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);
}
//图片消息对象转换成xml
public String imageMessageToXml(ImageMessage imageMessage) {
xstream.alias("xml", imageMessage.getClass());
return xstream.toXML(imageMessage);
}
//语音消息对象转换成xml
public String voiceMessageToXml(VoiceMessage voiceMessage) {
xstream.alias("xml", voiceMessage.getClass());
return xstream.toXML(voiceMessage);
}
//视频消息对象转换成xml
public String videoMessageToXml(VideoMessage videoMessage) {
xstream.alias("xml", videoMessage.getClass());
return xstream.toXML(videoMessage);
}
//音乐消息对象转换成xml
public String musicMessageToXml(MusicMessage musicMessage) {
xstream.alias("xml", musicMessage.getClass());
return xstream.toXML(musicMessage);
}
private XStream xstream = new XStream(new XppDriver() {
@Override
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
boolean cdata = true;
@Override
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}
@Override
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write(text);
} else {
writer.write(text);
}
}
};
}
});
}
@Component
public class WeixinMessageInfo implements Serializable {
private static final long serialVersionUID = 1L;
private String fromUserName;
private String toUserName;
private String weixinUserName;
private String messageType;
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getWeixinUserName() {
return weixinUserName;
}
public void setWeixinUserName(String weixinUserName) {
this.weixinUserName = weixinUserName;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
@Override
public String toString() {
return "WeixinMessageInfo{" +
"fromUserName='" + fromUserName + '\'' +
", toUserName='" + toUserName + '\'' +
", weixinUserName='" + weixinUserName + '\'' +
", messageType='" + messageType + '\'' +
'}';
}
}
下面是上面代码中各种消息的封装实体类
public class BaseMessage {
private String ToUserName;
private String FromUserName;
private long CreateTime;
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;
}
}
//图片信息
public class Image {
private String MediaId;
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
}
public class ImageMessage extends BaseMessage {
private Image image;
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
}
//音乐消息
public class Music {
private String Title;
private String Description;
private String MusicUrl;
private String HQMusicUrl;
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 HQMusicUrl) {
this.HQMusicUrl = HQMusicUrl;
}
public String getThumbMediaId() {
return ThumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
ThumbMediaId = thumbMediaId;
}
}
public class MusicMessage extends BaseMessage {
private Music music;
public Music getMusic() {
return music;
}
public void setMusic(Music music) {
this.music = music;
}
}
//图文消息
public class Article {
private String Title;
private String Description;
private String PicUrl;
private String Url;
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 getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
}
public class NewsMessage extends BaseMessage {
private int ArticleCount;
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;
}
}
//文本消息
public class TextMessage extends BaseMessage {
private String Content;
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
}
//视频消息
public class Video {
private String MediaId;
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;
}
}
public class VideoMessage extends BaseMessage {
private Video video;
public Video getVideo() {
return video;
}
public void setVideo(Video video) {
this.video = video;
}
}
//音频消息
public class Voice {
private String mediaId;
public String getMediaId() {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
}
public class VoiceMessage extends BaseMessage {
private Voice voice;
public Voice getVoice() {
return voice;
}
public void setVoice(Voice voice) {
this.voice = voice;
}
}
代码借鉴自:https://blog.csdn.net/qq_40715775/article/details/79878757