最近公司在做一个微信公众号,由于刚接触,也参考了不少网上的资料。领导要求关注、默认和关键字回复可以返回多条消息,网上翻阅的半天发现只能是被动回复一条+上主动推送若干条,最后以这样的方式完成了这个需求,现贴出来,给大家一个参考。实体类网上有的部分就不贴了,贴我自己写的部分
关注回复若干条
// 判断行为是订阅
if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
//获得该关注人员的信息
WXUser user = queryUser(fromUserName,wxAccount);
if(null!=user.getOpenId()){
String type = Read.getMsg("subscribe.type");
flag = true;
//获得后台设置的回复列表
for (WXReply wr : list) {
//判断是否是关注类型
if (type.equals((wr.getActionType()))) {
//第一次为被动回复
if(flag){
//转换成xml形式
respMessage = ReplyMessageUtil.getMsgByType(textMessage,newsMessage,imageMessage,wr);
out.write(respMessage);
flag = false;
}else{//如果还有回复则为主动推送
respMessage = ReplyMessageUtil.initiativeMsgData(fromUserName, wr);
HttpBase http = new HttpBase();
//那天微信开发文档推送给关注者
String jsonStr = http.post("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="+accessToken, null, respMessage);
System.out.println(jsonStr);
}
System.out.println(respMessage);
}
}
//数据新增关注人
wxUserService.insertWXUser(accountCode, user.getOpenId(), user.getNickName(), user.getHeadimgurl());
}
//保存关注人员
}
//被动回复的类型判断
/**
* 被动回复消息操作
* @param textMessage
* @param newsMessage
* @param imageMessage
* @param wr
* @return
*/
public static String getMsgByType(TextMessage textMessage,NewsMessage newsMessage,ImageMessage imageMessage,WXReply wr){
String respMessage = "";
//传入类型
String type = wr.getMsgType();
if("text".equals(type)){
//设置文本消息内容
textMessage.setContent(wr.getMsgContent());
//转换xml
respMessage = MessageUtil.textMessageToXml(textMessage);
}else if("news".equals(type)){
//图文类型list
List<Article> articleList = new ArrayList<Article>();
Article article = new Article();
article.setTitle(wr.getMsgTitle());
article.setDescription(wr.getMsgDescription());
article.setPicUrl(wr.getMsgPicUrl());
article.setUrl(wr.getMsgUrl());
articleList.add(article);
// 设置图文消息个数 这里是单个
newsMessage.setArticleCount(articleList.size());
// 设置图文消息包含的图文集合
newsMessage.setArticles(articleList);
// //转换成xml
respMessage = MessageUtil.newsMessageToXml(newsMessage);
}else if("image".equals(type)){
Image image = new Image();
//设置media_id
image.setMediaId(wr.getMediaId());
imageMessage.setImage(image);
//转换成xml
respMessage = MessageUtil.ImageMessageToXml(imageMessage);
}
return respMessage;
}
主动回复判断 要根据微信开发文档来编写实体类,发送请求中携带的参数格式要符合,不然就回返回错误信息
/**
* 主动推送消息
* @param fromUserName
* @param wr
* @return
*/
public static String initiativeMsgData(String fromUserName,WXReply wr){
String respMessage = "";
String type = wr.getMsgType();
if("text".equals(type)){
//文本消息
TextMsg tm = new TextMsg();
Text tx = new Text();
tm.setTouser(fromUserName);
tm.setMsgtype("text");
tx.setContent(wr.getMsgContent());
tm.setText(tx);
//转换成字符串
respMessage = JsonHelper.bean2JsonStr(tm);
}else if("news".equals(type)){
//图文消息
NewsMsg nm = new NewsMsg();
NewsMsgForMp nmm = new NewsMsgForMp();
List<News> articles = new ArrayList<News>();
Map<String, List<News>> news = new HashMap<String, List<News>>();
News newss = new News();
MpNews mpNews = new MpNews();
nm.setTouser(fromUserName);
nmm.setTouser(fromUserName);
if(StringUtil.isBlank(wr.getMediaId())){
nm.setMsgtype("news");
newss.setTitle(wr.getMsgTitle());
newss.setDescription(wr.getMsgDescription());
newss.setUrl(wr.getMsgUrl());
newss.setPicurl(wr.getMsgPicUrl());
articles.add(newss);
news.put("articles", articles);
articles.add(newss);
nm.setNews(news);
respMessage = JsonHelper.bean2JsonStr(nm);
}
else{
nmm.setMsgtype("mpnews");
nmm.setMpnews(mpNews);
respMessage = JsonHelper.bean2JsonStr(nmm);
}
}else if("image".equals(type)){
//图片消息
ImageMsg iMsg = new ImageMsg();
Img img = new Img();
iMsg.setTouser(fromUserName);
iMsg.setMsgtype("image");
img.setMedia_id(wr.getMediaId());
iMsg.setImage(img);
respMessage = JsonHelper.bean2JsonStr(iMsg);
}
return respMessage;
}
要注意的发送的消息是被动回复是xml格式的,主动回复是json字符串的格式
主动回复图文消息还要分2中,所以要做判断
1.发送图文消息(点击跳转到外链) 图文消息条数限制在8条以内,注意,如果图文数超过8,则将会无响应。
{ "touser":"OPENID", "msgtype":"news", "news":{ "articles": [ { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" }, { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" } ] } }
2.发送图文消息(点击跳转到图文消息页面) 图文消息条数限制在8条以内,注意,如果图文数超过8,则将会无响应。
{ "touser":"OPENID", "msgtype":"mpnews", "mpnews": { "media_id":"MEDIA_ID" } }
新手开发,有什么不足之处,还请大家指正。