日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你使用java对接微信公众号-接收和回复基本信息

發(fā)布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你使用java对接微信公众号-接收和回复基本信息 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文檔中(https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)已經(jīng)告訴我們,當(dāng)普通微信用戶向公眾賬號發(fā)送消息時,微信服務(wù)器會把該消息封裝成XML數(shù)據(jù)包通過POST的方式發(fā)送到開發(fā)者填寫的URL上。我們設(shè)置的URL僅僅只有一個,上篇文章中是用來做接入驗證的,當(dāng)時是微信服務(wù)器發(fā)送GET請求過來,而現(xiàn)在是用來做消息處理的,此時微信服務(wù)器發(fā)送的是POST請求,因此想要區(qū)分開來應(yīng)該做什么事情,只需要根據(jù)請求方式來判斷即可。

1、編寫check-token接口的POST請求思路

兩次請求的url相同,但是請求方式不同,一個是GET方式一個是POST方式。根據(jù)開發(fā)文檔,接收普通的文本消息是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>

其他還有圖片、語音、視頻等。接下來,我們可以創(chuàng)建一個封裝消息的實體類,把所有可接收到的參數(shù)都放進入,其他類型的暫時不演示。

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: 解析微信發(fā)來的請求(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) {// 將解析結(jié)果存儲在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();// 得到根元素的所有子節(jié)點List<Element> elementList = root.elements();// 遍歷所有子節(jié)點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: 文本消息對象轉(zhuǎn)換成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接口和實現(xiàn)類

/*** @Description 接收消息、響應(yīng)處理代碼* @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);}

實現(xiàn)類

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 接收消息、響應(yīng)處理代碼* @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;}}

測試并查看后臺打印的日志,首先微信測試號發(fā)消息,后臺打印后將原消息返回。



?

總結(jié)

以上是生活随笔為你收集整理的手把手教你使用java对接微信公众号-接收和回复基本信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。