一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java微信企業號開發之發送消息(文本、圖片、語音)

java微信企業號開發之發送消息(文本、圖片、語音)

2020-05-22 10:209_張曉 JAVA教程

這篇文章主要為大家詳細介紹了java微信企業號開發之發送消息,發送類型包括文本、圖片、語音,感興趣的小伙伴們可以參考一下

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

一、與微信企業號建立連接
1、企業應用調用企業號提供的接口,管理或查詢企業號后臺所管理的資源、或給成員發送消息等,以下稱主動調用模式。
2、企業號把用戶發送的消息或用戶觸發的事件推送給企業應用,由企業應用處理,以下稱回調模式。
3、用戶在微信中閱讀企業應用下發的H5頁面,該頁面可以調用微信提供的原生接口,使用微信開放的終端能力,以下稱JSAPI模式。
這是微信企業號的開發文檔中寫的,但是我們一般使用前兩種方式。 
其實主動調用和回調都是相對的,這是站在微信服務器的角度,微信服務器通過企業號給微信客戶端發送消息是主動調用,微信客戶端主動發送消息去調用微信服務器相對服務器來說就是被動調用(回調)。

二、主被動調用微信服務器處理的數據格式

1.主調:服務器向微信客戶端發送json格式的數據,數據不需要加密 

2.回調:微信客戶端發送的消息需要AES加密,服務器接受的消息是xml格式

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

java微信企業號開發之發送消息(文本、圖片、語音)

三、聊天原理圖

java微信企業號開發之發送消息(文本、圖片、語音)

首先微信客戶端發送消息到服務器處理,數據以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格式,并傳送給微信服務器在發送到客戶端。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产成人精品激情 | 倩女还魂在线观看完整版免费 | 成人午夜影院在线观看 | 亚洲春色综合另类网蜜桃 | 亚洲成人免费看 | 色噜噜亚洲男人的天堂www | 久久re热在线视频精6 | 91精品国产麻豆国产自产在线 | 爱情岛论坛自拍永久入口 | 国产-第1页-草草影院 | 欧美另类xxx精品人妖 | 亚洲羞羞裸色私人影院 | 精品日本三级在线观看视频 | 国产午夜精品一区二区三区 | 91传媒制片厂制作传媒破解版 | 精品免费视在线观看 | 免费国产高清精品一区在线 | narutotsunade全彩雏田 | 国产91页 | 免费网址在线观看入口推荐 | 四虎影视永久免费视频观看 | 精品视频 九九九 | free性欧洲 | 精品欧美一区二区在线观看欧美熟 | 纲手被强喷水羞羞漫画 | 国产成人小视频 | 99资源站 | 日本嫩交| 日韩亚洲人成在线 | 免费高清视频在线观看 | a级亚洲片精品久久久久久久 | 美女扒下内裤让男人桶的图片 | 乌克兰一级片 | 亚洲欧美另类专区 | 日韩国产成人精品视频人 | 青青热久免费精品视频精品 | 俺去俺去啦最新官网在线 | 亚洲国产欧美久久香综合 | 国语第一次处破女 | 亚洲精品国产成人99久久 | 91最新国产 |