您的位置:首页 > 移动开发 > 微信开发

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

2018-02-01 14:51 375 查看
一、消息实体基础类

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;

 //get、set方法省略

}

二、普通消息pojo实体

1.图片消息
public class ImageMessage extends BaseMessage {
// 图片链接
private String PicUrl;
 }

2.连接消息
public class LinkMessage extends BaseMessage {
 // 消息标题
private String Title;
// 消息描述
private String Description;
// 消息链接
private String Url;

}

3.地理位置消息

 public class LocationMessage extends BaseMessage {  

    // 地理位置维度   

     private String Location_X;  

     // 地理位置经度   

     private String Location_Y;  

   
 // 地图缩放大小   

   
 private String Scale;  

   
 // 地理位置信息   

     private String Label; 

}

4.文本消息
 public class TextMessage extends BaseMessage {  

   
 // 消息内容   

 
   private String Content;  

}

5.视频/小视屏消息

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

}

6.语音消息
 public class VoiceMessage extends BaseMessage {  

 
   // 媒体ID   

     private String MediaId;  

   
 // 语音格式   

   
 private String Format;  

}

三、消息分类处理

按收到的消息类别分别做不同的分发处理,所以建立了自己的业务分发器(EventDispatcher、MsgDispatcher),分别做普通消息处理和事件消息处理!
1.MsgDispatcher.java——用于普通消息的业务分发处理
public class MsgDispatcher {
public static String processMessage(Map<String, String> map) {
String openid=map.get("FromUserName"); //用户openid
String mpid=map.get("ToUserName");   //公众号原始ID

//普通文本消息
TextMessage txtmsg=new TextMessage();
txtmsg.setToUserName(openid);
txtmsg.setFromUserName(mpid);
txtmsg.setCreateTime(new Date().getTime());
txtmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);

if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { // 文本消息
String content=map.get("Content");
if("1".equals(content)){
txtmsg.setContent("您好,您发送的内容是1!");
}else if("2".equals(content)){
txtmsg.setContent("您好,您发送的内容是2!");
}else if("3".equals(content)){
txtmsg.setContent("您好,您发送的内容是3!");
}else if("4".equals(content)){
txtmsg.setContent("<a href=\"http://blog.csdn.net/zyy_hbcz\">可进入XXX的csdn博客</a>");
}else{
txtmsg.setContent("您好,欢迎来到XXX的个人订阅号中心!感谢您的关注~~~~~");
}
return MessageUtil.textMessageToXml(txtmsg);
}

//对图文消息
NewsMessage newmsg=new NewsMessage();
newmsg.setToUserName(openid);
newmsg.setFromUserName(mpid);
newmsg.setCreateTime(new Date().getTime());
newmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);

if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { // 图片消息
System.out.println("==============这是图片消息!");
Article article=new Article();
article.setDescription("这是图文消息1"); //图文消息的描述
article.setPicUrl("http://res.cuiyongzhi.com/2016/03/201603086749_6850.png"); //图文消息图片地址
article.setTitle("图文消息1");  //图文消息标题
article.setUrl("http://www.cuiyongzhi.com");  //图文url链接
List<Article> list=new ArrayList<Article>();
list.add(article);     //这里发送的是单图文,如果需要发送多图文则在这里list中加入多个Article即可!
newmsg.setArticleCount(list.size());
newmsg.setArticles(list);
return MessageUtil.newsMessageToXml(newmsg);
}

//这个是错误代码回复
if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) { // 链接消息
txtmsg.setContent("");
return MessageUtil.textMessageToXml(txtmsg);
}
//这个是正确代码回复
if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) { // 位置消息
System.out.println("==============这是位置消息!");
return "";
}
//这个是正确代码回复
if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) { // 视频消息
System.out.println("==============这是视频消息!");
return "";
}
//这个是正确代码回复
if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) { // 语音消息
System.out.println("==============这是语音消息!");
return "";
}

return null;
}

}

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

public class EventDispatcher {
private static Logger logger = Logger.getLogger(EventDispatcher.class);
public static String processEvent(Map<String, String> map) {
String openid = map.get("FromUserName"); // 用户openid
String mpid = map.get("ToUserName"); // 公众号原始ID

ImageMessage imgmsg = new ImageMessage();
imgmsg.setToUserName(openid);
imgmsg.setFromUserName(mpid);
imgmsg.setCreateTime(new Date().getTime());
imgmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_Image);

//对图文消息
NewsMessage newmsg=new NewsMessage();
newmsg.setToUserName(openid);
newmsg.setFromUserName(mpid);
newmsg.setCreateTime(new Date().getTime());
newmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { // 关注事件
System.out.println("==============这是关注事件!");
try {

//通过openid获取用户微信信息
HashMap<String, String> userinfo=GetUseInfo.Openid_userinfo(openid);
//设置图文消息体的数据
Article article=new Article();
article.setDescription("欢迎来到个人微信订阅号:程序员的成长之路!"); //图文消息的描述
article.setPicUrl(userinfo.get("headimgurl")); //图文消息图片地址
article.setTitle("尊敬的:"+userinfo.get("nickname")+",您好!");  //图文消息标题
article.setUrl("http://www.hexun.com");  //图文url链接
   //这里发送的是单图文,如果需要发送多图文则在这里list中加入多个Article即可!
List<Article> list=new ArrayList<Article>();
list.add(article);  
//设置图文消息
newmsg.setArticleCount(list.s
bcf6
ize());
newmsg.setArticles(list);

return MessageUtil.newsMessageToXml(newmsg);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("====代码有问题额☺!");
logger.error(e,e);
}

}

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("EventKey").equals("image")){
Image img = new Image();
HttpPostUploadUtil util=new HttpPostUploadUtil();
String filepath="D:\\1.jpg";  
       Map<String, String> textMap = new HashMap<String, String>();  
       textMap.put("name", "testname");  
       Map<String, String> fileMap = new HashMap<String, String>();  
       fileMap.put("userfile", filepath); 
String mediaidrs = util.formUpload(textMap, fileMap);
System.out.println(mediaidrs);
String mediaid=JSONObject.fromObject(mediaidrs).getString("media_id");
img.setMediaId(mediaid);
imgmsg.setImage(img);
return MessageUtil.imageMessageToXml(imgmsg);
}else if(map.get("EventKey").equals("text")){
   System.out.println("这里是回复图文消息!");
   Article article=new Article();
article.setDescription("这是图文消息1"); //图文消息的描述
article.setPicUrl("http://res.hxywzyy.com/2016/03/201603086749_6850.png"); //图文消息图片地址
article.setTitle("图文消息1");  //图文消息标题
article.setUrl("http://www.hxywzyy.com");  //图文url链接
List<Article> list=new ArrayList<Article>();
list.add(article);     //这里发送的是单图文,如果需要发送多图文则在这里list中加入多个Article即可!
newmsg.setArticleCount(list.size());
newmsg.setArticles(list);
return MessageUtil.newsMessageToXml(newmsg);
}
}

if (map.get("Event").equals(MessageUtil.EVENT_TYPE_VIEW)) { // 自定义菜单View事件
System.out.println("==============这是自定义菜单View事件!");
}

return null;
}

}

至此,需要把消息入口【WechatSecurity.java】中的 post
方法做些修改,最终结果如下:



最后发布项目,通过发送不同类型的消息来验证我们的消息分类的正确性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息