微信企業號開發2--訊息回覆
阿新 • • 發佈:2019-01-29
1.說明:
普通訊息是指成員向企業號應用傳送的訊息,包括文字、圖片、語音、視訊、地理位置等型別。普通訊息會推送到每個應用在管理端設定的URL(以下假設該URL為http://api.3dept.com)。
- 請求說明
Http請求方式: POST
文字類訊息的引數列表,其他的見官方文件
引數 | 說明 |
---|---|
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
2)處理類CoreService/** * 解析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); }
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)加密解密相應方法檢視微信官方提供的原始碼