手把手教你使用java对接微信公众号-接收和回复基本信息
生活随笔
收集整理的這篇文章主要介紹了
手把手教你使用java对接微信公众号-接收和回复基本信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文檔中(https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)已經告訴我們,當普通微信用戶向公眾賬號發送消息時,微信服務器會把該消息封裝成XML數據包通過POST的方式發送到開發者填寫的URL上。我們設置的URL僅僅只有一個,上篇文章中是用來做接入驗證的,當時是微信服務器發送GET請求過來,而現在是用來做消息處理的,此時微信服務器發送的是POST請求,因此想要區分開來應該做什么事情,只需要根據請求方式來判斷即可。
1、編寫check-token接口的POST請求思路
兩次請求的url相同,但是請求方式不同,一個是GET方式一個是POST方式。根據開發文檔,接收普通的文本消息是xml形式
文本消息接收格式
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId> </xml>其他還有圖片、語音、視頻等。接下來,我們可以創建一個封裝消息的實體類,把所有可接收到的參數都放進入,其他類型的暫時不演示。
2、pom引入dom4j
<!--解析微信的消息--><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6</version></dependency><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.7</version></dependency>3、編寫TextMessage文本實體類
package com.example.mybaties.entity;import lombok.Data;/*** @Description:* @Author: lst* @Date 2020-08-19* 1、文本消息* <xml>* <ToUserName>oANl56cC7d7JP88la43243WaA</ToUserName>* <FromUserName>gh_a1821534134</FromUserName>* <CreateTime>1597979297984</CreateTime>* <MsgType>text</MsgType>* <Content>你</Content>* </xml>**/ @Data public class TextMessage {private String ToUserName;private String FromUserName;private Long CreateTime;private String MsgType;private String Content;}4、編寫MessageUtil消息工具類
package com.example.mybaties.utils;import com.example.mybaties.entity.TextMessage; import com.thoughtworks.xstream.XStream; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map;/*** @Description: 消息工具類* @Author: lst* @Date 2020-08-19*/ public class MessageUtil {/*** 返回消息類型:文本*/public static final String RESP_MESSAGE_TYPE_TEXT = "text";/*** 返回消息類型:音樂*/public static final String RESP_MESSAGE_TYPE_MUSIC = "music";/*** 返回消息類型:圖文*/public static final String RESP_MESSAGE_TYPE_NEWS = "news";/*** 返回消息類型:圖片*/public static final String RESP_MESSAGE_TYPE_Image = "image";/*** 返回消息類型:語音*/public static final String RESP_MESSAGE_TYPE_Voice = "voice";/*** 返回消息類型:視頻*/public static final String RESP_MESSAGE_TYPE_Video = "video";/*** 請求消息類型:文本*/public static final String REQ_MESSAGE_TYPE_TEXT = "text";/*** 請求消息類型:圖片*/public static final String REQ_MESSAGE_TYPE_IMAGE = "image";/*** 請求消息類型:鏈接*/public static final String REQ_MESSAGE_TYPE_LINK = "link";/*** 請求消息類型:地理位置*/public static final String REQ_MESSAGE_TYPE_LOCATION = "location";/*** 請求消息類型:音頻*/public static final String REQ_MESSAGE_TYPE_VOICE = "voice";/*** 請求消息類型:視頻*/public static final String REQ_MESSAGE_TYPE_VIDEO = "video";/*** 請求消息類型:推送*/public static final String REQ_MESSAGE_TYPE_EVENT = "event";/*** 事件類型:subscribe(訂閱)*/public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";/*** 事件類型:unsubscribe(取消訂閱)*/public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";/*** 事件類型:CLICK(自定義菜單點擊事件)*/public static final String EVENT_TYPE_CLICK = "CLICK";/*** 事件類型:VIEW(自定義菜單URl視圖)*/public static final String EVENT_TYPE_VIEW = "VIEW";/*** 事件類型:LOCATION(上報地理位置事件)*/public static final String EVENT_TYPE_LOCATION = "LOCATION";/*** 事件類型:LOCATION(上報地理位置事件)*/public static final String EVENT_TYPE_SCAN = "SCAN";/*** @Description: 解析微信發來的請求(XML)* @param @param request* @param @return* @param @throws Exception* @author dapengniao* @date 2016年3月7日 上午10:04:02*/public static Map<String, String> parseXml(HttpServletRequest request) {// 將解析結果存儲在HashMap中Map<String, String> map = new HashMap<String, String>();// 讀取輸入流SAXReader reader = new SAXReader();Document document = null;InputStream inputStream = null;try {// 從request中取得輸入流inputStream = request.getInputStream();document = reader.read(inputStream);// 得到xml根元素Element root = document.getRootElement();// 得到根元素的所有子節點List<Element> elementList = root.elements();// 遍歷所有子節點elementList.stream().forEach(element -> {map.put(element.getName(), element.getStringValue());});} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {// 釋放資源if(null != inputStream){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return map;}/*** @Description: 文本消息對象轉換成xml* @param @param textMessage* @param @return* @author dapengniao* @date 2016年3月8日 下午4:13:22*/public static String textMessageToXml(TextMessage textMessage) {XStream xStream = new XStream();xStream.alias("xml", textMessage.getClass());return xStream.toXML(textMessage);} }5、編寫controller接口和實現類
/*** @Description 接收消息、響應處理代碼* @author lst* @date 2020-8-20 11:52 * @param request* @param response* @return java.lang.String*/@PostMapping(value = "/check-token", produces = "application/json; charset=utf-8")public String messageHandle(HttpServletRequest request, HttpServletResponse response) {return wxCheckSignatureService.messageHandle(request,response);}實現類
package com.example.mybaties.service.impl;import com.example.mybaties.entity.TextMessage; import com.example.mybaties.service.WxCheckSignatureService; import com.example.mybaties.utils.MessageUtil; import com.example.mybaties.utils.ShaUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; import java.util.Map;/*** @Author: lst* @Date 2020-08-18*/ @Slf4j @Service public class WxCheckSignatureServiceImpl implements WxCheckSignatureService {/*** @Description 接收消息、響應處理代碼* @author lst* @date 2020-8-20 11:52* @param request* @param response* @return java.lang.String*/@Overridepublic String messageHandle(HttpServletRequest request, HttpServletResponse response) {response.setCharacterEncoding("utf-8");Map<String,String> resultMap = MessageUtil.parseXml(request);log.info("讀取的請求resultMap:{}",resultMap);TextMessage textMessage = new TextMessage();textMessage.setToUserName(resultMap.get("FromUserName"));textMessage.setFromUserName(resultMap.get("ToUserName"));Date date = new Date();textMessage.setCreateTime(date.getTime());textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);if ("text".equals(resultMap.get("MsgType"))){textMessage.setContent(resultMap.get("Content"));}else {textMessage.setContent("目前僅支持文本呦");}String outMesStr = MessageUtil.textMessageToXml(textMessage);log.info("返回消息:{}",outMesStr);return outMesStr;}}測試并查看后臺打印的日志,首先微信測試號發消息,后臺打印后將原消息返回。
?
總結
以上是生活随笔為你收集整理的手把手教你使用java对接微信公众号-接收和回复基本信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网女皇Mary Meeker眼中的移
- 下一篇: Flash地址空间的数据读取