上篇文章介紹了開啟回調模式,開始回調模式后我們就要實現聊天功能了。平時使用微信聊天可以發送文本消息、語音、圖片、視頻等,這里只實現了其中的一些功能和大家分享。
一、與微信企業號建立連接
1、企業應用調用企業號提供的接口,管理或查詢企業號后臺所管理的資源、或給成員發送消息等,以下稱主動調用模式。
2、企業號把用戶發送的消息或用戶觸發的事件推送給企業應用,由企業應用處理,以下稱回調模式。
3、用戶在微信中閱讀企業應用下發的H5頁面,該頁面可以調用微信提供的原生接口,使用微信開放的終端能力,以下稱JSAPI模式。
這是微信企業號的開發文檔中寫的,但是我們一般使用前兩種方式。
其實主動調用和回調都是相對的,這是站在微信服務器的角度,微信服務器通過企業號給微信客戶端發送消息是主動調用,微信客戶端主動發送消息去調用微信服務器相對服務器來說就是被動調用(回調)。
二、主被動調用微信服務器處理的數據格式
1.主調:服務器向微信客戶端發送json格式的數據,數據不需要加密
2.回調:微信客戶端發送的消息需要AES加密,服務器接受的消息是xml格式
這兩條用一張圖表示如下:
三、聊天原理圖
首先微信客戶端發送消息到服務器處理,數據以xml格式傳輸到第三方服務器后,第三方服務器再將數據轉為json格式,傳送給微信服務器,發送給客戶端。
四、代碼實現
有了上面的原理基礎,下面是代碼部分
1.servlet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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.工具類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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格式,并傳送給微信服務器在發送到客戶端。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。