日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

全网最全java Springboot对接微信公众号开发平台(可能是最全)!

發布時間:2024/3/13 javascript 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全网最全java Springboot对接微信公众号开发平台(可能是最全)! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

微信服務接入教程文檔

文章目錄

  • 微信服務接入教程文檔
  • 微信開發技術文檔官網
  • 注冊成為微信開發者
    • 配置接受推送消息服務器
  • natapp下載,使用
  • 后臺構建
    • 后臺配置微信推送消息服務器
    • 接受消息推送
    • 操作對象,獲取請求類型(比如文本、圖片等)進行相應的處理,進行數據的變更處理
    • 數據返回
    • 自定義菜單
      • 訂閱消息事件,返回創建自定義菜單json數據
      • 用戶點擊自定義菜單事件 && 用戶點擊自定義鏈接事件

前言
本人不喜歡網絡上的各種文章,上來就把完整代碼放臉上,讓你琢磨不懂,這篇文章會盡量讓你不要出現這種情況。

微信開發技術文檔官網

https://mp.weixin.qq.com/

注冊成為微信開發者

  • 普通用戶建議注冊訂閱號
  • 文中后半部分的菜單配置等,需要其權限,可以用公司的公眾號來實驗
  • 打開基本配置菜單,成為開發者

配置接受推送消息服務器

  • URL必須有域名,且必須在外網可以訪問到,因此我們需要natapp來進行內網穿透,簡單點說就是把外網的IP映射到你當前的內網下,外網ip接受的內容會被轉到你映射的內網ip:端口下。
  • Token 隨便填
  • key隨便填
  • 建議選擇明文模式
  • 此時提交之后由于后端沒有對應的服務,所有無法成功,待下文可以開始提交的時候建議大家再進行提交

natapp下載,使用

官網:https://natapp.cn

  • 點擊客戶端下載即可,先不用急著點教程/文檔,里面并沒有我們當前想要的
  • 選擇系統對應的版本,這里使用的是win64,之后點擊箭頭指向的地方進行快速的安裝使用教程!
  • 安裝教程里面第一步是需要注冊

  • 購買隧道是有免費的和付費的,但是免費的需要進行支付寶實名認證,乍一看似乎能白嫖,但是我本人使用的時候,一到支付寶登陸的時候就顯示我支付寶賬號有危險,要我改密碼,死活上不去,無奈只好購買付費的。
  • 我也對客服進行了郵箱反饋,但是只是建議我進行付費的購買,并沒有說排查錯誤什么的!
    2.
    隧道協議選擇Web即可
    二級域名如果沒有先選擇不需要,如果你有自然更好。
    本地端口填寫一個即可,本人這里選擇的80
    帶寬&流量選擇小流量即可
    購買完之后進行注冊域名
    4.
    選擇一個可用于微信開發的即可
    之后再回到我的隧道里面進行綁定域名即可

    后臺構建

    構建之前,請大家大致的看微信開發平臺文檔一遍,比避免有些地方不懂(強烈告誡至少看一遍)

    本教程只需要大家看以上四個大章即可
    本教程以大家都有一個springboot的基本啟動程序,為前提(能啟動,controller能返回個hello,world即可)
    先給出本教程需要的全部maven包 —jdk 1.8
    開發工具 idea

    <!--devtools熱部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>true</scope></dependency><!-- xml --><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.1</version></dependency><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.11.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><!-- fastJSON --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-core</artifactId></dependency>

    后臺配置微信推送消息服務器

    import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; import com.alibaba.fastjson.JSON; //引用的其他自建類包,這里就不列出了@Slf4j @RestController @RequestMapping("/springsecurity/test") public class HelloController {@GetMapping("/weixin")public String weixin(HttpServletRequest request, HttpServletResponse response){return null;} }

    先定義這樣的一個類,加上一個接受微信推送消息服務器接口匹配的方法(暫時不需要定義其他類)

    • 按要求填寫這些輸入框
    • 建議大家先點擊提交,查看是否已經進入此方法
      完整代碼:
    @GetMapping("/weixin")public String weixin(HttpServletRequest request, HttpServletResponse response){String echostr = null;//token驗證代碼段try{log.info("請求已到達,開始校驗token");//這里對應的文檔里面的幾個參數,如果不清楚,請查看文檔if (StringUtils.isNotBlank(request.getParameter("signature"))) {String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");echostr = request.getParameter("echostr");log.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);if (SignUtil.checkSignature(signature, timestamp, nonce)) {log.info("數據源為微信后臺,將echostr[{}]返回!", echostr);response.getOutputStream().println(echostr);return echostr;}}}catch (IOException e){log.error("校驗出錯");e.printStackTrace();}return echostr; }

    接受消息推送

    接受信息推送這里需要進行新加類:

  • 新建utils package(包)
  • 在utils包下新建messagehandle
  • 在messagehandle包下,新建ParseXml類內容為:
  • import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; //引用的其他自建類包,這里就不列出了 //此部分代碼借鑒自網絡 @Slf4j public class ParseXml {/*** @author: wwy* @description: 解析微信發來的請求(XML)* @date 2021/1/20* @param request* @return java.util.Map<java.lang.String,java.lang.String>** java.util.Map<java.lang.String,java.lang.String>**/public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {// 將解析結果存儲在HashMap中Map<String, String> map = new HashMap<String, String>();// 從request中取得輸入流InputStream inputStream = request.getInputStream();// 讀取輸入流SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml根元素Element root = document.getRootElement();// 得到根元素的所有子節點List<Element> elementList = root.elements();// 遍歷所有子節點for (Element e : elementList) {map.put(e.getName(), e.getText());log.info("name:" + e.getName() + " value:"+map.get(e.getName()));}// 釋放資源inputStream.close();return map;} }
  • 然后在上文的HelloController中新建方法如下:
  • @PostMapping("/weixin")public void message(HttpServletRequest request, HttpServletResponse response){try {Map<String, String> paramMap = ParseXml.parseXml(request);log.info(JSON.toJSONString(paramMap));//這里把request參數傳入parsexml方法進行xml到map對象的轉換。//使用map接受返回值即可//建議大家先發給公眾號消息,查看查看這玩意長什么樣子!//當然我們parseXml里面已經打印出來了} catch (Exception e) {e.printStackTrace();}}


    附圖供大家看!
    根據官方文檔可知:

    基本每一個消息都會有一個MsgType來確定是什么類型的,所以我們這里要獲取它:

    Map<String, String> paramMap = ParseXml.parseXml(request); String type = paramMap.get("MsgType");


    被動回復用戶消息章節文檔,我們最后是需要返回xml形式的給微信服務器。
    所以我們的大體步驟是:

  • 獲取微信服務器的請求,解析xml為對象
  • 操作對象,獲取請求類型(比如文本、圖片等)進行相應的處理,進行數據的變更
  • 把對象變為xml形式返回
  • 操作對象,獲取請求類型(比如文本、圖片等)進行相應的處理,進行數據的變更處理

    操作對象

    • 首先每個返回的事件類型有一個自己的返回格式,但是都有幾個共同的字段,所以我們可以先定一個實體基類,然后其他的各種格式來繼承它,獲取共同的屬性(這里的思路出自網絡代碼,但是網絡代碼完整性,實用性比較低,擴展性也不行所以我進行了大幅的修改)。
    • 實體基類BaseMessage代碼如下(請自行新建包來進行放置,建議不要和utils放置在一起):
    import lombok.Data; @Data public class BaseMessage {/*** 開發者微信號*/private String ToUserName;/*** 發送方帳號(一個OpenID)*/private String FromUserName;/*** 消息創建時間 (整型)*/private Long CreateTime;/*** 消息類型(鏈接-link /地理位置-location /小視頻-shortvideo/視頻-video /語音-voice /圖片-image /文本-text)*/private String MsgType;/*** 消息id,64位整型*/private Long MsgId;}
    • 文字消息實體類TextMessage
    @Data public class TextMessage extends BaseMessage{/*** 消息內容*/private String Content;//由于打印本類toString時只會打印本類有的屬性,不會打印父類的,所以我們需要重寫類的toString,加上本類屬性和父類屬性public String toString(){return super.toString() + "[TextMessage]:" + " Content:" + this.Content;} }
    • 圖片消息實體類ImageMessage
    @Data public class ImageMessage extends BaseMessage {/*** 圖片鏈接*/private String PicUrl;/*** 圖片消息媒體id,可以調用獲取臨時素材接口拉取數據。*/private String MediaId;public String toString(){return super.toString() + "[ImageMessage]:" + " PriUrl:" + this.PicUrl+ " MediaId:" + this.MediaId;} }
    • 語音消息實體類VoiceMessage
    @Data public class VoiceMessage extends BaseMessage {/*** 語音消息媒體id,可以調用獲取臨時素材+接口拉取數據。*/private String MediaId;/*** 語音格式,如amr,speex等*/private String Format;public String toString(){return super.toString() + "[VoiceMessage]:" + " MediaId:" + this.MediaId+ " Format:" + this.Format;} }
    • 視頻消息實體類VideoMessage
    @Data public class VideoMessage extends BaseMessage{/*** 視頻消息媒體id,可以調用獲取臨時素材接口拉取數據。*/private String MediaId;/*** 視頻消息縮略圖的媒體id,可以調用多媒體文件下載接口拉取數據*/private String ThumbMediaId;public String toString(){return super.toString() + "[VideoMessage]:" + " MediaId:" + this.MediaId+ " ThumbMediaId:" + this.ThumbMediaId;}}
    • 暫時不提供小視頻處理類,請自行添加
    • 地理位置處理類LocationMessage
    @Data public class LocationMessage extends BaseMessage {/*** 地理位置維度*/private String Location_X;/*** 地理位置經度*/private String Location_Y;/*** 地圖縮放大小*/private String Scale;/*** 地理位置信息*/private String Label;public String toString(){return super.toString() + "[LocationMessage]:" + " Location_X:" + this.Location_X+ " Location_Y:" + this.Location_Y + " Scale:" + this.Scale+ " Lable:" + this.Label;} }
    • 鏈接消息實體類LinkMessage
    @Data public class LinkMessage extends BaseMessage{/*** 消息標題*/private String Title;/*** 消息描述*/private String Description;/*** 消息鏈接*/private String Url;public String toString(){return super.toString() + "[LinkMessage]:" + " Title:" + this.Title+ " Description:" + this.Description + " Url:" + this.Url;} }
    • 現在有了對象之間的映射但是還少一個判斷是什么事件類型的枚舉類,請在utils包下新建code

    • code包下新建MessageCode

    • 類如下(這個其實還少一兩個,但是懶的加了,有需要的自己加上,此代碼完全來自網上,沒有多少需要修改的):

    @Slf4j public class MessageCode {/*** 請求消息類型:文本*/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_VOICE = "voice";/*** 請求消息類型:視頻*/public static final String REQ_MESSAGE_TYPE_VIDEO = "video";/*** 請求消息類型:小視頻*/public static final String REQ_MESSAGE_TYPE_SHORTVIDEO = "shortvideo";/*** 請求消息類型:地理位置*/public static final String REQ_MESSAGE_TYPE_LOCATION = "location";/*** 請求消息類型:鏈接*/public static final String REQ_MESSAGE_TYPE_LINK = "link";/*** 請求消息類型:推送*/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(掃描二維碼事件)*/public static final String EVENT_TYPE_SCAN = "SCAN";/*** 事件類型:LOCATION(位置上報事件)*/public static final String EVENT_TYPE_LOCATION = "LOCATION";/*** 事件類型:VIEW(自定義菜單View事件)*/public static final String EVENT_TYPE_VIEW = "VIEW";}
    • 此時我們就可以在helloController里面進行事件類型的判斷了,代碼如下:
    try { //try-catch后面會用到Map<String, String> paramMap = ParseXml.parseXml(request);String type = paramMap.get("MsgType");//處理消息事件if(MessageCode.REQ_MESSAGE_TYPE_TEXT.equals(type)){log.warn("進入消息事件!");}} catch (Exception e) {e.printStackTrace();}}
    • 這里我們已經進行成功的判斷了,那么接下來就需要根據傳來的參數對象,進行返回參數xml的構建
    • utils包新建msghandle
    • msghandle包下,新建MsgHandleMsgHelpClass2個類
    • MsgHandle : 處理消息的分發,因為每一個消息類型的返回值,各有個的特點
    • MsgHelpClass:每一個消息類型的返回值,雖然各有各的特點,但是依然有共同的地方,用于輔助MsgHandle

    • MsgHandle 代碼如下:
    import java.util.Date; import java.util.Map; import lombok.Data; import lombok.extern.slf4j.Slf4j; import com.alibaba.fastjson.JSONObject; //自建包請自導入 @Data @Slf4j public class MsgHandle {/*** 發送方賬號(一個openId)*/private String FromUserName;/*** 開發者微信號*/private String ToUserName;/*** 消息創建時間*/private long CreateTime;/*** 消息類型:* 文本:text* 圖片:image* 語音:voice* 視頻:video* 小視頻:shortvideo* 地理位置:location* 鏈接:link*/private String MsgType;/*** 消息id,64位整數*/private long MsgId;}
    • 此類有4個共同的屬性,下面的代碼直接加在此類中即可,分開只是為了更好理解,避免第一眼看上去太多,難以理解
    public String processMessage(Map<String, String> map) throws InstantiationException, IllegalAccessException{//首先對自己的私有屬性進行賦值,接著創建基類實體對象, this.FromUserName = map.get("ToUserName"); //!!!!!這里是調換的//特別說明這里,看上面兩個圖中,我們會發現關于ToUserName的說明是收到openId,所以這里是調換的!this.ToUserName = map.get("FromUserName");this.MsgType = map.get("MsgType");this.CreateTime = Long.valueOf(map.get("CreateTime"));this.MsgId = Long.valueOf(map.get("MsgId"));BaseMessage baseMessage = null;//目前只支持文字消息回復//用枚舉獲取是什么類型,再進入里面進行具體操作if (this.MsgType.equals(MessageCode.REQ_MESSAGE_TYPE_TEXT)) { // 文本消息log.info("這是文本消息!");//這里用到了MsgHelpClass的方法,請看下文的此方法代碼//參數1:this processMessage對象即可//參數2:對應消息處理類即可baseMessage = MsgHelpClass.setAttribute(this, TextMessage.class);//向下轉型,小心,如果報了什么class異常,就是這里的問題。TextMessage textMessage = (TextMessage) baseMessage;//向文字消息實體類添加私有的屬性數據textMessage.setContent("這里是測試回復");//這里為生成xml數據的類,需要我們提供一個要生成xml數據的實體類,下文放代碼return ParseXml.textMessageToXml(textMessage);}if (this.MsgType.equals(MessageCode.REQ_MESSAGE_TYPE_IMAGE)) { // 圖片消息log.info("這是圖片消息!");}if (this.MsgType.equals(MessageCode.REQ_MESSAGE_TYPE_LINK)) { // 鏈接消息log.info("這是鏈接消息!");}if (this.MsgType.equals(MessageCode.REQ_MESSAGE_TYPE_LOCATION)) { // 位置消息log.info("這是位置消息!");}if (this.MsgType.equals(MessageCode.REQ_MESSAGE_TYPE_VIDEO)) { // 視頻/小視頻消息log.info("這是視頻消息!");}if (this.MsgType.equals(MessageCode.REQ_MESSAGE_TYPE_VOICE)) { // 語音消息log.info("這是語音消息!");}return "";}
    • MsgHelpClass類代碼如下:
    import java.util.Date; import lombok.extern.slf4j.Slf4j; //自建類請自行導入 @Slf4j public class MsgHelpClass {//其實這里多加一個這個方法,而不是在processmessage里面直接進行轉型,是因為會報轉型錯誤的異常,用instanceof這里不太管用。//方法講解://規定第一個參數必須為 MsgHandle對象,用他的私有屬性給實體基類進行賦值//規定第二個參數必須為繼承自BaseMessage基類的子類,用來向下轉型public static <E extends BaseMessage>E setAttribute(MsgHandle msgHandle,Class<E> eClass) throws IllegalAccessException, InstantiationException {//newInstance 獲取對象,相當于new 對象BaseMessage baseMessage = eClass.newInstance();baseMessage.setCreateTime(new Date().getTime());baseMessage.setFromUserName(msgHandle.getFromUserName());baseMessage.setMsgId(msgHandle.getMsgId());baseMessage.setToUserName(msgHandle.getToUserName());baseMessage.setMsgType(msgHandle.getMsgType());log.warn("MsgHelpClass-setAttribute方法返回值如下:\n" + baseMessage.toString());return (E) baseMessage;} }
    • 上面兩個類就是處理分發的類,但是上面我們也提到了一個把數據處理返回為xml,ParseXml類的靜態方法
    • 此方法在ParseXml類中為:
    public static String textMessageToXml(TextMessage textMessage) {log.warn("ParseXml類TextMressage對象值如下:\n" + textMessage.toString());//真正用來處理的方法,也在本類中return XmlHandleFun(textMessage);} //圖片處理 暫時無實現,請后續自行實現public static String imageMessageToXml(ImageMessage imageMessage) {log.warn("ParseXml類ImageMessage對象值如下:\n" + imageMessage.toString());return "";} //音頻處理 暫時無實現,請后續自行實現 public static String voiceMessageToXml(VoiceMessage voiceMessage) {log.warn("ParseXml類VoiceMessage對象值如下:\n" + voiceMessage.toString());return ""; } //視頻處理 暫時無實現,請后續自行實現 public static String videoMessageToXml(VideoMessage videoMessage) {log.warn("ParseXml類VideoMessage對象值如下:\n" + videoMessage.toString());return ""; } //其余無寫的,請自行添加
    • 上文提到的XmlHandleFun方法代碼如下:
    //本類講解,參數必須是一個繼承自baseMessage基類的子類對象 //返回值為String,生成的xml數據我們需要的string類型的,返回給服務器的也是String類型的 //本文需要一定的dom4j知識,推薦大家去https://www.cnblogs.com/qqran/p/12520901.html這里進行速成,很快幾分鐘 //當然不想看的話,后面也有簡單的介紹 private static <T extends BaseMessage> String XmlHandleFun(T object){//Document對象,后續用他生成xml結構,并調用他的方法進行string類型數據返回Document dou = null; //用來判斷下文的if是否還繼續判斷,當然這里這個判斷是重復的,大家可以在看懂此代碼塊之后,自己決定是否刪除boolean isif = true;try {//開始創建dom結構dou = DocumentHelper.createDocument();//dou.addElement 創建唯一的全局父節點,根據官方文檔的格式,返回的xml'格式基本只有最多3級Element root = dou.addElement("xml");//root.addElement 在root節點下,創建一個節點,相當于二級節點<ToUserName></ToUserName>//attText 為添加二級節點的內容,<ToUserName>內容</ToUserName>//補充知識:如果要給此行添加xml屬性,使用如下代碼-> root.addAttribute("id", "屬性");//值為<xml id="屬性"></xml>//獲取對象的值,進行字符串拼接Element emp = root.addElement("ToUserName").addText("<![CDATA[" + object.getToUserName() + "]]>");Element emp1 = root.addElement("FromUserName").addText("<![CDATA[" + object.getFromUserName() + "]]>");Element emp2 = root.addElement("CreateTime").addText(String.valueOf(object.getCreateTime()));Element emp3 = root.addElement("MsgType").addText("<![CDATA[" + object.getMsgType() + "]]>"); //判斷傳入的對象是否是它的實例//是的話進行轉型,并添加屬于自己類的特有的屬性!if(object instanceof TextMessage && isif){TextMessage textMessage = (TextMessage) object;Element emp4 = root.addElement("Content").addText("<![CDATA[" + textMessage.getContent() + "]]>");isif = false;}if(object instanceof ImageMessage && isif){ImageMessage imageMessage = (ImageMessage) object;Element emp4 = root.addElement("Image");emp4.addElement("MediaId").addText("<![CDATA[" + imageMessage.getMediaId() + "]]>");isif = false;}if(object instanceof VoiceMessage && isif){VoiceMessage voiceMessage = (VoiceMessage) object;Element emp4 = root.addElement("Voice");emp4.addElement("MediaId").addText("<![CDATA[" + voiceMessage.getMediaId() + "]]>");isif = false;}if(object instanceof VideoMessage && isif) {VideoMessage videoMessage = (VideoMessage) object;Element emp4 = root.addElement("Video");emp4.addElement("MediaId").addText("<![CDATA[" + videoMessage.getMediaId() + "]]>");emp4.addElement("Title").addText("<![CDATA[" + videoMessage.getTitle() + "]]>");emp4.addElement("Description").addText("<![CDATA[" + videoMessage.getDescription() + "]]>");isif = false;}}catch(Exception e){log.error("出現錯誤!XmlHandleFun");e.printStackTrace();}//生成的xml是附帶<?xml version="1.0" encoding="UTF-8"?>此行的,我還并沒有測試帶上返回給微信服務器是否可行,當前沒被注釋的是去除此行的,如果使用注釋的一行則是直接返回生成的,帶上此頭部的int count = "encoding=\"UTF-8\"?".length();String result = dou.asXML();result = result.substring(result.indexOf("encoding=\"UTF-8\"?") + count + 1);return result.trim(); // return dou.asXML();}

    數據返回

    以上配置完成之后我們就可以進行HelloController剩下的部分了

    //我們只需要在原有的判斷條件下增加如下的代碼: if(MessageCode.REQ_MESSAGE_TYPE_TEXT.equals(type)){MsgHandle msgHandle = new MsgHandle();ResultRes.response(msgHandle.processMessage(paramMap),response); }
    • 看到這里你可以會說這ResultRes.response又是個什么東西,都配置怎么多了怎么還有,我答應你們這真的是最后一個了,別罵了別罵了!
    • utilsl包新建reresult包(我承認我這個名字不規范,不合適 …)
    • reresult包下新建ResultRes
    • ResultRes類代碼如下:
    import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringEscapeUtils; import org.dom4j.Document; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.thymeleaf.util.StringUtils; @Slf4j public class reresult {public static void response(String data, HttpServletResponse response) {//用此方法進行xml文件的轉義和format效果類似,因為上文的代碼中,返回的string數據里面的,< >符合已經被轉義無法正常傳輸給微信服務器識別data = StringEscapeUtils.unescapeXml(data);log.info(data);//如果數據為空,直接返回if(StringUtils.isEmpty(data)){log.error("數據為空!");return;}try {//進行編碼規定,返回數據!response.setCharacterEncoding("UTF-8");PrintWriter printWriter = response.getWriter();printWriter.print(data);printWriter.close();}catch (IOException io){log.error(io.getMessage());io.printStackTrace();}}/*** @Title: format* @Description: 格式化輸出xml字符串* @param str* @return String* @throws Exception* 這里的代碼是網上的,本來要用的,但是也最后沒用,是用來解決xml里面的<>符合傳輸的時候被轉義的問題*/public static String format(String str) throws Exception {SAXReader reader = new SAXReader();// 創建一個串的字符輸入流StringReader in = new StringReader(str);Document doc = reader.read(in);// 創建輸出格式OutputFormat formater = OutputFormat.createPrettyPrint();// 設置xml的輸出編碼formater.setEncoding("utf-8");// 創建輸出(目標)StringWriter out = new StringWriter();// 創建輸出流XMLWriter writer = new XMLWriter(out, formater);// 輸出格式化的串到目標中,執行后。格式化后的串保存在out中。writer.write(doc);writer.close();// 返回格式化后的結果return out.toString();} }

    到這里正常情況下,已經可以對用戶輸入的普通文本消息進行自動回復了!

    自定義菜單

    • HelloController類**message(get)**方法里,String type = paramMap.get("MsgType");下加入
    • String event = null; //獲取自定義點擊/推送事件 if(paramMap.get("Event") != null){ event = paramMap.get("Event"); }
    • 獲取事件字符串之后,我們需要進行匹配,來進入相應的處理

    訂閱消息事件,返回創建自定義菜單json數據

    • 在**message(get)**方法里加入
    //訂閱消息事件 if(MessageCode.EVENT_TYPE_SUBSCRIBE.equals(event)){String token = GetBodyMessage.getAcces_Token("wx59fa3e56c3448f46");String body = GetBodyMessage.getBodyJson();String s = httpsRequest.httpsRequests("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + token, "POST", body);System.err.println(s); }
    • 我們需要新建GetBodyMessage類,代碼如下:
    import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import java.util.HashMap; import java.util.Map; import lombok.extern.slf4j.Slf4j;@Slf4j public class GetBodyMessage {//添加菜單自定義json數據public static String getBodyJson(){Map<String, Object> mapbutton = new HashMap<>();Map<String, Object> mapbody = new HashMap<>();Map [] strargs = new Map[1];mapbody.put("type","view");mapbody.put("name","成績查詢!");mapbody.put("key","message");mapbody.put("url","http://www.baidu.com");strargs[0] = mapbody;mapbutton.put("button", strargs);String body = JSON.toJSONString(mapbutton);log.error(body);//自定義菜單官網返回數據為json數據!return body;}//獲取access_tokenpublic static String getAcces_Token(String appid){String token = "grant_type=client_credential&appid=" + appid +"&secret=xxxxxxxxxxxxxxxxxxxxxx";//httpRequest代碼在下文String result = httpRequest.httpRequests("https://api.weixin.qq.com/cgi-bin/token","GET",token);Map map = JSONArray.parseObject(result);System.out.println(map.get("access_token"));return (String) map.get("access_token");}}
    • getBodyJson方法返回的json結構如下:**
    • 官網token獲取請求實例如下:
    • 創建httpRequest類和httpsRequest類,代碼如下(代碼源自網絡):
    • 網址:鏈接
    import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL;public class httpRequest {//處理http請求 requestUrl為請求地址 requestMethod請求方式,值為"GET"或"POST"public static String httpRequests(String requestUrl,String requestMethod,String outputStr){StringBuffer buffer=null;try{URL url=new URL(requestUrl);HttpURLConnection conn=(HttpURLConnection)url.openConnection();conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod(requestMethod);conn.connect();//往服務器端寫內容 也就是發起http請求需要帶的參數if(null!=outputStr){OutputStream os=conn.getOutputStream();os.write(outputStr.getBytes("utf-8"));os.close();}//讀取服務器端返回的內容InputStream is=conn.getInputStream();InputStreamReader isr=new InputStreamReader(is,"utf-8");BufferedReader br=new BufferedReader(isr);buffer=new StringBuffer();String line=null;while((line=br.readLine())!=null){buffer.append(line);}}catch(Exception e){e.printStackTrace();}return buffer.toString();}} import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager;public class httpsRequest {/** 處理https GET/POST請求* 請求地址、請求方法、參數**/public static String httpsRequests(String requestUrl,String requestMethod,String outputStr){StringBuffer buffer=null;try{//創建SSLContextSSLContext sslContext=SSLContext.getInstance("SSL");TrustManager[] tm={new MyX509TrustManager()};//初始化sslContext.init(null, tm, new java.security.SecureRandom());;//獲取SSLSocketFactory對象SSLSocketFactory ssf=sslContext.getSocketFactory();URL url=new URL(requestUrl);HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);conn.setRequestMethod(requestMethod);//設置當前實例使用的SSLSoctetFactoryconn.setSSLSocketFactory(ssf);conn.connect();//往服務器端寫內容if(null!=outputStr){OutputStream os=conn.getOutputStream();os.write(outputStr.getBytes("utf-8"));os.close();}//讀取服務器端返回的內容InputStream is=conn.getInputStream();InputStreamReader isr=new InputStreamReader(is,"utf-8");BufferedReader br=new BufferedReader(isr);buffer=new StringBuffer();String line=null;while((line=br.readLine())!=null){buffer.append(line);}}catch(Exception e){e.printStackTrace();}return buffer.toString();} }

    https請求如果報錯,可能還需要導入服務端的安全證書步驟如下:

  • 例:點擊下圖中紅線指向的小鎖(谷歌瀏覽器)
  • 點擊證書一行
  • 點擊詳細信息
  • 點擊復制到文件
  • 下一步然后來到下圖頁面
  • 選擇DER編碼二進制X.509后點擊下一步
  • 隨意選擇一個文件名和文件路徑。
  • 打開cmd進入剛剛創建的文件路徑,命令行輸入Keytool -import -alias 文件名 -file 文件名.cer -keystore cacerts
  • 回車之后會讓輸入口令,一般口令默認是changeit。輸入密鑰時并不會顯示在界面上。
  • 輸入正確之后會讓你選擇是否信任該證書,輸入y,會提示導入成功!
    • 完成之后,用戶訂閱該公眾號之后就會出現菜單。

    用戶點擊自定義菜單事件 && 用戶點擊自定義鏈接事件

    • 由于上文新建的菜單里面包括了用戶點擊自定義菜單事件 && 用戶點擊自定義鏈接事件這兩個,所以我們只需要添加如下代碼,觀察到用戶的操作即可:
    //用戶點擊自定義菜單事件 if(MessageCode.EVENT_TYPE_CLICK.equals(event)){//事件KEY值,與自定義菜單接口中KEY值對應String eventKey = "message";log.warn(JSON.toJSONString(paramMap));if(eventKey.equals(paramMap.get("EventKey"))){log.warn("進入成績查詢點擊事件,開始處理并返回!");} } //用戶點擊自定義鏈接事件 if(MessageCode.EVENT_TYPE_VIEW.equals(event)){log.warn("進入百度頁面跳轉事件!"); }

    總結

    以上是生活随笔為你收集整理的全网最全java Springboot对接微信公众号开发平台(可能是最全)!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    黄色的网站免费看 | 国产在线日韩 | 国产一区二区在线播放视频 | 免费a视频 | 亚洲色图美腿丝袜 | 成人国产一区二区 | 96av在线视频| 国产精品久久影院 | 日韩国产精品一区 | 免费观看一区二区三区视频 | 国产精品国产亚洲精品看不卡 | 中文字幕日韩国产 | 色综合久久久久综合体桃花网 | 黄色片软件网站 | 免费观看xxxx9999片 | 国产美女久久 | av中文字幕在线播放 | 欧美精品九九 | 久久视频精品在线观看 | 色噜噜狠狠狠狠色综合久不 | 久草视频在线观 | 久久伊人精品一区二区三区 | 天天干天天拍天天操天天拍 | 毛片网站在线观看 | 色香蕉在线 | 奇米影视在线99精品 | 黄色福利视频网站 | 婷婷四房综合激情五月 | 在线国产激情视频 | 国产成人av福利 | 国产精品一区二区62 | 成人羞羞视频在线观看免费 | 丁香五婷 | 欧美一区二区三区四区夜夜大片 | 久操视频在线免费看 | 欧美91精品 | 日韩免费在线视频观看 | 久久亚洲免费 | 国产二区视频在线 | 免费精品国产 | 偷拍精品一区二区三区 | 国内精品久久久久影院日本资源 | 国产日韩欧美自拍 | 欧美91视频 | 国产免费久久av | 国产69熟 | 999国产 | 色久av | 色香蕉网| 99色在线观看| 91.精品高清在线观看 | 国产日产在线观看 | 亚洲高清视频一区二区三区 | 中文在线免费一区三区 | 成人免费在线视频 | 亚洲欧美视频网站 | 超碰在线免费福利 | 亚洲色图av | 青草视频在线免费 | 国产夫妻性生活自拍 | 欧美成人精品在线 | 在线观看免费日韩 | 五月婷丁香网 | 日本动漫做毛片一区二区 | 久久国产精品99久久人人澡 | 最近中文字幕国语免费高清6 | 四虎www | 九草视频在线 | av网址在线播放 | 久青草视频 | 国产一区久久 | 黄色一级在线观看 | 99在线观看视频网站 | 亚洲成av | 欧美欧美 | 9久久精品 | 午夜av电影院 | 婷婷色亚洲 | 色婷婷在线播放 | 午夜 久久 tv | 色婷婷免费 | 国产一级特黄毛片在线毛片 | 麻豆国产精品永久免费视频 | 狠狠的干狠狠的操 | 亚洲一区久久 | 国产精品久久久久久久免费 | 91精品在线视频观看 | 在线影视 一区 二区 三区 | 中文字幕在线高清 | 精品国产一区二区三区免费 | 国产丝袜在线 | 麻豆成人精品视频 | 国产精品成人一区二区三区吃奶 | 婷婷网址| 亚洲成av人片一区二区梦乃 | 91九色精品女同系列 | 成人中文字幕+乱码+中文字幕 | 午夜色站 | 久久一区精品 | 成人免费网站在线观看 | 人人干天天射 | 色婷婷综合成人av | 日韩一区二区三区高清在线观看 | 98久9在线 | 免费 | 国产精品色视频 | 中文不卡视频 | 日本黄色片一区二区 | 九月婷婷人人澡人人添人人爽 | 久久精品久久综合 | 天天天色| 国产成人精品久久久久 | 成人黄色资源 | 亚洲视频2 | 丁香六月婷 | 天堂av在线免费观看 | 成人午夜免费福利 | av中文字幕在线免费观看 | 亚洲人在线视频 | 精品极品在线 | 91人人爽人人爽人人精88v | 黄色av一级片 | 国产中文字幕三区 | 亚洲国产精品一区二区久久hs | 中文字幕一区二区在线观看 | 天堂av在线 | 韩国在线一区二区 | 久综合网 | 懂色av一区二区三区蜜臀 | 久久久久久久久久久影院 | 国产精品国产精品 | 色wwwww | 成人免费观看完整版电影 | 在线视频亚洲 | 亚洲一级电影在线观看 | 一区二区三区电影 | 国产美女搞久久 | 国产成人三级 | www.夜色.com | 97超碰精品 | 免费看污网站 | 国产精品人成电影在线观看 | www.成人久久 | 久久久久久久网站 | ,午夜性刺激免费看视频 | 精品久久综合 | 黄色三级在线看 | 日韩av一区二区三区 | 久草国产视频 | 18国产精品白浆在线观看免费 | 日本在线观看一区 | 久久毛片视频 | 国产精品久久久久一区二区国产 | 免费视频91蜜桃 | 97色在线观看免费视频 | 国产最顶级的黄色片在线免费观看 | 亚洲精品在线一区二区 | 久久精品国产亚洲精品 | 国产成人精品综合久久久久99 | 91在线精品观看 | 成人在线观看资源 | 国产va在线观看免费 | 91色在线观看 | 久久精品综合一区 | 99精品视频网站 | 日韩一级片大全 | 日韩久久久久久久久久 | h动漫中文字幕 | 久久精品视频中文字幕 | 亚洲第一久久久 | 中文字幕在线网 | 国语自产偷拍精品视频偷 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 一级黄色片毛片 | 五月婷婷操 | 最近中文字幕在线播放 | 日本一区二区三区免费观看 | 日本69hd| 色国产在线 | 免费视频xnxx com | 欧美极品久久 | 日本久久久亚洲精品 | 91桃色免费观看 | 久久久在线视频 | 亚洲国产精品视频在线观看 | 亚洲精品777| 亚洲欧美国产精品va在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 精品久久1 | 成人av播放 | 激情在线网| 亚洲欧美国产精品久久久久 | 97福利视频 | 天天艹天天 | 99在线视频免费观看 | 91丨九色丨国产在线观看 | 国产真实在线 | 久久婷五月 | 九九免费在线观看视频 | www黄在线| 欧美性大战久久久久 | 五月天国产精品 | 日本黄网站 | 激情五月婷婷综合网 | 奇米四色影狠狠爱7777 | 激情丁香综合五月 | 99久久精品免费看国产 | 99精品在线免费观看 | 五月天激情婷婷 | 免费看一及片 | 麻豆果冻剧传媒在线播放 | www.伊人网| 亚洲欧美在线综合 | 久久婷婷精品视频 | 久草视频中文 | 免费成人看片 | 久久er99热精品一区二区 | 国产一二区免费视频 | 在线观看视频亚洲 | 日韩美在线观看 | 亚洲精品综合在线观看 | 天天夜夜狠狠操 | 久久人人爽人人爽人人片av软件 | 久草视频在线观 | 精品亚洲视频在线 | 国产精品乱码久久久久久1区2区 | 色91在线视频| 成人免费视频网站在线观看 | 亚洲午夜激情网 | 亚洲人成在线观看 | 国产精品麻豆99久久久久久 | 成人小视频在线观看免费 | 国产永久免费高清在线观看视频 | 免费色网站 | 在线观看 国产 | 九九热精品视频在线播放 | 久久九九久久九九 | 国产精品欧美精品 | 国产精品久久久久久模特 | 国产麻豆剧传媒免费观看 | 婷婷丁香自拍 | 国产精品美女久久久网av | 超碰人人草 | 91黄色小网站 | 久久久久久麻豆 | 国产h在线播放 | 久久综合婷婷综合 | 国产偷国产偷亚洲清高 | 免费精品视频在线 | 欧美日韩免费看 | 97国产一区二区 | 久久久久久久看片 | 免费看成年人 | 美女视频黄在线观看 | 精品一区中文字幕 | 美女网站在线看 | 美女在线黄 | 免费网站黄 | 成人免费视频播放 | 久久国产精品一区二区 | 欧美a级在线免费观看 | 中文字幕日韩无 | 日韩理论在线播放 | 国产探花视频在线播放 | 免费视频一区 | 日韩在线视频观看 | 国产99久 | 中文字幕第一 | 欧美日产一区 | 中文区中文字幕免费看 | 久久国产精品99久久久久久丝袜 | 亚洲精品动漫久久久久 | 国产亚洲精品久久久久久久久久 | 91毛片在线观看 | 九热在线 | 成人国产在线 | 日韩欧美视频在线免费观看 | 成人网在线免费视频 | 国产伦精品一区二区三区免费 | 国产视频在线看 | 2021国产在线 | 日韩午夜视频在线观看 | a电影在线观看 | 亚洲黄色激情小说 | 亚洲精品美女免费 | 欧美a级在线免费观看 | 成人黄色小视频 | 五月婷婷综| 超碰97久久 | 国产这里只有精品 | av中文字幕在线播放 | 国产在线国偷精品产拍免费yy | 91精品国产一区二区三区 | av导航福利 | 久久激情日本aⅴ | 91精选在线 | 91精品第一页 | 久久国产精品成人免费浪潮 | 国产高清在线观看av | 日韩在线观看你懂的 | 国产精品区二区三区日本 | 999视频网 | 亚洲综合精品视频 | 六月丁香伊人 | 久久久久久久影院 | 7777精品伊人久久久大香线蕉 | 亚洲成人av在线 | 欧美精品免费在线 | 在线观看视频中文字幕 | 色天天综合网 | 在线三级中文 | 欧美极品久久 | 视频在线播放国产 | 欧美a级片网站 | 免费福利在线播放 | www四虎影院 | 99人成在线观看视频 | 国产伦理一区二区 | 久久久国产精华液 | 日本精品二区 | 在线视频亚洲 | 黄色毛片一级片 | 午夜av电影| 国产一级片一区二区三区 | 亚洲国产片 | 激情综合亚洲 | 欧洲精品码一区二区三区免费看 | 国产精品成 | 精品人人爽 | 婷婷亚洲五月色综合 | 日韩成人在线免费观看 | 午夜私人影院久久久久 | 亚洲成年人免费网站 | 在线免费观看视频你懂的 | 麻豆视频在线免费观看 | 色99之美女主播在线视频 | 中文字幕在线观看视频一区二区三区 | 少妇性bbb搡bbb爽爽爽欧美 | 精品日本视频 | 国产精品免费在线播放 | 中文字幕亚洲不卡 | 久久一区二 | 久久综合久久综合九色 | 久热精品国产 | 久久99最新地址 | 99精品黄色片免费大全 | 97超碰总站| 一区二区三区四区五区六区 | 国产黄色精品在线 | 91福利社在线观看 | 在线视频观看亚洲 | 9797在线看片亚洲精品 | 日日爽天天爽 | 操高跟美女 | 国产高清一| 成人黄色片在线播放 | 欧美在线18 | 午夜免费福利片 | 欧美激情综合五月色丁香小说 | 婷婷丁香六月 | 久久精品久久久久 | 激情五月在线视频 | 亚洲人av免费网站 | 欧美日韩在线第一页 | 69中文字幕 | 国内小视频在线观看 | 亚洲成人av在线 | 久久久久久久久毛片精品 | 久久伦理电影网 | 久久免费视频国产 | 中文字幕91在线 | 免费福利在线视频 | 97精品国产91久久久久久久 | 911国产在线观看 | 国产不卡免费av | 欧美日韩国产高清视频 | 91精品视频观看 | 亚洲电影免费 | 日韩av专区 | 91视频久久 | 91精品对白一区国产伦 | 欧美激情精品久久久久久变态 | 婷婷激情五月综合 | 久久精品4 | 一区二区三区免费在线观看视频 | 色999五月色 | 国产福利精品视频 | 最近的中文字幕大全免费版 | 日韩高清精品免费观看 | 91经典在线 | 国产午夜在线 | 天天干夜夜爽 | 天天舔天天射天天操 | 亚洲国产久 | 精品一区二区免费视频 | 91污污| 911av视频 | 亚洲精品一区二区三区在线观看 | 99av国产精品欲麻豆 | 免费黄a | 欧美福利在线播放 | 91福利区一区二区三区 | 一区二区精品视频 | 国产精品一区二区视频 | 久久高清免费观看 | 成人午夜av电影 | 欧美中文字幕久久 | 97人人爽人人 | 欧美精品一区在线发布 | 少妇做爰k8经典 | 国产成人久 | 美女网站视频免费都是黄 | 国产精品欧美久久久久无广告 | 精品一区二区视频 | 国产视频精品在线 | 精品播放 | 婷婷在线视频 | 欧美日韩精品在线观看视频 | 91视频3p| 天天操狠狠操 | 精品国产一区二区三区在线 | 欧美精品久久久久性色 | 成年人网站免费观看 | 欧美综合干 | 国产麻豆剧传媒免费观看 | a黄色片在线观看 | 国产精品久久在线观看 | 国产精品午夜8888 | 久久视讯| 国产91在 | 黄色成人在线观看 | 九色福利视频 | 久久经典国产视频 | 天天爽夜夜爽人人爽曰av | 五月天久久综合 | 狠狠色丁香| 亚洲视频资源在线 | 欧美一区,二区 | 日韩一区二区三区视频在线 | wwwwww国产| 色综合天天天天做夜夜夜夜做 | 欧美一级黄色视屏 | 天天操夜夜操天天射 | 精品久久精品久久 | 超碰人人草人人 | 成人啊 v| 亚洲欧美在线综合 | 国产色婷婷在线 | av在线最新 | 久久久久免费精品国产小说色大师 | 国产免费久久 | 亚洲一区二区高潮无套美女 | 国产精品99久久免费观看 | 91大神精品视频在线观看 | 国产精品久久久久久久免费观看 | 99久久夜色精品国产亚洲 | 久精品视频在线 | 在线看毛片网站 | 超碰午夜 | 久久天堂精品视频 | 国产精品亚洲a | 一区免费观看 | 国产精品a级 | 国产精品久久一 | 亚洲第二色| 精品国产精品一区二区夜夜嗨 | 丁香激情五月 | 国产 视频 高清 免费 | 欧美日韩免费在线视频 | 国产在线观看免费观看 | 国产精品日韩久久久久 | 免费看短| 国产一区二区免费在线观看 | 日本在线观看中文字幕无线观看 | 日韩中文字幕视频在线 | 在线视频日韩精品 | 亚洲特级片 | 久久曰视频 | ww视频在线观看 | 999久久久免费精品国产 | 日本久久久亚洲精品 | 欧美国产日韩中文 | 欧美一区二区三区在线播放 | 国产网红在线 | 久久国产精品一区二区 | 日韩大陆欧美高清视频区 | 国产在线毛片 | 欧美日韩中文在线 | 99精品视频中文字幕 | 国产日韩欧美在线观看视频 | 91最新视频在线观看 | 三级黄色在线观看 | 九色在线 | 国产亚洲va综合人人澡精品 | 成年人在线观看网站 | 国产尤物在线视频 | 狠狠躁日日躁狂躁夜夜躁av | 免费av片在线 | 日本中文字幕在线 | 欧美色精品天天在线观看视频 | 久久国产免费 | 亚洲好视频| 免费黄色网址大全 | 一区二区在线电影 | 日本精品视频在线观看 | 欧美日韩一区二区三区不卡 | 日韩欧美国产免费播放 | 91在线视频在线 | 欧美日韩在线观看不卡 | 中文字幕 影院 | 亚洲精品乱码久久久一二三 | 欧美日韩不卡在线观看 | 国产一区免费 | 精品爱爱| 亚洲精品视频第一页 | 国产剧情在线一区 | 久久久久综合精品福利啪啪 | 久久精品美女视频 | 亚洲精品一区二区在线观看 | 91爱爱网址 | 91视频3p| 伊人手机在线 | 手机看片福利 | 不卡av免费在线观看 | 一级做a视频 | 福利视频 | 欧美激情精品久久久久久 | 香蕉在线视频播放网站 | av电影免费在线播放 | 国产剧情一区在线 | 国产三级久久久 | 国产日产精品一区二区三区四区的观看方式 | 欧美日韩国产伦理 | 91少妇精拍在线播放 | 国产精品久久久久久久久久直播 | 国产在线黄色 | 一区在线观看 | 成人精品久久久 | 91丨九色丨高潮 | 国产91精品一区二区绿帽 | 丁香花在线视频观看免费 | 国产高清精品在线 | 在线观看国产 | 欧美久久久久久久久久久久久 | 999成人 | 免费视频色 | 丁香婷婷激情国产高清秒播 | 人人澡人人干 | 国产美女视频网站 | 亚洲综合欧美激情 | 操操操日日日干干干 | 狠狠的操狠狠的干 | 在线免费av播放 | 国产成人精品一区二区三区福利 | 一区二区在线影院 | 日韩专区 在线 | 四虎最新域名 | 激情丁香综合五月 | 一二三区视频在线 | 亚洲精品色 | 中文电影网 | 超碰免费在线公开 | www.色午夜.com | 国产精品久久久久久久久久直播 | 五月天欧美精品 | 综合国产在线 | 日韩欧美在线综合网 | 狠狠色丁香久久婷婷综合五月 | 91丨九色丨国产女 | 丁香五香天综合情 | 成人国产一区 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 国产xvideos免费视频播放 | 高清免费av在线 | 精品久久久免费视频 | 精品久久99 | 久久久精品成人 | 欧美专区日韩专区 | 国产美女精品久久久 | 97精产国品一二三产区在线 | 日韩电影一区二区在线 | 国产精品成人av在线 | 色偷偷男人的天堂av | 中文字幕在线观看三区 | 国产精品色视频 | 日韩中文字幕在线观看 | 伊人狠狠色丁香婷婷综合 | 最新一区二区三区 | 麻豆精品视频在线 | 日本在线免费看 | 在线观看日本高清mv视频 | 国产私拍在线 | 欧美日韩中文国产一区发布 | 涩涩网站在线观看 | 91久久久久久久 | 亚洲春色综合另类校园电影 | 成人动漫视频在线 | 在线观看亚洲国产精品 | 在线中文字幕播放 | 国产精品久久99 | 欧美一级在线 | 亚洲日本成人网 | 久久久久久久久久久黄色 | 色综合久久中文综合久久牛 | 丁香六月欧美 | 九九热免费观看 | 国产精品久久久久久久久久99 | 国产永久免费高清在线观看视频 | 久草在线 | 九九精品视频在线看 | 六月激情丁香 | 九九热久久久 | 日韩av播放在线 | 亚洲免费一级电影 | 色综合婷婷 | 欧美精品一区在线发布 | 久久精品男人的天堂 | www.狠狠插.com | 久草精品电影 | 免费观看日韩av | 97碰在线视频 | 亚洲色图激情文学 | www.色午夜.com| 国产片免费在线观看视频 | 欧美激情xxxx | 欧美韩国日本在线观看 | 91九色视频在线 | 人人爽人人做 | 久久国产亚洲视频 | 国产精品久久精品国产 | 国产永久免费高清在线观看视频 | 欧美激情在线网站 | 亚洲一区二区高潮无套美女 | 国产在线理论片 | 欧美大香线蕉线伊人久久 | 在线日韩三级 | www.色午夜.com | 日韩高清在线一区二区三区 | 玖玖精品视频 | 国产高清av在线播放 | 亚洲在线视频观看 | 国产精品麻豆一区二区三区 | 久草影视在线观看 | 狠狠躁夜夜av | 久久国内免费视频 | 国产午夜精品一区二区三区 | 久久久久免费 | 91九色视频 | 亚洲九九精品 | 在线v | 蜜臀久久99精品久久久久久网站 | www.av在线.com | 欧美黑人xxxx猛性大交 | 日韩一区二区三区高清在线观看 | 成人在线观看你懂的 | 亚洲不卡123 | 免费69视频 | 99免费在线观看视频 | 日韩欧美大片免费观看 | 久草视频在线看 | 国产精品久久久免费看 | 国产 日韩 欧美 在线 | 69精品在线| 日本黄色免费播放 | 91麻豆免费看| 一二三精品视频 | 久久久久亚洲精品中文字幕 | 国产精品美女久久久久久久久久久 | 国产一级电影在线 | 激情婷婷在线 | 黄色毛片视频免费 | 久久久影视 | 六月丁香激情网 | 人人澡人人澡人人 | 久久成人一区二区 | 超碰97免费| 97精品国产97久久久久久粉红 | 五月天中文在线 | 九九影视理伦片 | 91色综合| 天天色天天综合网 | 日p在线观看| 美女福利视频 | 久久久激情网 | 色综合天天综合 | 亚洲在线观看av | 日韩精品视频在线免费观看 | 97视频播放 | 日韩欧美在线综合网 | 久久草草热国产精品直播 | av福利在线免费观看 | 成人国产精品免费观看 | 日韩av电影一区 | 天天爱天天操天天干 | 国产精选视频 | 蜜桃视频在线观看一区 | 日韩欧美在线观看一区二区三区 | 黄色网在线免费观看 | 亚洲欧洲国产日韩精品 | 青青河边草免费观看 | 99视频精品全国免费 | 国产高清一区二区 | 黄色小说免费在线观看 | 黄色在线视频网址 | 国产在线观看你懂得 | 国产日韩欧美网站 | 在线观看日韩中文字幕 | 精品黄色在线观看 | 国产视频亚洲 | 精品久久久久久久久久久院品网 | 国产视频在线免费观看 | 在线视频亚洲 | 中文区中文字幕免费看 | 天天天色| 毛片随便看| 成人午夜性影院 | 日韩,中文字幕 | 黄色免费观看网址 | 在线看国产 | 亚洲综合欧美日韩狠狠色 | 亚洲天堂va | 欧洲视频一区 | 99久久精品免费看国产一区二区三区 | 精品日本视频 | 亚洲在线免费视频 | .国产精品成人自产拍在线观看6 | 人人爽影院 | 97在线视| 黄色亚洲在线 | 日韩一区正在播放 | 国内一区二区视频 | 狠狠操夜夜操 | 4438全国亚洲精品观看视频 | 久久国产福利 | 在线视频免费观看 | 国产精品女视频 | 国产中文在线观看 | 日韩极品视频在线观看 | 97碰碰精品嫩模在线播放 | 色偷偷888欧美精品久久久 | 日韩av视屏在线观看 | 五月婷在线观看 | 在线观看小视频 | 精品美女在线观看 | 91重口视频 | 在线观看免费高清视频大全追剧 | 亚洲成人999 | 日韩夜夜爽 | 欧美色图88 | 五月综合激情 | 久久国产精品视频免费看 | 久久99视频 | 国产专区在线视频 | 96看片 | 激情婷婷av | 黄色网在线免费观看 | 免费国产一区二区视频 | 久久综合久久综合久久综合 | 在线观看91 | 日韩精品免费在线视频 | 国产精品第十页 | 久久不卡免费视频 | 在线天堂v | 啪啪av在线| 国产免费黄视频在线观看 | 99精品国产一区二区 | 国模精品一区二区三区 | 日本深夜福利视频 | 在线免费观看国产 | 欧美精品免费在线 | 麻豆视频免费在线播放 | 日一日操一操 | 日韩精品2区 | 国产成人亚洲精品自产在线 | 91成人在线免费观看 | 一区二区欧美激情 | 91综合视频在线观看 | 91av在线电影 | 成人va视频 | 亚洲成人午夜av | 中文字幕免费高清在线观看 | 500部大龄熟乱视频使用方法 | 又湿又紧又大又爽a视频国产 | 日韩欧美在线影院 | 国产永久免费高清在线观看视频 | 香蕉97视频观看在线观看 | 波多野结衣电影一区 | 国产最新精品视频 | 欧美精品一区二区在线观看 | 久久久久亚洲精品国产 | 成年人网站免费在线观看 | 性色av一区二区三区在线观看 | 久久永久视频 | 欧美精品久久久久久久 | 深爱激情五月婷婷 | 免费一级片观看 | 亚洲国产偷 | 午夜在线免费视频 | 中文字幕影片免费在线观看 | 一区二区三区av在线 | 91一区啪爱嗯打偷拍欧美 | 麻豆视传媒官网免费观看 | 91在线小视频 | 一区二区网 | 亚洲最大免费成人网 | 精品国产乱码一区二 | 99产精品成人啪免费网站 | 久99久视频 | 91久久国产露脸精品国产闺蜜 | 色综合天 | 激情五月婷婷网 | 国产高清中文字幕 | 亚洲视频2 | 国产精品毛片一区二区三区 | 一区电影| 天堂av在线7 | 91丨九色丨蝌蚪丨对白 | 91伊人影院| 国产高清福利在线 | 亚洲欧洲成人 | 一本大道久久精品懂色aⅴ 五月婷社区 | 亚洲成人黄色在线观看 | 一区 在线观看 | 欧美成人精品欧美一级乱黄 | 激情综合色播五月 | 久草久草久草久草 | 国产精品电影一区 | 免费人人干 | www激情网| 99视频免费看| 婷婷在线精品视频 | 日韩网| 97精品国自产拍在线观看 | 国产在线a | 中文字幕亚洲高清 | 自拍超碰在线 | 国产精品免费视频一区二区 | 国产精品资源网 | 97精品超碰一区二区三区 | 国产亚洲精品久久久久久久久久 | 中文字幕在线看视频 | 亚洲成人精品在线 | 超碰97人人在线 | 免费观看的黄色 | 久久99久久99精品免观看软件 | 久草在线这里只有精品 | 天天干人人插 | 亚洲女在线 | 久草在线中文888 | 免费观看丰满少妇做爰 | 在线观看中文字幕2021 | 久久国产免费视频 | 91入口在线观看 | 免费观看黄 | 成全免费观看视频 | 午夜av免费在线观看 | 亚洲电影第一页av | 亚洲欧美一区二区三区孕妇写真 | 91亚洲国产成人久久精品网站 | 久久精品国产免费 | 96看片| 国产看片免费 | 在线看成人 | 国产免费激情久久 | 中文区中文字幕免费看 | 国产一级淫片免费看 | 毛片久久久 | 国产亚洲精品久久19p | 免费在线观看国产黄 | 成 人 黄 色 片 在线播放 | 成人在线视频免费观看 | 欧美日韩高清国产 | 中文字幕在线看 | 国产涩涩在线观看 | 日韩精品一区二区在线观看 | 日韩激情视频在线观看 | 成人三级网站在线观看 | 十八岁以下禁止观看的1000个网站 | 一区二区三区四区免费视频 | 精品99在线视频 | 久久久久久久久久久久久9999 | 在线播放91 | 精品国产aⅴ麻豆 | 精品女同一区二区三区在线观看 | 伊人电影在线观看 | 久久成人一区 | 91亚洲精品乱码久久久久久蜜桃 | 欧美激情视频在线免费观看 | 成人精品视频久久久久 | 可以免费看av | 国产精品久久久久亚洲影视 | 日韩三级在线 | 亚洲 综合 专区 | 一区二区在线电影 | 免费看的黄色 | 91久久精品日日躁夜夜躁国产 | 网站免费黄 | 天堂av网址 | 99r在线播放 | 一级黄色免费 | 天天做天天爱天天爽综合网 | 国产视频2区 | 91色国产在线 | 亚洲v欧美v国产v在线观看 | 免费观看一级 | 欧美视频18 | 91成年人网站 | 成人午夜毛片 | 国产精品美女久久久久aⅴ 干干夜夜 | 黄色三级视频片 | 91精品啪啪 | 午夜.dj高清免费观看视频 | 一区二区不卡在线观看 | 超碰97国产| 亚洲综合激情小说 | 国产18精品乱码免费看 | 久久精品这里都是精品 | 正在播放国产一区 | 91亚洲精品久久久久图片蜜桃 | 99热超碰在线 | 欧美精品久久久久久久免费 | 中文一区二区三区在线观看 | 九九九九九九精品任你躁 | 九九免费在线观看 | 18+视频网站链接 | 欧美 国产 视频 | 91热视频在线观看 | 婷婷激情小说网 | av在线播放不卡 | 久久久久国产精品www | 2019天天干夜夜操 | 一区二区理论片 | 最近中文字幕在线播放 | 一区二区三区国产欧美 | 日日爱999| 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产又粗又硬又爽视频 | 丁香花在线观看免费完整版视频 | 国产 视频 高清 免费 | 97av在线 | 97涩涩视频| 国产一区二区中文字幕 | 久久成人综合 | 欧美视频99| 97人人人人 | 日韩午夜三级 | 中文字幕色婷婷在线视频 | 国产精品一区二区果冻传媒 | 三三级黄色片之日韩 | 爱射综合| 97人人澡人人爽人人模亚洲 | 国产99久久久国产精品免费二区 | 久久成人人人人精品欧 | 国产中文伊人 | 国产在线无 | 国内丰满少妇猛烈精品播 | 日韩中文字幕免费在线观看 | 天堂激情网 | 99久久精品久久亚洲精品 | 久久99精品久久只有精品 | 丁香久久综合 | 日本中文字幕在线免费观看 | 91麻豆精品国产91久久久久久久久 | 亚洲欧美国产精品va在线观看 | 久久电影网站中文字幕 | 成人观看视频 | 国产一区在线观看视频 | 97在线观视频免费观看 | 亚洲乱码在线观看 | 欧美影片| 久久国产免 | 婷婷色吧 | 亚洲综合在线五月 | 国产午夜精品在线 | 一级黄色片在线 | 91视频91色 | 91精品国产99久久久久久红楼 | www五月婷婷| 狠狠干狠狠色 | 国产精品s色 | 亚洲欧美国内爽妇网 | 久久国产精品免费一区二区三区 | 久久久三级视频 | 人人爽人人爽人人片 | 91在线资源| 天天做综合网 | 国产精品大片免费观看 | 欧美成人理伦片 | 日韩久久精品一区二区三区下载 | 免费午夜网站 | 天天操天天谢 | 99综合视频 | 久草在线精品观看 | 91精品国产乱码在线观看 | 久久a v电影 | 日本三级久久久 | 66av99精品福利视频在线 | 国产精品网在线观看 | 国产精品国产三级国产 |