1. 程式人生 > >微信企業號開發—傳送訊息(文字、圖片、語音)

微信企業號開發—傳送訊息(文字、圖片、語音)

        上篇文章介紹了開啟回撥模式,開始回撥模式後我們就要實現聊天功能了。平時使用微信聊天可以傳送文字訊息、語音、圖片、視訊等,這裡只實現了其中的一些功能和大家分享。

一、與微信企業號建立連線

 1、企業應用呼叫企業號提供的介面,管理或查詢企業號後臺所管理的資源、或給成員傳送訊息等,以下稱主動呼叫模式

 2、企業號把使用者傳送的訊息或使用者觸發的事件推送給企業應用,由企業應用處理,以下稱回撥模式

 3、使用者在微信中閱讀企業應用下發的H5頁面,該頁面可以呼叫微信提供的原生介面,使用微信開放的終端能力,以下稱JSAPI模式

          這是微信企業號的開發文件中寫的,但是我們一般使用前兩種方式。

          其實主動呼叫和回撥都是相對的,這是站在微信伺服器的角度,微信伺服器通過企業號給微信客戶端傳送訊息是主動呼叫,微信客戶端主動傳送訊息去呼叫微信伺服器相對伺服器來說就是被動呼叫(回撥)。

二、主被動呼叫微信伺服器處理的資料格式

1.主調:伺服器向微信客戶端傳送json格式的資料,資料不需要加密

2.回撥:微信客戶端傳送的訊息需要AES加密,伺服器接受的訊息是xml格式

     這兩條用一張圖表示如下:

    

三、聊天原理圖

          首先微信客戶端傳送訊息到伺服器處理,資料以xml格式傳輸到第三方伺服器後,第三方伺服器再將資料轉為json格式,傳送給微信伺服器,傳送給客戶端。


三、程式碼實現

    有了上面的原理基礎,下面是程式碼部分

1.servlet

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8"); 
		
        String msg_signature = request.getParameter("msg_signature");  
       
        String timestamp = request.getParameter("timestamp");  
        
        String nonce = request.getParameter("nonce"); 
      
        InputStream inputStream = request.getInputStream();  
        String postData = IOUtils.toString(inputStream, "UTF-8");  
        System.out.println(postData);  
        
        String msg = "";  
        WXBizMsgCrypt wxcpt = null;  
        try {  
            wxcpt = new WXBizMsgCrypt(sToken , sEncodingAESKey , sCorpID );  
            msg = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, postData);  
        } catch (AesException e) {  
            e.printStackTrace();   
        }  
        System.out.println("msg=" + msg);  
            
        //獲取介面訪問憑證
        String accessToken = CommonUtil.getToken("wxe510946434680dab", "eWTaho766INvp4e1MCsz1mHYuT2DAleb62REQ3vsFizhY4vtmwZpKweuxUVh33G0").getAccessToken();
        try {
		@SuppressWarnings("unused")
		boolean flag = ChatService1.sendMessage(accessToken,msg);
	} catch (Exception e) {
		e.printStackTrace();
	}
}  

2.service
public class ChatService1 {

	public static boolean sendMessage(String accessToken,String msg) throws Exception{
		boolean flag =  false;
		Map<String, String> requestMap = MessageUtil.parseXml(msg);	
		// 傳送者
		String fromUserName = requestMap.get("FromUserName");
		// 訊息型別
		String msgType = requestMap.get("MsgType");
	
		if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){//如果是文字客服訊息
			String Content = requestMap.get("Content");//文字訊息的訊息內容
			//組裝文字客服訊息,引數1:使用者id;引數2:傳送的內容
			jsonMsg = AdvancedUtil.makeTextCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", Content);
		}else if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){//傳送的是圖片
			String mediaId = requestMap.get("MediaId");
			jsonMsg = AdvancedUtil.makeImageCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", mediaId);
		}else if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
			String mediaId = requestMap.get("MediaId");
			jsonMsg= AdvancedUtil.makeVoiceCustomMessage("lishehe|zhisheng|zhangwenyuan|lixinjiang", mediaId);
		}
		flag = AdvancedUtil.sendCustomMessage(accessToken, jsonMsg);
		return flag;
	}
}

3.工具類

public class AdvancedUtil {
	private static Logger log = LoggerFactory.getLogger(AdvancedUtil.class);

	/**
	 * 組裝傳送文字訊息
	 * @return
	 */
	public static String makeTextCustomMessage(String openId, String content) {
		content = content.replace("\"", "\\\"");
		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"text\",\"agentid\":\"%s\",\"text\":{\"content\":\"%s\"}}";
		return String.format(jsonMsg, openId, 14,content);
	}

	/**
	 * 組裝傳送圖片訊息
	 * 
	 * @return
	 */
	public static String makeImageCustomMessage(String openId, String mediaId) {
		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"image\",\"agentid\":\"%s\",\"image\":{\"media_id\":\"%s\"}}";
		return String.format(jsonMsg, openId,14, mediaId);
	}

	/**
	 * 組裝傳送語音訊息
	 * 
	 * @return
	 */
	public static String makeVoiceCustomMessage(String openId, String mediaId) {
		String jsonMsg = "{\"touser\":\"%s\",\"msgtype\":\"voice\",\"agentid\":\"%s\",\"voice\":{\"media_id\":\"%s\"}}";
		return String.format(jsonMsg, openId,14, mediaId);
	}

四、總結

         這樣就實現了訊息的接收和推送,第三方伺服器將接受的xml資料先解密解析,從中獲取訊息型別,然後將要傳送的訊息封裝後轉為json格式,並傳送給微信伺服器在傳送到客戶端。