千家信息网

如何使用java实现微信分类接收消息以及创建实体

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,这篇文章给大家分享的是有关如何使用java实现微信分类接收消息以及创建实体的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。(一)消息实体基础类package com.cuiy
千家信息网最后更新 2024年11月19日如何使用java实现微信分类接收消息以及创建实体

这篇文章给大家分享的是有关如何使用java实现微信分类接收消息以及创建实体的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

(一)消息实体基础类

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

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

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

感谢各位的阅读!关于"如何使用java实现微信分类接收消息以及创建实体"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0