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

前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端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<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——事件消息的业务分发处理

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

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

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

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

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

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

(0)

相关推荐

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

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

  • 微信支付java版本之JSAPI支付+发送模板消息

    本文为大家分享了java版本之JSAPI支付+发送模板消息的相关资料,供大家参考,具体内容如下 1.工具类 工具类见:微信支付JAVA版本之Native付款 2.公众账号设置 3.代码实现 openId:openId为用户与该公众账号之间代表用户的唯一标示  以下类中涉及到生成token,关闭订单接口调用,获取配置文件信息,和工具类,在其他文章中有具体代码实现 package com.zhrd.bussinss.platform.controller.rest; import java.io.F

  • Java微信公众平台开发(5) 文本及图文消息回复的实现

    上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为[普通消息]和[多媒体消息],这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段[openid],它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字! (一)回复文本消息 在前面我们已经完成了对消息的分类和回复消息实体的建立,这里回复文本消息需要用到的就是我们的TextMessage,我们把回复文本消息在[文本消息]类型中给出回复!在我们做消息回复的时候需要设置消息的接收人ToU

  • java微信开发第二步 获取消息和回复消息

    接着上一篇java微信开发API第一步 服务器接入进行学习,下面介绍java微信开发第二步:获取消息和回复消息,具体内容如下 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet

  • Java调用微信客服消息实现发货通知的方法详解

    本文实例讲述了Java调用微信客服消息实现发货通知的方法.分享给大家供大家参考,具体如下: 微信文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547&token=&lang=zh_CN 个人说明:这是一个样例,微信客户消息有很多种,我现在用的是公众号发送消息.样子如下图. 说明:下面开始代码部分了. 1.首先看微信文档.这里才是我们需要的 这里是说发消息要POST请求这个接口:https://a

  • Java开发微信公众号接收和被动回复普通消息

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本消息 2.图片消息 3.语音消息 4.视频消息 5.小视频消息 6.地理位置消息 7.链接消息(被动回复的消息) 被动回复的普通消息包括: 1.回复文本消息 2.回复图片消息 3.回复语音消息 4.回复视频消息 5.回复音乐消息 6.回复图文消息 其实接收消息和被动回复消息这两个动作是不分家的,这本

  • java微信企业号开发之发送消息(文本、图片、语音)

    上篇文章介绍了开启回调模式,开始回调模式后我们就要实现聊天功能了.平时使用微信聊天可以发送文本消息.语音.图片.视频等,这里只实现了其中的一些功能和大家分享. 一.与微信企业号建立连接 1.企业应用调用企业号提供的接口,管理或查询企业号后台所管理的资源.或给成员发送消息等,以下称主动调用模式. 2.企业号把用户发送的消息或用户触发的事件推送给企业应用,由企业应用处理,以下称回调模式. 3.用户在微信中阅读企业应用下发的H5页面,该页面可以调用微信提供的原生接口,使用微信开放的终端能力,以下称JS

  • java微信开发API第二步 获取和回复消息

    微信开发API如何获取和回复消息,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.t

  • JAVA实现 springMVC方式的微信接入、实现消息自动回复实例

    前段时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 1.思路 微信接入:用户消息和开发者需要的事件推送都会通过微信方服务器发起一个请求,转发到你在公众平台配置的服务器url地址,微信方将带上signature,timestamp,nonce,echostr四个参数,我们自己服务器通过拼接公众平台配置的token,以及传上来的timestamp,nonce进行SHA1加密后匹配signa

  • Java微信公众平台开发(2) 微信服务器post消息体的接收

    在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发现在上一篇的[controller]中我定义了一个get方法和一个post方法,但是在使用过程中我们就用了get方法,这里我们就来说说我们预留的post的方法的使用! 当我们在完成了服务器验证之后,此后用户每次向公众号发送消息.或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等!通过这

  • 微信java开发之实现微信主动推送消息

    1.拉取access_token2.拉取用户信息3.主动推送消息4.接口貌似要申请权限5.依赖httpclient4.2.3 和jackson 2.2.1 复制代码 代码如下: public class WeixinAPIHelper { /**  * 获取token接口  */ private String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=

随机推荐