SpringBoot开发微信公众号(二)

上一篇说了如何连接微信服务器,这篇来实现消息的接收和响应

先来看一下微信的消息是如何传递的,上代码

@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

                      https://blog.csdn.net/qq_40715775/article/details/79912600

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值