1. 程式人生 > >Java微信公眾號開發----關鍵字自動回復消息

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

bubuko map對象 分享 消息 getname receive equals scrip model

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

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

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

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

技術分享圖片

附上解析xml類的依賴:

 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 類接收參數(基本信息類,子類,子類包括文本信息類,圖片信息類,語音信息類等,本人暫時只寫了文本的信息類)

基類:

技術分享圖片
 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類會在最後附上

技術分享圖片
 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的工具類:

技術分享圖片
 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

至此基本步驟已經完成,具體什麽關鍵字回復什麽內容全屏自己設置。

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