1. 程式人生 > >微信企業號開發2--訊息回覆

微信企業號開發2--訊息回覆

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

/**
     * 解析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)加密解密相應方法檢視微信官方提供的原始碼