1.说明:
普通消息是指成员向企业号应用发送的消息,包括文本、图片、语音、视频、地理位置等类型。普通消息会推送到每个应用在管理端设置的URL(以下假设该URL为http://api.3dept.com)。
- 请求说明
Http请求方式: POST
http://api.3dept.com/?msg_signature=ASDFQWEXZCVAQFASDFASDFSS×tamp=13500001234&nonce=123412323
文本类消息的参数列表,其他的见官方文档
参数 | 说明 |
---|---|
ToUserName | 企业号CorpID |
FromUserName | 成员UserID |
CreateTime | 消息创建时间(整型) |
MsgType | 消息类型,此时固定为:text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
AgentID | 企业应用的id,整型。可在应用的设置页面查看 |
2.步骤:
1)使用输入流获得正文,对消息进行处理和解密获得明文,得到如下xml的字符串
text消息
<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> <AgentID>1</AgentID></xml>
2)解析得到的xmlStr,得到一个hashmap,判断消息类型,返回相应的文本信息
3)将想要反馈的文本信息转成xmlStr,将该字符串写入response
3.相应代码
1)接受请求的servlet
/**
* 解析post提交的数据,并转交给处理程序
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String respStr=CoreService.processRequest(request);
response.getWriter().print(respStr);
}
2)处理类CoreService
package com.baosight.wechat.service;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import com.baosight.wechat.message.resp.TextMessage;
import com.baosight.wechat.message.util.MessageUtil;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;
public class CoreService {
public static String processRequest(HttpServletRequest request) {
String sEncryptMsg = null;
try {
String respContent = "请求处理异常,请稍后尝试!";
// 解密postDate
// 微信加密签名
// 使用输入流获得正文
ServletInputStream in = request.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
String sReqData = "";
String itemStr = "";// 作为输出字符串的临时串,用于判断是否读取完毕
while (null != (itemStr = reader.readLine())) {
sReqData += itemStr;
}
// 对消息进行处理获得明文
WXBizMsgCrypt wxcpt;
String sMsg = null;
String sReqMsgSig = request.getParameter("msg_signature");
// 时间戳
String sReqTimeStamp = request.getParameter("timestamp");
// 随机数
String sReqNonce = request.getParameter("nonce");
String sToken = MessageUtil.RESP_MESSAGE_TOKEN;// 回调配置的TOKEN
String sCorpID = MessageUtil.RESP_MESSAGE_CORPID;// 回调提供的sCorpID
String sEncodingAESKey = MessageUtil.RESP_MESSAGE_ENCODINGAESKEY;// 回调配置的AESKey
wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce,
sReqData);
// 输出解密后的文件
System.out.println("******************after decrypt msg: " + sMsg);
// 回复消息
Map<String, String> requestMap = MessageUtil.parseXml(sMsg);
String fromUserName = requestMap.get("FromUserName");
String toUserName = requestMap.get("ToUserName");
String msgType = requestMap.get("MsgType");
System.out.println("fromUserName:" + fromUserName + "--toUserName:"
+ toUserName + "--msgType" + msgType);
// 回复文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
respContent = "您发送的是文本消息";
} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = "您发送的是图片消息";
} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = "您发送的是地理位置消息";
} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
respContent = "您发送的是链接消息";
} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
respContent = "您发送的是音频消息";
} else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
// 触发事件
String eventType = requestMap.get("Event");
if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
respContent = "谢谢您的关注!";
} else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
// 取消关注
} else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
// 自定义菜单
}
}
textMessage.setContent(respContent);
String sRespData = MessageUtil.textMessageToXml(textMessage);
System.out.println(sRespData);
sEncryptMsg = wxcpt.EncryptMsg(sRespData,
Long.toString(new Date().getTime()), sReqNonce);
return sEncryptMsg;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sEncryptMsg;
}
}
3)将xml转成相应的hashmap
public static Map<String, String> parseXml(String xmlStr) throws Exception {
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
InputStream inputStream=new ByteArrayInputStream(xmlStr.getBytes());
// InputStream inputStream = xmlStr.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());
// 释放资源
inputStream.close();
inputStream = null;
return map;
}
4)加密解密相应方法查看微信官方提供的源码