热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要为大家详细介绍了Java微信公众平台开发第三步,接收消息的分类及实体的创建,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

(一)消息实体基础类

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实体

①图片消息

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;
 }
}

②连接消息

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;
 }
}

③地理位置消息

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; 
 } 
}

④文本消息

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; 
 } 
}

⑤视频/小视屏消息

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;
 }
 
}

⑥语音消息

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——用于普通消息的业务分发处理

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 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——事件消息的业务分发处理

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 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方法做些修改,最终结果如下:

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 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);
  }
 }
}

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 本文详细介绍了 Flink 和 YARN 的交互机制。YARN 是 Hadoop 生态系统中的资源管理组件,类似于 Spark on YARN 的配置方式。我们将基于官方文档,深入探讨如何在 YARN 上部署和运行 Flink 任务。 ... [详细]
author-avatar
书友62423539
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有