微信公众平台开发--接收消息的分类及实体创建
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.图片消息
2.连接消息
}
3.地理位置消息
public class LocationMessage extends BaseMessage {
// 地理位置维度
private String Location_X;
// 地理位置经度
private String Location_Y;
// 地图缩放大小
private String Scale;
// 地理位置信息
private String Label;
}
4.文本消息
}
public class VideoMessage extends BaseMessage {
}
6.语音消息
}
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
方法做些修改,最终结果如下:
最后发布项目,通过发送不同类型的消息来验证我们的消息分类的正确性。
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
方法做些修改,最终结果如下:
最后发布项目,通过发送不同类型的消息来验证我们的消息分类的正确性。
相关文章推荐
- Java微信公众平台开发(三)——接收消息的分类及实体的创建
- Java微信公众平台开发(三)——接收消息的分类及实体的创建
- Java微信公众平台开发(3) 接收消息的分类及实体的创建
- Java微信公众平台开发(4) 回复消息的分类及实体的创建
- 微信公众平台开发--回复消息分类及实体创建
- Java微信公众平台开发(四)——回复消息的分类及实体的创建
- Java微信公众平台开发(四)——回复消息的分类及实体的创建
- PHP-微信公众平台开发-接收用户输入消息类型并响应
- 微信公众平台开发【接收消息】接收普通消息
- PHP-微信公众平台开发-接收用户输入消息类型并响应
- 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)
- Delphi XE7 用indy开发微信公众平台(4)- 接收普通消息
- 使用Java开发微信公众平台(二)——消息的接收与响应
- 微信公众平台开发【接收消息】接收普通消息
- 微信公众平台开发学习记录(3)————接收消息和发送回复消息
- 个人微信号接收不到服务器自动返回的消息-微信公众平台开发2
- 使用Golang开发微信公众平台----接收消息
- 微信公众平台开发教程Java版(三) 消息接收和发送
- 微信公众平台开发入门教程(四)获取接收消息
- 微信公众平台开发获取接收消息