Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java微信公众平台开发(三)--接收消息的分类及实体的创建

Java微信公众平台开发(三)--接收消息的分类及实体的创建

作者头像
用户2417870
发布于 2019-09-18 03:36:30
发布于 2019-09-18 03:36:30
1K00
代码可运行
举报
文章被收录于专栏:g歌德ag歌德a
运行总次数:0
代码可运行

前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实体以方便我们后面的使用!

(一)创建消息实体基础类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.message.request;
 2 /**
 3 * @author gede
 4 * @version date:2019年5月23日 下午6:36:31
 5 * @description :
 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/video/shortvideo)
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 }

(二)创建普通消息pojo实体

①图片消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.message.request;
 2 /**
 3 * @author gede
 4 * @version date:2019年5月23日 下午6:38:50
 5 * @description :
 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 }

②链接消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.message.request;
 2 /**
 3 * @author gede
 4 * @version date:2019年5月23日 下午6:39:07
 5 * @description :
 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 }

③地理位置消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.message.request;
 2 /**
 3 * @author gede
 4 * @version date:2019年5月23日 下午6:39:18
 5 * @description :
 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 }

④文本消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.message.request;
 2 /**
 3 * @author gede
 4 * @version date:2019年5月23日 下午6:39:32
 5 * @description :
 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 }

⑤视频/小视屏消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.message.request;
 2 
 3 /**
 4 * @author gede
 5 * @version date:2019年5月23日 下午6:40:46
 6 * @description :
 7 */
 8 public class VideoMessage extends BaseMessage {
 9 
10     private String MediaId; // 视频消息媒体 id,可以调用多媒体文件下载接口拉取数据
11     private String ThumbMediaId; // 视频消息缩略图的媒体 id,可以调用多媒体文件下载接口拉取数据
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 
29 }

语音消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.message.request;
 2 /**
 3 * @author gede
 4 * @version date:2019年5月23日 下午6:41:02
 5 * @description :
 6 */
 7 public class VoiceMessage extends BaseMessage {  
 8     // 媒体 ID   
 9     private String MediaId;  
10     // 语音格式   
11     private String Format;  
12 
13     public String getMediaId() {  
14         return MediaId;  
15     }  
16 
17     public void setMediaId(String mediaId) {  
18         MediaId = mediaId;  
19     }  
20 
21     public String getFormat() {  
22         return Format;  
23     }  
24 
25     public void setFormat(String format) {  
26         Format = format;  
27     }  
28 }

(三)消息分类处理

按照上面收到想消息类别分别做不同的分发处理,这里我们建立了自己的业务分发器(EventDispatcher、MsgDispatcher),分别做普通消息处理和事件消息处理!

①MsgDispatcher.java——用于普通消息的业务分发处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.dispatcher;
 2 
 3 import java.util.Map;
 4 
 5 import com.gede.wechat.util.MessageUtil;
 6 
 7 /**
 8 * @author gede
 9 * @version date:2019年5月23日 下午6:49:11
10 * @description :
11 */
12 public class MsgDispatcher {
13     public static String processMessage(Map<String, String> map) {
14         if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { // 文本消息
15             System.out.println("==============这是文本消息!");
16         }
17         if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { // 图片消息
18             System.out.println("==============这是图片消息!");
19         }
20         if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) { // 链接消息
21             System.out.println("==============这是链接消息!");
22         }
23         if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) { // 位置消息
24             System.out.println("==============这是位置消息!");
25         }
26         if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) { // 视频消息
27             System.out.println("==============这是视频消息!");
28         }
29         if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) { // 语音消息
30             System.out.println("==============这是语音消息!");
31         }
32  
33         return null;
34     }
35 }

②EventDispatcher.java——事件消息的业务分发处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.dispatcher;
 2 
 3 import java.util.Map;
 4 
 5 import com.gede.wechat.util.MessageUtil;
 6 
 7 /**
 8  * @author gede
 9  * @version date:2019年5月23日 下午6:49:59
10  * @description :
11  */
12 public class EventDispatcher {
13     public static String processEvent(Map<String, String> map) {
14         if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { // 关注事件
15             System.out.println("==============这是关注事件!");
16         }
17 
18         if (map.get("Event").equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) { // 取消关注事件
19             System.out.println("==============这是取消关注事件!");
20         }
21 
22         if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SCAN)) { // 扫描二维码事件
23             System.out.println("==============这是扫描二维码事件!");
24         }
25 
26         if (map.get("Event").equals(MessageUtil.EVENT_TYPE_LOCATION)) { // 位置上报事件
27             System.out.println("==============这是位置上报事件!");
28         }
29 
30         if (map.get("Event").equals(MessageUtil.EVENT_TYPE_CLICK)) { // 自定义菜单点击事件
31             System.out.println("==============这是自定义菜单点击事件!");
32         }
33 
34         if (map.get("Event").equals(MessageUtil.EVENT_TYPE_VIEW)) { // 自定义菜单View事件
35             System.out.println("==============这是自定义菜单View事件!");
36         }
37 
38         return null;
39     }
40 }

这个时候我们需要把我们的消息入口【WechatSecurity.java】中的post方法做些修改,最终结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package com.gede.wechat.controller;
 2 
 3 import java.io.PrintWriter;
 4 import java.util.Map;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 import org.apache.log4j.Logger;
10 import org.springframework.stereotype.Controller;
11 import org.springframework.web.bind.annotation.RequestMapping;
12 import org.springframework.web.bind.annotation.RequestMethod;
13 import org.springframework.web.bind.annotation.RequestParam;
14 
15 import com.gede.wechat.dispatcher.EventDispatcher;
16 import com.gede.wechat.dispatcher.MsgDispatcher;
17 import com.gede.wechat.util.MessageUtil;
18 import com.gede.wechat.util.SignUtil;
19 
20 /**
21 * @author gede
22 * @version date:2019年5月22日 下午2:53:46
23 * @description :
24 */
25 @Controller
26 @RequestMapping("/wechat")
27 public class WechatSecurity {
28     private static Logger logger = Logger.getLogger(WechatSecurity.class);
29  
30     @RequestMapping(value = "security", method = RequestMethod.GET)
31     public void doGet(
32             HttpServletRequest request,
33             HttpServletResponse response,
34             @RequestParam(value = "signature", required = true) String signature,
35             @RequestParam(value = "timestamp", required = true) String timestamp,
36             @RequestParam(value = "nonce", required = true) String nonce,
37             @RequestParam(value = "echostr", required = true) String echostr) {
38         try {
39             if (SignUtil.checkSignature(signature, timestamp, nonce)) {
40                 PrintWriter out = response.getWriter();
41                 out.print(echostr);
42                 out.close();
43             } else {
44                 logger.info("这里存在非法请求!");
45             }
46         } catch (Exception e) {
47             logger.error(e, e);
48         }
49     }
50  
51     /**
52      * @Description: 接收微信端消息处理并做分发
53      * @param @param request
54      * @param @param response   
55      * @author dapengniao
56      * @date 2016年3月7日 下午4:06:47
57      */
58     @RequestMapping(value = "security", method = RequestMethod.POST)
59     public void DoPost(HttpServletRequest request,HttpServletResponse response) {
60         try{
61             Map<String, String> map=MessageUtil.parseXml(request);
62             String msgtype=map.get("MsgType");
63             if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(msgtype)){
64                 EventDispatcher.processEvent(map); //进入事件处理
65             }else{
66                 MsgDispatcher.processMessage(map); //进入消息处理
67             }
68         }catch(Exception e){
69             logger.error(e,e);
70         }
71     }
72 }

最后我们运行成功项目之后我们可以通过发送不同类型的消息来验证我们的消息分类的正确性,如下图所示:

新建了这么多文件,最后来看下我们的整个项目的目录结构:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
学会这个BBC,你的图也可以上新闻啦!
英国广播公司(British Broadcasting Corporation;BBC)是全球最大的新闻媒体,其中各类新闻稿件采用的统计图表能很好地传达信息。为了方便清洗可重复数据和绘制图表,BBC数据团队用R对数据进行处理和可视化,经年累月下于去年整理绘图经验并开发了R包-bbplot,帮助我们画出和BBC新闻中一样好看的图形。
生信宝典
2022/04/19
4.4K0
学会这个BBC,你的图也可以上新闻啦!
跟着Global Change Biology学作图:R语言ggplot2点线图(1)
本地pdf Global Change Biology - 2022 - Feng - Changes in plant inputs alter soil carbon and microbial communities in forest.pdf
用户7010445
2023/01/06
6020
跟着Global Change Biology学作图:R语言ggplot2点线图(1)
跟着GlobalChangeBiology学作图:R语言ggplot2点线图(2)给分面添加注释
本地pdf Global Change Biology - 2022 - Feng - Changes in plant inputs alter soil carbon and microbial communities in forest.pdf
用户7010445
2023/01/06
6680
跟着GlobalChangeBiology学作图:R语言ggplot2点线图(2)给分面添加注释
复现GMM文章(一):图1代码和数据
所有的数据百度网盘链接: https://pan.baidu.com/s/1isKEK1G5I6X90KYqLufmWw
生信学习者
2024/07/17
830
复现GMM文章(一):图1代码和数据
目前最全的R语言-图片的组合与拼接
李誉辉,四川大学硕士在读,研究数据分析与可视化,以及网络爬虫。誉辉兄最近出的文章都是很系统的,从R ggplot2的基础讲解到三维数据可视化plot3D,文章都整理讲解得很全面系统,我本人也是很喜欢这样的文章,故而推荐给大家。
生信宝典
2019/09/29
5.6K0
目前最全的R语言-图片的组合与拼接
跟着PNAS学画图:R语言ggplot2分组添加拟合曲线
这篇论文的数据和代码是公开的,链接是 https://github.com/CPop-SDU/sex-gap-e0-pnas,我们按照他提供的代码和数据试着复原一下论文里的图。今天的推文重复的内容是论文中的Figure1A
用户7010445
2021/09/22
2.5K0
学好R语言绘图,你只需这样一个网站就够了
话不多说,上网址: https://www.r-graph-gallery.com/ r-garp-gallery收入了大量利用R语言绘制的图形,这些图形包含了很多方面,通过这个网站,我们可以方便直观观察到R语言所能做的一些图形。
不温卜火
2020/10/28
1.4K0
学好R语言绘图,你只需这样一个网站就够了
基于 R 语言的科研论文绘图技巧详解(4)
在查阅文献的过程中,看到了几幅非常不错的出版图,今天就跟着小编一起学习下,他们是怎么使用 R 绘制出来的。
庄闪闪
2022/05/24
8550
基于 R 语言的科研论文绘图技巧详解(4)
ggplot做蝴蝶图
蝴蝶图是一种形似蝴蝶双向柱状图。做GO term 的时候常常同时展现上调和下调的数据,因此,这里用ggplot2绘制GO term双向柱状图。 输入数据为clusterProfiler的GO term 结果,其他方式做的go term 也可,这里只用到通路和Pvalue。
生信编程日常
2020/05/08
1.2K0
跟着nature microbiology学绘图-多元素注释小提琴图
R语言数据分析指南
2024/03/11
1890
跟着nature microbiology学绘图-多元素注释小提琴图
怎样绘出高级感的图形?ggdark
小伙伴们有没有发现,一些展示图更换背景后会看起来比较有质感呢~今天介绍一个可以更换图片背景的R包——ggdark
作图丫
2022/03/28
4020
怎样绘出高级感的图形?ggdark
动态图可视化:如何、创建具有精美动画图
原文链接:http://tecdat.cn/?p=8003 演示数据集 library(gapminder) head(gapminder) ## # A tibble: 6 x 6 ## cou
拓端
2021/12/16
9250
动态图可视化:如何、创建具有精美动画图
gganimate动画GIF | 让你的图形跳动起来!!!
随着互联网+和大数据科技的发展,VFX可视化和数据可视化越来越受到人们的喜爱,在R语言中,绘制GIF动图主要是在gganimate包中运行,制作视频主要是在av包,gganimate是图形语法的扩展,由ggplot2包实现,它增加了对使用ggplot2用户熟悉的API声明动画的支持
黑妹的小屋
2020/08/06
1.8K0
跟着Science学作图:R语言ggplot2画箭头展示变量对主成分的贡献
https://www.science.org/doi/10.1126/science.abk0989
用户7010445
2022/05/23
7670
跟着Science学作图:R语言ggplot2画箭头展示变量对主成分的贡献
没想到修个火山图这么麻烦
MAplot转录组差异基因表达展示_maplot r语言_TS的美梦的博客-CSDN博客自己也顺着这线索另外找了教程
生信菜鸟团
2023/09/09
7250
没想到修个火山图这么麻烦
R函数,如何“抄”出水平
前面给大家介绍了,自己不会写R函数如何去“抄”高手写好的函数,我们直接“拿来”用就可以了。有读者反映为什么不直接用gdcVolcanoPlot这个函数,既然人家都已经写好了。这是一个很好的问题,这里我解答一下。原因有两个
生信交流平台
2020/10/23
9690
R函数,如何“抄”出水平
全网最全的R语言基础图形合集
直方图是一种对数据分布情况进行可视化的图形,它是二维统计图表,对应两个坐标分别是统计样本以及该样本对应的某个属性如频率等度量。
生信学习者
2024/06/12
1120
全网最全的R语言基础图形合集
酷不酷炫!想不想学!带统计学的PCoA完美解决打样本量多组数据不好区分的问题!!
由于高通量测序的价格降的越来越低,现在很多人的研究已经从早期几个、十几个样品的研究发展到了几十、几百、甚至上千个样品,这种确实在以扩增子测序为基础的研究中越发明显。
DataCharm
2021/02/22
1.7K0
酷不酷炫!想不想学!带统计学的PCoA完美解决打样本量多组数据不好区分的问题!!
R 数据可视化 02 | 火山图
链接:https://pan.baidu.com/s/1niWjcaJOuimO4NQHzHmvIA 提取码:q6am
白墨石
2021/01/13
9510
R 数据可视化 02 | 火山图
跟着Nature学作图:R语言ggplot2散点图和柱形图完整示例(Extended Fig3)
https://www.nature.com/articles/s41586-022-05275-y
用户7010445
2023/01/06
6090
跟着Nature学作图:R语言ggplot2散点图和柱形图完整示例(Extended Fig3)
推荐阅读
相关推荐
学会这个BBC,你的图也可以上新闻啦!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验