在配置好開發者配置後,本人第一個想要實現的是自動回覆消息的功能,說明如下幾點: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 }
文本信息類 繼承自基類:微信
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 }
第二步: 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 }
最後附上讀取和寫入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 }
至此基本步驟已經完成,具體什麼關鍵字回覆什麼內容全屏本身設置。
補充:若是想讓公衆號除了本身設定的幾個關鍵字之外不進行任何回覆,則直接返回空字符串""便可,避免出現 「該公衆號提供的服務出現故障,請稍後重試」 錯誤!