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>
微信公众号开发-接收消息+模板消息
5星 · 超过95%的资源 需积分: 38 85 浏览量
2018-08-14
22:48:36
上传
评论 5
收藏 12.99MB RAR 举报
V亮亮
- 粉丝: 43
- 资源: 13
最新资源
- mosquitto-2.018-install-windows-x64
- FTPServer FTP 服务器,绿色免安装,单文件
- 梦畅语音点名软件,上课点名
- 利用ADNI数据集和标签,在tensorflow框架上使用tensorlayer接口,通过架构u-net实现海马体的分割
- Kutools for Word v9.0 office word 插件
- 修复Windows 10 LTSC 2021资源占用率高
- Hash工具,小巧绿色hash校验工具,免费hash工具
- 重启进行BIOS快捷方式,不需要开机按BIOS键
- 鸭子开车记(儿童绘本)
- 威纶通触摸屏编程软件Easy builder pro V6.09.01.556安装包(2024.04).txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈