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

转自:http://www.cuiyongzhi.com/post/41.html

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

(一)消息实体基础类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

package com.cuiyongzhi.wechat.message.req;

/**

 * ClassName: BaseMessage

 * @Description: 微信请求消息基本类

 * @author dapengniao

 * @date 2016年3月7日 下午3:03:59

 */

public class BaseMessage {

    // 开发者微信号

    private String ToUserName;

    // 发送方帐号(一个OpenID)

    private String FromUserName;

    // 消息创建时间 (整型)

    private long CreateTime;

    // 消息类型(text/image/location/link/video/shortvideo)

    private String MsgType;

    // 消息id,64位整型

    private long MsgId;

    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 long getMsgId() {

        return MsgId;

    }

    public void setMsgId(long msgId) {

        MsgId = msgId;

    }

}

(二)普通消息pojo实体

①图片消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package com.cuiyongzhi.wechat.message.req;

/**

 * ClassName: ImageMessage

 * @Description: 图片消息

 * @author dapengniao

 * @date 2016年3月7日 下午3:04:52

 */

public class ImageMessage extends BaseMessage {

    // 图片链接

    private String PicUrl;

    public String getPicUrl() {

        return PicUrl;

    }

    public void setPicUrl(String picUrl) {

        PicUrl = picUrl;

    }

}

②连接消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

package com.cuiyongzhi.wechat.message.req;

/**

 * ClassName: LinkMessage

 * @Description: 连接消息

 * @author dapengniao

 * @date 2016年3月7日 下午3:05:48

 */

public class LinkMessage extends BaseMessage {

    // 消息标题

    private String Title;

    // 消息描述

    private String Description;

    // 消息链接

    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 getUrl() {

        return Url;

    }

    public void setUrl(String url) {

        Url = url;

    }

}

③地理位置消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

package com.cuiyongzhi.wechat.message.req;

/**

 * ClassName: LocationMessage

 * @Description: 地理位置消息

 * @author dapengniao

 * @date 2016年3月7日 下午3:06:10

 */

public class LocationMessage extends BaseMessage {  

    // 地理位置维度   

    private String Location_X;  

    // 地理位置经度   

    private String Location_Y;  

    // 地图缩放大小   

    private String Scale;  

    // 地理位置信息   

    private String Label;  

  

    public String getLocation_X() {  

        return Location_X;  

    }  

  

    public void setLocation_X(String location_X) {  

        Location_X = location_X;  

    }  

  

    public String getLocation_Y() {  

        return Location_Y;  

    }  

  

    public void setLocation_Y(String location_Y) {  

        Location_Y = location_Y;  

    }  

  

    public String getScale() {  

        return Scale;  

    }  

  

    public void setScale(String scale) {  

        Scale = scale;  

    }  

  

    public String getLabel() {  

        return Label;  

    }  

  

    public void setLabel(String label) {  

        Label = label;  

    }  

}

④文本消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package com.cuiyongzhi.wechat.message.req;

/**

 * ClassName: TextMessage

 * @Description: 文本消息

 * @author dapengniao

 * @date 2016年3月7日 下午3:06:40

 */

public class TextMessage extends BaseMessage {  

    // 消息内容   

    private String Content;  

  

    public String getContent() {  

        return Content;  

    }  

  

    public void setContent(String content) {  

        Content = content;  

    }  

}

⑤视频/小视屏消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package com.cuiyongzhi.wechat.message.req;

/**

 * ClassName: VideoMessage

 * @Description: 视频/小视屏消息

 * @author dapengniao

 * @date 2016年3月7日 下午3:12:51

 */

public class VideoMessage extends BaseMessage {

    private String MediaId; // 视频消息媒体id,可以调用多媒体文件下载接口拉取数据

    private String ThumbMediaId; // 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据

    public String getMediaId() {

        return MediaId;

    }

    public void setMediaId(String mediaId) {

        MediaId = mediaId;

    }

    public String getThumbMediaId() {

        return ThumbMediaId;

    }

    public void setThumbMediaId(String thumbMediaId) {

        ThumbMediaId = thumbMediaId;

    }

}

⑥语音消息


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package com.cuiyongzhi.wechat.message.req;

/**

 * ClassName: VoiceMessage

 * @Description: 语音消息

 * @author dapengniao

 * @date 2016年3月7日 下午3:07:10

 */

public class VoiceMessage extends BaseMessage {  

    // 媒体ID   

    private String MediaId;  

    // 语音格式   

    private String Format;  

  

    public String getMediaId() {  

        return MediaId;  

    }  

  

    public void setMediaId(String mediaId) {  

        MediaId = mediaId;  

    }  

  

    public String getFormat() {  

        return Format;  

    }  

  

    public void setFormat(String format) {  

        Format = format;  

    }  

}

(三)消息分类处理

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

package com.cuiyongzhi.wechat.dispatcher;

import java.util.Map;

import com.cuiyongzhi.wechat.util.MessageUtil;

/**

 * ClassName: MsgDispatcher

 * @Description: 消息业务处理分发器

 * @author dapengniao

 * @date 2016年3月7日 下午4:04:21

 */

public class MsgDispatcher {

    public static String processMessage(Map<String, String> map) {

        if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { // 文本消息

            System.out.println("==============这是文本消息!");

        }

        

        if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { // 图片消息

            System.out.println("==============这是图片消息!");

        }

        

        

        if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) { // 链接消息

            System.out.println("==============这是链接消息!");

        }

        

        

        if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) { // 位置消息

            System.out.println("==============这是位置消息!");

        }

        

        

        if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) { // 视频消息

            System.out.println("==============这是视频消息!");

        }

        

        

        if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) { // 语音消息

            System.out.println("==============这是语音消息!");

        }

        return null;

    }

}

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

package com.cuiyongzhi.wechat.dispatcher;

import java.util.Map;

import com.cuiyongzhi.wechat.util.MessageUtil;

/**

 * ClassName: EventDispatcher

 * @Description: 事件消息业务分发器

 * @author dapengniao

 * @date 2016年3月7日 下午4:04:41

 */

public class EventDispatcher {

    public static String processEvent(Map<String, String> map) {

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { //关注事件

            System.out.println("==============这是关注事件!");

        }

        

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) { //取消关注事件

            System.out.println("==============这是取消关注事件!");

        }

        

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SCAN)) { //扫描二维码事件

            System.out.println("==============这是扫描二维码事件!");

        }

        

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_LOCATION)) { //位置上报事件

            System.out.println("==============这是位置上报事件!");

        }

        

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_CLICK)) { //自定义菜单点击事件

            System.out.println("==============这是自定义菜单点击事件!");

        }

        

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_VIEW)) { //自定义菜单View事件

            System.out.println("==============这是自定义菜单View事件!");

        }

        

        

        return null;

    }

}

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

package com.cuiyongzhi.wechat.controller;

import java.io.PrintWriter;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import com.cuiyongzhi.wechat.dispatcher.EventDispatcher;

import com.cuiyongzhi.wechat.dispatcher.MsgDispatcher;

import com.cuiyongzhi.wechat.util.MessageUtil;

import com.cuiyongzhi.wechat.util.SignUtil;

@Controller

@RequestMapping("/wechat")

public class WechatSecurity {

    private static Logger logger = Logger.getLogger(WechatSecurity.class);

    /**

     

     * @Description: 用于接收get参数,返回验证参数

     * @param @param request

     * @param @param response

     * @param @param signature

     * @param @param timestamp

     * @param @param nonce

     * @param @param echostr

     * @author dapengniao

     * @date 2016年3月4日 下午6:20:00

     */

    @RequestMapping(value = "security", method = RequestMethod.GET)

    public void doGet(

            HttpServletRequest request,

            HttpServletResponse response,

            @RequestParam(value = "signature", required = true) String signature,

            @RequestParam(value = "timestamp", required = true) String timestamp,

            @RequestParam(value = "nonce", required = true) String nonce,

            @RequestParam(value = "echostr", required = true) String echostr) {

        try {

            if (SignUtil.checkSignature(signature, timestamp, nonce)) {

                PrintWriter out = response.getWriter();

                out.print(echostr);

                out.close();

            else {

                logger.info("这里存在非法请求!");

            }

        catch (Exception e) {

            logger.error(e, e);

        }

    }

    /**

     * @Description: 接收微信端消息处理并做分发

     * @param @param request

     * @param @param response   

     * @author dapengniao

     * @date 2016年3月7日 下午4:06:47

     */

    @RequestMapping(value = "security", method = RequestMethod.POST)

    public void DoPost(HttpServletRequest request,HttpServletResponse response) {

        try{

            Map<String, String> map=MessageUtil.parseXml(request);

            String msgtype=map.get("MsgType");

            if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(msgtype)){

                EventDispatcher.processEvent(map); //进入事件处理

            }else{

                MsgDispatcher.processMessage(map); //进入消息处理

            }

        }catch(Exception e){

            logger.error(e,e);

        }

    }

}

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

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

前面讲述的都是消息的接收,那么下一篇起将讲述【回复消息的分类及实体的创建】,感谢你的翻阅,如有疑问可以留言一起讨论!

原文地址:https://www.cnblogs.com/sharpest/p/10231266.html

时间: 2024-10-18 01:31:39

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

Java微信公众平台开发(四)--回复消息的分类及实体的创建

转自:http://www.cuiyongzhi.com/post/42.html 前面有说道对接收到微信服务器消息后对消息的分类,当时主要分为普通消息和事件消息,这里我们要讲述的是我们在给用户回复的消息类型,在这里也可以大致分为两类:一种为不需要上传资源到微信服务器的这里成为[普通消息回复]:还有一种需要上传资源到微信服务器的这里称为[多媒体消息回复]! 普通消息回复:回复文本消息/回复图文消息 多媒体消息回复:回复图片消息/回复语音消息/回复视频消息/回复音乐消息 (一)回复消息基类的实现

微信公众平台开发【接收消息】接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上.服务器在解析此数据包,获取相关参数的值从而做出回复.接收普通消息主要包括:文本消息.图片消息.语音消息.视频消息.小视频消息.地理位置消息.链接消息.XML数据包结构和相关参数如下: 1.文本消息 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fr

java微信公众平台开发三(多图文素材界面)

最新在做微信的多图文管理,自己写了一个模仿微信的多图文的界面,有需要的可以参取参考参考,改改就能用哈! 里面我以及集成了ajax 上传文件的插件了,不想要的可以自己换,截图如下: 代码地址 版权声明:本文为博主原创文章,未经博主允许不得转载.

Java微信公众平台开发_02_启用服务器配置

一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[  Java微信公众平台开发_01_本地服务器映射外网  ] 2.一个微信公众平台账号: 去注册:(https://mp.weixin.qq.com/) 3.策略文件 见:[ Java企业微信开发_Exception_02_java.security.InvalidKeyException: Illegal key size ] 4.微信官方消息加解密工具包 需要下载微信官方的消息加解密的工具包,主要是AES加密工具 下载地址:

微信公众平台开发(97) 图文消息

关键字:微信公众平台 开发模式 图文消息作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-97-news.html 在这篇微信公众平台开发教程中,我们将介绍如何灵活的使用图文消息功能.我们将只介绍被动回复消息中的图文消息,发送客服消息及高级群发消息接口的发送的图文消息与本文介绍的图文消息的各情况基本一致. 本文分为以下四个部分: 图文消息的定义 图文消息的实现 图文消息的类型 图文消息的回复 一.图文消息的定义 在微信公众平台消息中,发送被动响

微信公众平台开发(102) 模版消息

关键字:微信公众平台 模版消息作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/wechat-template-message.html 在这篇微信公众平台开发教程中,我们将介绍如何开发模版消息,即如何用程序发送模版消息功能.本文分为以下三个部分: 申请模版消息权限 开发模版消息SDK 构造模版消息体并发送 一.申请模版消息权限 模版消息的申请需账号已经开通微信支付权限. 在微信公众平台的后台,依次进入“功能->添加功能插件->模版消息”,即可申请模版消息

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut

微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)

微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定的模板,每个账号可以使用25个模板,模板消息上线每日10万次,粉丝数上涨到10w/100w/1000w/模板消息的上线次数会自动上调.模板接口调用主要注意事项:模板ID和模板赋值这两点.模板参数内容必须以.DATA结尾,模板保留符号"{{}}".使用步骤如下: 1.设置所属行业,这个可以在

Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是很完全所以导致部分同学在有些地方做开发的时候遇到了一些阻力,收到这些朋友同学们的咨询反馈之后我也做了一些反思和总结,其中一部分同学说少了GlobalConstants这个文件(这个真心占的不少),还有一部分就是说源码的问题,所以今天特意抽了时间补充下这两点! (一)关于GlobalConstants