package com.util;
import com.Common.AccessTokenInfo;
import com.Common.MessageType;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.entry.AccessToken;
import com.entry.TemplateData;
import com.entry.WxTemplate;
import com.util.WeChatApiUtil;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 消息处理工具类
* Created by CLiang on 2018/8/14.
*/
public class MessageHandlerUtil {
/**
* 解析微信发来的请求(XML)
*
* @param request 封装了请求信息的HttpServletRequest对象
* @return map 解析结果
* @throws Exception
*/
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList) {
System.out.println(e.getName() + "|" + e.getText());
map.put(e.getName(), e.getText());
}
// 释放资源
inputStream.close();
inputStream = null;
return map;
}
/**
* 根据消息类型构造返回消息
* @param map 封装了解析结果的Map
* @return responseMessage(响应消息)
*/
public static String buildResponseMessage(Map map) {
//响应消息
String responseMessage = "";
//得到消息类型
String msgType = map.get("MsgType").toString();
System.out.println("MsgType:" + msgType);
//消息类型
MessageType messageEnumType = MessageType.valueOf(MessageType.class, msgType.toUpperCase());
switch (messageEnumType) {
case TEXT:
//处理文本消息
responseMessage = handleTextMessage(map);
break;
case IMAGE:
//处理图片消息
responseMessage = handleImageMessage(map);
break;
case VOICE:
//处理语音消息
responseMessage = handleVoiceMessage(map);
break;
case VIDEO:
//处理视频消息
responseMessage = handleVideoMessage(map);
break;
case SHORTVIDEO:
//处理小视频消息
responseMessage = handleSmallVideoMessage(map);
break;
case LOCATION:
//处理位置消息
responseMessage = handleLocationMessage(map);
break;
case LINK:
//处理链接消息
responseMessage = handleLinkMessage(map);
break;
case EVENT:
//处理事件消息,用户在关注与取消关注公众号时,微信会向我们的公众号服务器发送事件消息,开发者接收到事件消息后就可以给用户下发欢迎消息
responseMessage = handleEventMessage(map);
default:
break;
}
//返回响应消息
return responseMessage;
}
/**
* 接收到文本消息后处理
* @param map 封装了解析结果的Map
* @return
*/
private static String handleTextMessage(Map<String, String> map) {
//响应消息
String responseMessage;
// 消息内容
String content = map.get("Content");
switch (content) {
case "文本":
String msgText = "亮亮又要开始写博客总结了,欢迎朋友们访问我在博客园上面写的博客\n" +
"<a href=\"https://blog.csdn.net/u011752195\">亮亮的博客</a>";
responseMessage = buildTextMessage(map, msgText);
break;
case "模板":
responseMessage = buildTempMessage(map);
break;
case "图片":
//通过素材管理接口上传图片时得到的media_id
String imgMediaId = "_Oeog5ScPfhcDtpOvCCwZMDDrA5mjS45NrxmtgYDqgv9ABQ9aqPtMAc2jq-66SOu";
responseMessage = buildImageMessage(map, imgMediaId);
break;
case "图文":
responseMessage = buildNewsMessage(map);
break;
case "音乐":
Music music = new Music();
music.title = "赵丽颖、许志安 - 乱世俱灭";
music.description = "电视剧《蜀山战纪》插曲";
music.musicUrl = "http://gacl.ngrok.natapp.cn/media/music/music.mp3";
music.hqMusicUrl = "http://gacl.ngrok.natapp.cn/media/music/music.mp3";
responseMessage = buildMusicMessage(map, music);
break;
default:
responseMessage = buildWelcomeTextMessage(map);
break;
}
//返回响应消息
return responseMessage;
}
/**
* 生成消息创建时间 (整型)
* @return 消息创建时间
*/
private static String getMessageCreateTime() {
Date dt = new Date();// 如果不需要格式,可直接用dt,dt就是当前系统时间
DateFormat df = new SimpleDateFormat("yyyyMMddhhmm");// 设置显示格式
String nowTime = df.format(dt);
long dd = (long) 0;
try {
dd = df.parse(nowTime).getTime();
} catch (Exception e) {
}
return String.valueOf(dd);
}
/**
* 构建提示消息
* @param map 封装了解析结果的Map
* @return responseMessageXml
*/
private static String buildWelcomeTextMessage(Map<String, String> map) {
String responseMessageXml;
String fromUserName = map.get("FromUserName");
// 开发者微信号
String toUserName = map.get("ToUserName");
responseMessageXml = String
.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[text]]></MsgType>" +
"<Content><![CDATA[%s]]></Content>" +
"</xml>",
fromUserName, toUserName, getMessageCreateTime(),
"感谢您关注我的公众号,请回复如下关键词来使用公众号提供的服务:\n文本\n模板\n图片\n音乐\n图文");
return responseMessageXml;
}
/**
* 构造文本消息
* @param map 封装了解析结果的Map
* @param content 文本消息内容
* @return 文本消息XML字符串
*/
private static String buildTextMessage(Map<String, String> map, String content) {
//发送方帐号
String fromUserName = map.get("FromUserName");
// 开发者微信号
String toUserName = map.get("ToUserName");
/**
* 文本消息XML数据格式
* <xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
*/
return String.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
微信公众号-接受消息+模板消息.rar (48个子文件)
Chat
.settings
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.wst.common.project.facet.core.xml 414B
org.eclipse.wst.common.component 471B
org.eclipse.wst.jsdt.ui.superType.container 49B
.jsdtscope 522B
org.eclipse.jdt.core.prefs 364B
src
com
Common
MessageType.java 271B
AccessTokenInfo.java 208B
entry
TemplateData.java 456B
WxTemplate.java 1KB
AccessToken.java 578B
Servlet
AccessTokenServlet.java 3KB
WxServlet.java 4KB
util
WeChatApiUtil.java 12KB
MessageHandlerUtil.java 24KB
NetWorkHelper.java 3KB
.project 1KB
WebRoot
META-INF
MANIFEST.MF 39B
WEB-INF
web.xml 1KB
classes
com
Common
MessageType.class 1KB
AccessTokenInfo.class 412B
entry
AccessToken.class 763B
TemplateData.class 719B
WxTemplate.class 2KB
Servlet
AccessTokenServlet$1.class 2KB
AccessTokenServlet.class 3KB
WxServlet.class 4KB
util
Video.class 348B
MessageHandlerUtil.class 16KB
JEEWeiXinX509TrustManager.class 880B
NewsItem.class 367B
NetWorkHelper.class 3KB
NetWorkHelper$2.class 788B
NetWorkHelper$1.class 1KB
Music.class 370B
WeChatApiUtil.class 10KB
lib
httpcore-4.4.3.jar 319KB
fastjson-1.2.49.jar 548KB
commons-codec-1.9.jar 258KB
commons-logging-1.2.jar 60KB
commons-httpclient-3.0.jar 273KB
dom4j-2.0.2.jar 305KB
media
image
我.jpg 680KB
music
music.mp3 3.2MB
voice
voice.mp3 42KB
video
小苹果.mp4 7.97MB
index.jsp 834B
.classpath 1KB
共 48 条
- 1
资源评论
- ye406052019-01-30参考一下,谢谢
- yanhui67002019-07-09先学习一下。感谢分享
- sheshizhang2019-02-18有些地方还没看懂呢
V亮亮
- 粉丝: 43
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功