欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java微信二次开发(三) Java微信各类型消息封装

程序员文章站 2024-03-31 12:42:22
本文实例为大家分享了java微信各种类型消息的封装,供大家参考,具体内容如下 第一步:找到com.wtz.message.response包,新建类image.jav...

本文实例为大家分享了java微信各种类型消息的封装,供大家参考,具体内容如下

第一步:找到com.wtz.message.response包,新建类image.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午8:38:37
 * version:1.0
 * description:图片的实体类
 */
public class image {
 //图片媒体id
 private string mediaid;
 
 public string getmediaid() {
 return mediaid;
 }
 public void setmediaid(string mediaid) {
 mediaid = mediaid;
 }
}

第二步:找到com.wtz.message.response包,新建类imagemessage.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午8:49:57
 * version:1.0
 * description:图片消息类
 */
public class imagemessage extends basemessage {
 //图片对象
 private image image;

 public image getimage() {
 return image;
 }

 public void setimage(image image) {
 this.image = image;
 }
}

第三步:找到com.wtz.message.response包,新建类video.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午9:02:14
 * version:1.0
 * description:视频的实体类
 */
public class video {
 //视频消息的媒体id
 private string mediaid;
 //视频消息的标题
 private string title;
 //视频消息的描述
 private string description;
 
 public string getmediaid() {
 return mediaid;
 }
 public void setmediaid(string mediaid) {
 mediaid = mediaid;
 }
 public string gettitle() {
 return title;
 }
 public void settitle(string title) {
 title = title;
 }
 public string getdescription() {
 return description;
 }
 public void setdescription(string description) {
 description = description;
 }
}

第四步:找到com.wtz.message.response包,新建类videomessage.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午9:10:14
 * version:1.0
 * description:视频消息类
 */
public class videomessage extends basemessage{
 //视频对象
 private video video;

 public video getvideo() {
 return video;
 }

 public void setvideo(video video) {
 this.video = video;
 }
}

第五步:找到com.wtz.message.response包,新建类voice.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午9:21:47
 * version:1.0
 * description:语音消息实体类
 */
public class voice {
 //语音媒体编号
 private string mediaid;
 
 public string getmediaid() {
 return mediaid;
 }
 public void setmediaid(string mediaid) {
 mediaid = mediaid;
 }
}

第六步:找到com.wtz.message.response包,新建类voicemessage.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午9:44:58
 * version:1.0</p>
 * description:语音消息类
 */
public class voicemessage extends basemessage{
 //语音对象
 private voice voice;

 public voice getvoice() {
 return voice;
 }

 public void setvoice(voice voice) {
 this.voice = voice;
 }
} 

第七步:找到com.wtz.message.response包,新建类music.java

package com.wtz.message.response;
/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午9:48:11
 * version:1.0
 * description:音乐消息实体类
 */
public class music {
 //音乐标题
 private string title;
 //音乐描述
 private string description;
 //音乐链接
 private string musicurl;
 //高品质音乐链接
 private string hqmusicurl;
 //缩略图的媒体id
 private string thumbmediaid;
 
 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 getmusicurl() {
 return musicurl;
 }
 public void setmusicurl(string musicurl) {
 musicurl = musicurl;
 }
 public string gethqmusicurl() {
 return hqmusicurl;
 }
 public void sethqmusicurl(string hqmusicurl) {
 hqmusicurl = hqmusicurl;
 }
 public string getthumbmediaid() {
 return thumbmediaid;
 }
 public void setthumbmediaid(string thumbmediaid) {
 thumbmediaid = thumbmediaid;
 }
}

第八步:找到com.wtz.message.response包,新建类musicmessage.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午9:58:21
 * <p>version:1.0</p>
 * <p>description:音乐消息类</p>
 */
public class musicmessage extends basemessage{
 //音乐对象
 private music music;

 public music getmusic() {
 return music;
 }

 public void setmusic(music music) {
 this.music = music;
 }
}

第九步:找到com.wtz.message.response包,新建类article.java

package com.wtz.message.response;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午10:05:29
 * <p>version:1.0</p>
 * <p>description:图文实体类</p>
 */
public class article {
 //图文标题
 private string title;
 //图文描述
 private string description;
 //图片链接,支持jpg,png格式,较好的效果为大图
 private string picurl;
 //图文消息跳转链接
 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 getpicurl() {
 return picurl;
 }
 public void setpicurl(string picurl) {
 picurl = picurl;
 }
 public string geturl() {
 return url;
 }
 public void seturl(string url) {
 url = url;
 }
}

第十步:找到com.wtz.message.response包,新建类newsmessage.java

package com.wtz.message.response;

import java.util.list;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午10:16:22
 * <p>version:1.0</p>
 * <p>description:图文消息类</p>
 */
public class newsmessage extends basemessage{
 //图文条数
 private int articlecount;
 //多条图文消息信息,默认第一个item为大图
 private list<article> articles;
 
 public int getarticlecount() {
 return articlecount;
 }
 public void setarticlecount(int articlecount) {
 articlecount = articlecount;
 }
 public list<article> getarticles() {
 return articles;
 }
 public void setarticles(list<article> articles) {
 articles = articles;
 }
}

第十一步:新建包com.wtz.message.request,新建类basemessage.java

package com.wtz.message.request;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午10:53:23
 * <p>version:1.0</p>
 * <p>description:请求消息基类(普通用户->公众账号)</p>
 * <p>站在服务器端的视角:接收信息</p>
 */
public class basemessage {
 //开发者微信号
 private string tousername;
 //发送方账号(一个openid)
 private string fromusername;
 //消息创建时间(整型)
 private long createtime;
 //消息类型
 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;
 }
}

第十二步:找到com.wtz.message.request包,新建类textmessage.java

package com.wtz.message.request;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午11:04:35
 * <p>version:1.0</p>
 * <p>description:文本消息</p>
 */
public class textmessage extends basemessage{
 //消息内容
 private string content;

 public string getcontent() {
 return content;
 }

 public void setcontent(string content) {
 content = content;
 }
}

第十三步:找到com.wtz.message.request包,新建类imagemessage.java

package com.wtz.message.request;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午11:20:50
 * <p>version:1.0</p>
 * <p>description:图片消息</p>
 */
public class imagemessage extends basemessage{
 //图片链接
 private string picurl;
 //图片消息媒体id
 private string mediaid;
 
 public string getpicurl() {
 return picurl;
 }
 public void setpicurl(string picurl) {
 picurl = picurl;
 }
 public string getmediaid() {
 return mediaid;
 }
 public void setmediaid(string mediaid) {
 mediaid = mediaid;
 }
}

第十四步:找到com.wtz.message.request包,新建类voicemessage.java

package com.wtz.message.request;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午11:27:40
 * <p>version:1.0</p>
 * <p>description:语音消息类</p>
 */
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;
 }
}

第十五步:找到com.wtz.message.request包,新建类videomessage.java

package com.wtz.message.request;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 下午3:28:03
 * <p>version:1.0</p>
 * <p>description:视频消息类</p>
 */
public class videomessage extends basemessage {
 //视频消息媒体id
 private string mediaid;
 //视频消息缩略图的媒体id
 private string thumbmediaid;
 
 public string getmediaid() {
 return mediaid;
 }
 public void setmediaid(string mediaid) {
 mediaid = mediaid;
 }
 public string getthumbmediaid() {
 return thumbmediaid;
 }
 public void setthumbmediaid(string thumbmediaid) {
 thumbmediaid = thumbmediaid;
 }
}

第十六步:找到com.wtz.message.request包,新建类locatonmessage.java

package com.wtz.message.request;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 下午3:27:40
 * <p>version:1.0</p>
 * <p>description:地理位置消息类</p>
 */
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;
 }
}

第十七步:找到com.wtz.message.request包,新建类linkmessage.java

package com.wtz.message.request;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 下午1:58:04
 * <p>version:1.0</p>
 * <p>description:链接消息类</p>
 */
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;
 }
}

第十八步:新建包com.wtz.message.event,新建类baseeventmessage.java

package com.wtz.message.event;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 上午10:44:09
 * <p>version:1.0</p>
 * <p>description:基础事件消息类</p>
 */
public class baseeventmessage {
 //开发者微信号
 private string tousername;
 //发送方账号(一个openid)
 private string fromusername;
 //消息创建时间(整型)
 private long createtime;
 //消息类型
 private string msgtype;
 //事件类型
 private string event;
 
 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 string getevent() {
 return event;
 }
 public void setevent(string event) {
 event = event;
 }
} 

第十九步:找到包com.wtz.message.event,新建类qrcodeeventmessage.java

package com.wtz.message.event;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 下午3:24:30
 * <p>version:1.0</p>
 * <p>description:扫描带参数二维码事件类</p>
 */
public class qrcodeeventmessage extends baseeventmessage{
 //事件key值
 private string eventkey;
 //用于换取二维码图片
 private string ticket;
 
 public string geteventkey() {
 return eventkey;
 }
 public void seteventkey(string eventkey) {
 eventkey = eventkey;
 }
 public string getticket() {
 return ticket;
 }
 public void setticket(string ticket) {
 ticket = ticket;
 } 
}

第二十步:找到包com.wtz.message.event,新建类subscribeeventmessage.java

package com.wtz.message.event;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 下午3:27:11
 * <p>version:1.0</p>
 * <p>description:关注/取消关注事件类</p>
 */
public class subscribeeventmessage extends baseeventmessage{
 
}

第二十一步:找到包com.wtz.message.event,新建类menueventmessage.java

package com.wtz.message.event;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 下午3:32:42
 * <p>version:1.0</p>
 * <p>description:自定义菜单事件类</p>
 */
public class menueventmessage extends baseeventmessage{
 //事件key值,与自定义菜单接口中key值对应
 private string eventkey;

 public string geteventkey() {
 return eventkey;
 }

 public void seteventkey(string eventkey) {
 eventkey = eventkey;
 }
}

第二十二步:找到包com.wtz.message.event,新建类locationeventmessage.java

package com.wtz.message.event;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月20日 下午3:37:50
 * <p>version:1.0</p>
 * <p>description:上报地理位置事件类</p>
 */
public class locationeventmessage extends baseeventmessage{
 //地理位置纬度
 private string latitude;
 //地理位置经度
 private string longitude;
 //地理位置精度
 private string precision;
 
 public string getlatitude() {
 return latitude;
 }
 public void setlatitude(string latitude) {
 latitude = latitude;
 }
 public string getlongitude() {
 return longitude;
 }
 public void setlongitude(string longitude) {
 longitude = longitude;
 }
 public string getprecision() {
 return precision;
 }
 public void setprecision(string precision) {
 precision = precision;
 }
}

第二十三步:找到包com.wtz.util下的messageutil.java类,修改这个类添加请求和回复的各种消息类型,事件类型,添加将各种类型消息转换成xml格式的方法

package com.wtz.util;

import java.io.ioexception;
import java.io.inputstream;
import java.io.writer;
import java.util.hashmap;
import java.util.list;
import java.util.map;

import javax.servlet.http.httpservletrequest;

import org.dom4j.document;
import org.dom4j.documentexception;
import org.dom4j.element;
import org.dom4j.io.saxreader;

import com.thoughtworks.xstream.xstream;
import com.thoughtworks.xstream.core.util.quickwriter;
import com.thoughtworks.xstream.io.hierarchicalstreamwriter;
import com.thoughtworks.xstream.io.xml.prettyprintwriter;
import com.thoughtworks.xstream.io.xml.xppdriver;
import com.wtz.message.response.imagemessage;
import com.wtz.message.response.musicmessage;
import com.wtz.message.response.newsmessage;
import com.wtz.message.response.textmessage;
import com.wtz.message.response.videomessage;
import com.wtz.message.response.voicemessage;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月19日 下午3:29:58
 * <p>version:1.0</p>
 * <p>description:消息处理工具类</p>
 */
public class messageutil {
 //请求消息类型:文本
 public static final string req_message_type_text = "text";
 //请求消息类型:图片
 public static final string req_message_type_image = "image";
 //请求消息类型:语音
 public static final string req_message_type_voice = "voice";
 //请求消息类型:视频
 public static final string req_message_type_video = "video";
 //请求消息类型:地理位置
 public static final string req_message_type_location = "location";
 //请求消息类型:链接
 public static final string req_message_type_link = "link";
 //请求消息类型:事件推送
 public static final string req_message_type_event = "event";
 
 //---------------------------------------------------------------
 
 //事件类型:subscribe(订阅)
 public static final string event_type_subscribe = "subscribe";
 //事件类型:unsubscribe(取消订阅)
 public static final string event_type_unsubscribe = "unsubscribe";
 //事件类型:scan(用户已关注时的扫描带参数的二维码)
 public static final string event_type_scan = "scan";
 //事件类型:location(上报地理位置)
 public static final string event_type_location = "location";
 //事件类型:click(自定义菜单)
 public static final string event_type_click = "click";
 
 //---------------------------------------------------------------
 
 //响应消息类型:文本
 public static final string resp_message_type_text = "text";
 //响应详细类型:图片
 public static final string resp_message_type_image = "image";
 //响应消息类型:语音
 public static final string resp_message_type_voice = "voice";
 //响应消息类型:视频
 public static final string resp_message_type_video = "video";
 //响应详细类型:音乐
 public static final string resp_message_type_music = "music";
 //响应消息类型:图文
 public static final string resp_message_type_news = "news";
 
 //---------------------------------------------------------------
 
 //从流中解析出每个节点的内容
 public static map<string,string> parsexml(httpservletrequest request) throws ioexception{
 map<string,string> map = new hashmap<string,string>();
 
 //从输入流中获取流对象
 inputstream in = request.getinputstream();
 
 //构建sax阅读器对象
 saxreader reader = new saxreader();
 try {
  //从流中获得文档对象
  document doc = reader.read(in);
  
  //获得根节点
  element root = doc.getrootelement();
  
  //获取根节点下的所有子节点
  list<element> children = root.elements();
  
  for(element e:children){
  //遍历每一个节点,并按照节点名--节点值放入map中
  map.put(e.getname(), e.gettext());
  system.out.println("用户发送的消息xml解析为:" + e.getname() + e.gettext());
  }
  
  //关闭流
  in.close();
  in = null;
 } catch (documentexception e) {
  // todo auto-generated catch block
  e.printstacktrace();
 }
 
 return map;
 }
 
 /**
 * 用于扩展节点数据按照<tousername><![cdata[touser]]></tousername>,中间加了cdata段
 */
 private static xstream xstream = new xstream(new xppdriver(){
 public hierarchicalstreamwriter createwriter(writer out){
  return new prettyprintwriter(out){
  boolean cdata = true;
  public void startnode(string name,class clazz){
   super.startnode(name,clazz);
  }
  
  protected void writetext(quickwriter writer,string text){
   if(cdata){
   writer.write("<![cdata[");
   writer.write(text);
   writer.write("]]>");
   }else{
   writer.write(text);
   }
  }
  };
 }
 });
 
 /**
 * 将文本消息对象转换成xml格式
 * params:textmessage 文本消息对象
 * return:xml
 */
 public static string messagetoxml(textmessage textmessage){
 xstream.alias("xml",textmessage.getclass());
 return xstream.toxml(textmessage);
 }
 
 /**
 * 将图片消息对象转换成xml格式
 * params:imagemessage
 * return:xml
 */
 public static string messagetoxml(imagemessage imagemessage){
 xstream.alias("xml", imagemessage.getclass());
 return xstream.toxml(imagemessage);
 }
 
 /**
 * 将语音消息对象转换成xml格式
 * params:voicemessage
 * return:xml
 */
 public static string messagetoxml(voicemessage voicemessage){
 xstream.alias("xml",voicemessage.getclass());
 return xstream.toxml(voicemessage);
 }
 
 /**
 * 将视频消息对象转换成xml格式
 * params:videomessage
 * return:xml
 */
 public static string messagetoxml(videomessage videomessage){
 xstream.alias("xml",videomessage.getclass());
 return xstream.toxml(videomessage);
 }
 
 /**
 * 将音乐消息对象转换成xml格式
 * params:musicmessage
 * return:xml
 */
 public static string messagetoxml(musicmessage musicmessage){
 xstream.alias("xml",musicmessage.getclass());
 return xstream.toxml(musicmessage);
 }
 
 /**
 * 将图文消息对象转换成xml格式
 * params:newsmessage
 * return:xml
 */
 public static string messagetoxml(newsmessage newsmessage){
 xstream.alias("xml",newsmessage.getclass());
 return xstream.toxml(newsmessage);
 }
}

第二十四步:找到包com.wtz.util下的processservice.java类,修改dealrequest方法响应各种类型的消息

package com.wtz.util;

import java.io.ioexception;
import java.util.date;
import java.util.map;

import javax.servlet.http.httpservletrequest;

import com.wtz.message.response.textmessage;

/**
 * @author wangtianze qq:864620012
 * @date 2017年4月19日 下午8:04:14
 * <p>version:1.0</p>
 * <p>description:核心服务类</p>
 */
public class processservice {
 public static string dealrequest(httpservletrequest request){
 //xml格式的消息数据
 string respxml = "";
 //默认返回的文本消息内容
 string respcontent = "未知的消息类型";
 //调用parsexml方法解析请求消息
 map<string, string> requestmap;
 try {
  requestmap = messageutil.parsexml(request);
  //发送方账号
  string fromusername = requestmap.get("fromusername");
  //开发者微信号
  string tousername = requestmap.get("tousername");
  //消息类型
  string msgtype = requestmap.get("msgtype");
  
  //回复文本消息
  textmessage textmessage = new textmessage();
  textmessage.settousername(fromusername);
  textmessage.setfromusername(tousername);
  textmessage.setcreatetime(new date().gettime());
  textmessage.setmsgtype(messageutil.resp_message_type_text);
  
  if(msgtype.equals(messageutil.req_message_type_text)){
  respcontent = "您发送的是文本消息";
  }else if(msgtype.equals(messageutil.req_message_type_image)){
  respcontent = "您发送的是图片消息";
  }else if(msgtype.equals(messageutil.req_message_type_voice)){
  respcontent = "您发送的是语音消息";
  }else if(msgtype.equals(messageutil.req_message_type_video)){
  respcontent = "您发送的是视频消息";
  }else if(msgtype.equals(messageutil.req_message_type_location)){
  respcontent = "您发送的是地理位置消息";
  }else if(msgtype.equals(messageutil.req_message_type_link)){
  respcontent = "您发送的是链接消息";
  }else if(msgtype.equals(messageutil.req_message_type_event)){
  //事件类型
  string eventtype = requestmap.get("event");
  if(eventtype.equals(messageutil.event_type_subscribe)){
   respcontent = "感谢您的关注";
  }else if(eventtype.equals(messageutil.event_type_unsubscribe)){
   //todo 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复
  }else if(eventtype.equals(messageutil.event_type_scan)){
   //todo 处理扫描带参数二维码事件
  }else if(eventtype.equals(messageutil.event_type_location)){
   //todo 处理上报地理位置事件
  }else if(eventtype.equals(messageutil.event_type_click)){
   //todo 处理菜单点击事件
  }
  }
  //设置文本消息的内容
  textmessage.setcontent(respcontent);
  //将文本消息对象转换成xml
  respxml = messageutil.messagetoxml(textmessage);
 } catch (ioexception e) {
  // todo auto-generated catch block
  e.printstacktrace();
 }
 
 return respxml;
 }
}

各种类型消息封装完成。

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