前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java微信公众平台开发(四)--回复消息的分类及实体的创建
前面有说道对接收到微信服务器消息后对消息的分类,当时主要分为普通消息和事件消息,这里我们要讲述的是我们在给用户回复的消息类型,在这里也可以大致分为两类:一种为不需要上传资源到微信服务器的这里成为【普通消息回复】;还有一种需要上传资源到微信服务器的这里称为【多媒体消息回复】!
用户2417870
2019/09/18
6030
Java微信公众平台开发(四)--回复消息的分类及实体的创建
Java微信公众平台开发(五)--文本及图文消息回复的实现
上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为【普通消息】和【多媒体消息】,这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段【openid】,它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字!
用户2417870
2019/09/18
8230
Java企业微信开发_05_消息推送之被动回复消息
微信加解密包 下载地址:http://qydev.weixin.qq.com/java.zip      ,此包中封装好了AES加解密方法,直接调用方法即可。
shirayner
2018/08/10
4.2K0
Java微信公众平台开发_03_消息管理之被动回复消息
上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图,这个url就是回调url,是开发者用来接收微信消息和事件的接口URL 。也就是说,用户在微信公众号中发送的消息会被推送到这个回调url,而我们可以接收用户的消息,并进行回复。
shirayner
2018/08/10
5.4K0
Java微信公众平台开发_03_消息管理之被动回复消息
Java微信公众平台开发(八)--多媒体消息回复之音乐
我们上一篇写了关注出发图片的回复。想着在发送一次音乐,最后基于回复消息分类情况下,实现一个简单的只能话回复。先附一张大致效果图。
用户2417870
2019/09/18
6820
Java微信公众平台开发(七)--多媒体消息回复之图片回复
之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息,这里以图片消息的回复为例进行讲解!
用户2417870
2019/09/18
9950
Java微信公众平台开发(七)--多媒体消息回复之图片回复
Java微信公众平台开发(二)--微信服务器post消息体的接收
在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发现在上一篇的【controller】中我定义了一个get方法和一个post方法,但是在使用过程中我们就用了get方法,这里我们就来说说我们预留的post的方法的使用!
用户2417870
2019/09/18
2.2K0
Java微信公众平台开发(二)--微信服务器post消息体的接收
java微信自动回复机器人开发(java微信开发学习笔记3)「建议收藏」
微信自动回复机器人原理很简单,获取用户发送到后台的数据,然后调用机器人的api进行回复即可。我使用的茉莉机器人,官网地址如下: http://www.itpk.cn/ 茉莉机器人的api:http://www.itpk.cn/robot.php 接口比较简单,看看就会,我直接上源代码 下面代码同样基于之前的微博,需要的可以去看一下: http://blog.csdn.net/zxxz5201314/article/details/76917107 首先对用户发送的文本进行处理,特殊字段分别处理,同样Post请求:
全栈程序员站长
2022/11/10
1.6K0
微信公众号-其他消息
视频消息 接收样例 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <ThumbMediaId><![CDATA[thumb_media_id]]>
星哥玩云
2022/09/14
7360
微信公众号-其他消息
Spring Boot 如何给微信公众号返回消息
hello 各位小伙伴,今天我们来继续学习如何通过 Spring Boot 开发微信公众号。还没阅读过上篇文章的小伙伴建议先看看上文,有助于理解本文:
江南一点雨
2019/11/01
1K0
手把手教你如何微信公众号开发「建议收藏」
最近的话,发现微信开发其实也有很多挺有意思的地方,比如最近很火的一款游戏“跳一跳”,也让我如此着迷。。但是,今天我所要讲的并不是对于小程序的开发,而是要说一下,关于微信开发的另外一个内容,那就是微信公众号。。
全栈程序员站长
2022/09/25
3.5K0
手把手教你如何微信公众号开发「建议收藏」
微信公众号开发-素材/消息管理接口
本文是 微信公众号开发者模式介绍及接入 的后续,如没看过前文的话,可能看本文会有些懵逼。本文主要介绍微信公众平台的素材、消息管理接口的开发。由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信官方提供的测试号来进行开发。测试号的申请可参考下文:
端碗吹水
2020/09/23
2.5K0
微信公众号开发-素材/消息管理接口
Java微信公众平台开发(十)--微信用户信息的获取 (一)关注被动回复图文消息的实现。(二)pc界面显示用户
前面的文章有讲到微信的一系列开发文章,包括token获取、菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关联,所以在这里我们就采用openid去获取用户微信信息。并实现两个个简单场景应用:(一)当微信新用户关注我们的微信公众平台的时候我们自动回复一篇图文消息,然后在图文消息中标题为:【尊敬的:XXX,你好!】,而且在图文消息中的图片就是用户的微信头像,如下图:(二)pc界面显示用户的昵称,性别,头像
用户2417870
2019/09/18
1.1K0
Java微信公众平台开发(十)--微信用户信息的获取

        (一)关注被动回复图文消息的实现。(二)pc界面显示用户
微信公众平台开发入门教程[2020版]
在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序、MySQL数据库、计算机网络通讯、及HTTP/XML/CSS/JS等基础。
全栈程序员站长
2022/09/06
4.5K0
微信公众号开发消息推送以及图文推送
(adsbygoogle =window.adsbygoogle ||[]).push({});
猿码优创
2019/07/28
2K0
用微信来搞世界上最好的语言——消息收发SDK的实现
基础消息的SDK将前面章节的各种接收消息类型进行了处理,另外对被动发送消息类型进行了定义。
一粒小麦
2019/07/18
9620
用微信来搞世界上最好的语言——消息收发SDK的实现
微信公众号开发者模式介绍及接入
编辑模式和开发模式是互斥的关系,也就是说,当我们使用开发模式时,编辑模式下的操作就会失效。反之,使用编辑模式时,开发模式下的操作就会失效,所以只能使用其中一个模式进行公众号的开发。
端碗吹水
2020/09/23
1.4K0
微信公众号开发者模式介绍及接入
微信公众平台开发接口PHP SDK完整版
官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.0 2014-03-15 增加图片、视频、
joshua317
2018/04/10
2.6K0
手把手教你开发微信公众号后台
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2020/08/21
2.9K0
手把手教你开发微信公众号后台
微信个人公众号开发--(2)启用开发者模式接收并响应用户消息
微信的 URL 要求必须是: http:// 80端口,且必须是能够在公网访问的,本地的不行。所以这里用到一个映射工具叫做 ngrok 。下载之后使用,需要切换到下载ngrok文件目录下,cmd
浩Coding
2019/07/02
9930
微信个人公众号开发--(2)启用开发者模式接收并响应用户消息
推荐阅读
相关推荐
Java微信公众平台开发(四)--回复消息的分类及实体的创建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文