Java微信公衆號開發----關鍵字自動回覆消息

在配置好開發者配置後,本人第一個想要實現的是自動回覆消息的功能,說明如下幾點:javascript

1. url 仍然不變,仍是開發配置裏的urlphp

2. 微信採用 xml 格式傳輸數據java

3.微信服務器傳給咱們的參數主要有(如圖):python

 

附上解析xml類的依賴:spring

 1  <!-- dom對象讀取寫入xml文件 -->
 2       <dependency>
 3           <groupId>dom4j</groupId>
 4           <artifactId>dom4j</artifactId>
 5           <version>2.0.0</version>
 6       </dependency>
 7       <dependency>
 8           <groupId>com.thoughtworks.xstream</groupId>
 9           <artifactId>xstream</artifactId>
10           <version>1.4.9</version>
11       </dependency>

第一步:創建model 類接收參數(基本信息類,子類,子類包括文本信息類,圖片信息類,語音信息類等,本人暫時只寫了文本的信息類)json

基類:服務器

 1 package com.encore.model;
 2 
 3 import lombok.*;
 4 
 5 /**
 6  *  微信公衆號消息的基類
 7  */
 8 
 9 @Setter
10 @Getter
11 @ToString
12 @AllArgsConstructor
13 @NoArgsConstructor
14 @Builder
15 public class WxMessage {
16     // 開發者微信號
17     private String ToUserName;
18     // 發送方賬號(一個OpenID)
19     private String FromUserName;
20     // 消息建立時間 (整型)
21     private long CreateTime;
22     // 消息類型(text/image/location/link)
23     private String MsgType;
24     // 消息id,64位整型
25     private long MsgId;
26 }
View Code

文本信息類 繼承自基類:微信

 1 package com.encore.model;
 2 
 3 import lombok.Getter;
 4 import lombok.NoArgsConstructor;
 5 import lombok.Setter;
 6 import org.springframework.beans.BeanUtils;
 7 
 8 /**
 9  *  文本消息
10  */
11 
12 @Getter
13 @Setter
14 @NoArgsConstructor
15 public class TextMessage extends WxMessage {
16 
17     private String Content;// 文本消息內容
18 
19     //用來把基類的屬性值複製給子類
20     public static TextMessage adapt(WxMessage msg){
21         TextMessage textMessage = new TextMessage();
22         BeanUtils.copyProperties(msg, textMessage);
23         return textMessage;
24     }
25 }
View Code

第二步: controller post接收方式,中間會涉及到讀取和寫入xml,util類會在最後附上app

 1 @RequestMapping(value = "/view.json", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
 2     @ResponseBody
 3     public String receiveMessage(HttpServletRequest request){
 4 
 5         //1. 獲取微信服務器發送的消息,轉換成map對象
 6         Map<String, String> map = MessageUtil.parseXmlToMap(request);
 7         // 2. 獲取詳細的信息
 8         // 發送方賬號(open_id)
 9         String fromUserName = map.get("FromUserName");
10         // 公衆賬號
11         String toUserName = map.get("ToUserName");
12         // 消息類型
13         String msgType = map.get("MsgType");
14         // 消息內容
15         String content = map.get("Content");
16         // 消息id
17         String msgId = map.get("MsgId");
18 
19         //3. 定義回覆消息對象
20         String respMsg = "";
21 
22         // 也能夠用new,而後一個屬性一個屬性的set
23         // 微信消息的基類
24         //set屬性值的時候,注意:ToUserName 和 FromUserName的值要反過來!是坑!是坑!是坑!
25         WxMessage msg = WxMessage.builder().FromUserName(toUserName).ToUserName(fromUserName).MsgType(msgType).MsgId(Long.parseLong(msgId))
26                 .CreateTime(new Date().getTime()).build();
27 
28         if (RESP_MESSAGE_TYPE_TEXT.equals(msgType)){//文本消息
29             //要回復的消息內容
30             String resultContent = "";
31             if ("python".equals(content)){
32                 resultContent = "人生苦短,我用python";
33             }else if ("php".equals(content) || "PHP".equals(content)){
34                 resultContent = "PHP是世界上最好的語言";
35             }else if ("java".equals(content) || "JAVA".equals(content)){
36                 resultContent = "JAVA太特麼複雜了";
37             }else if ("js".equals(content) || "javascript".equals(content)){
38                 resultContent = "老子是腳本!跟java沒半毛錢關係!";
39             }else {
40                 resultContent = "您的開發語言是:"+content;
41             }
42             TextMessage textMessage = TextMessage.adapt(msg);
43             textMessage.setContent(resultContent);
44             respMsg = MessageUtil.parseMsgToXml(textMessage, TextMessage.class);
45         }
46 
47         return respMsg;
48     }
View Code

最後附上讀取和寫入xml的工具類:dom

 1 package com.encore.util;
 2 
 3 import com.encore.model.WxMessage;
 4 import com.thoughtworks.xstream.XStream;
 5 import org.dom4j.Document;
 6 import org.dom4j.DocumentException;
 7 import org.dom4j.Element;
 8 import org.dom4j.io.SAXReader;
 9 
10 import javax.servlet.http.HttpServletRequest;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 
17 public class MessageUtil {
18 
19 
20     /**
21      *  接收request對象,讀取xml內容,轉換成map對象
22      * @param request
23      * @return
24      */
25     public static Map<String, String> parseXmlToMap(HttpServletRequest request){
26         Map<String, String> map = new HashMap<>();
27         SAXReader reader = new SAXReader();
28         InputStream ins = null;
29         try {
30             ins = request.getInputStream();
31         } catch (IOException e1) {
32             e1.printStackTrace();
33         }
34         Document doc = null;
35         try {
36             doc = reader.read(ins);
37             Element root = doc.getRootElement();
38             List<Element> list = root.elements();
39             for (Element e : list) {
40                 map.put(e.getName(), e.getText());
41             }
42             return map;
43         } catch (DocumentException e1) {
44             e1.printStackTrace();
45         }finally{
46             try {
47                 if (null != ins){
48                     ins.close();
49                 }
50             } catch (IOException e) {
51                 e.printStackTrace();
52             }
53         }
54         return null;
55     }
56 
57     /**
58      * 將消息轉換成xml格式的字符串
59      * @param msg 各類信息類,如文本信息類,圖片信息類,音頻信息類等。(都是WxMessage的子類)
60      * @param child 用來肯定究竟是哪種子類
61      * @return
62      */
63     public static String parseMsgToXml(WxMessage msg, Class child){
64         XStream xstream = new XStream();
65         xstream.alias("xml", child);
66         return xstream.toXML(msg);
67     }
68 }
View Code

至此基本步驟已經完成,具體什麼關鍵字回覆什麼內容全屏本身設置。

補充:若是想讓公衆號除了本身設定的幾個關鍵字之外不進行任何回覆,則直接返回空字符串""便可,避免出現  「該公衆號提供的服務出現故障,請稍後重試」  錯誤!

相關文章
相關標籤/搜索