国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

手把手教你開(kāi)發(fā)微信公眾號(hào)后臺(tái)

共 20873字,需瀏覽 42分鐘

 ·

2020-08-28 21:04




  • 1.緣起

  • 2.實(shí)現(xiàn)思路

  • 3.公眾號(hào)后臺(tái)配置

  • 4.開(kāi)發(fā)

    • 4.1 服務(wù)器有效性校驗(yàn)

    • 4.2 消息接收接口

  • 5.消息分類

  • 6.返回消息類型定義

  • 7.返回消息生成

  • 8.返回消息分發(fā)


Hello 各位小伙伴,松哥今天要和大家聊一個(gè)有意思的話題,就是使用 Spring Boot 開(kāi)發(fā)微信公眾號(hào)后臺(tái)。

很多小伙伴可能注意到松哥的個(gè)人網(wǎng)站(http://www.javaboy.org)前一陣子上線了一個(gè)公眾號(hào)內(nèi)回復(fù)口令解鎖網(wǎng)站文章的功能,還有之前就有的公眾號(hào)內(nèi)回復(fù)口令獲取超 2TB 免費(fèi)視頻教程的功能(公號(hào)后臺(tái)回復(fù) 2TB),這兩個(gè)都是松哥基于 Spring Boot 來(lái)做的,最近松哥打算通過(guò)一個(gè)系列的文章,來(lái)向小伙伴們介紹下如何通過(guò) Spring Boot 來(lái)開(kāi)發(fā)公眾號(hào)后臺(tái)。

1.緣起

今年 5 月份的時(shí)候,我想把我自己之前收集到的一些視頻教程分享給公眾號(hào)上的小伙伴,可是這些視頻教程大太了,無(wú)法一次分享,單次分享分享鏈接立馬就失效了,為了把這些視頻分享給大家,我把視頻拆分成了很多份,然后設(shè)置了不同的口令,小伙伴們?cè)诠娞?hào)后臺(tái)通過(guò)回復(fù)口令就可以獲取到這些視頻,口令前前后后有 100 多個(gè),我一個(gè)一個(gè)手動(dòng)的在微信后臺(tái)進(jìn)行配置。這么搞工作量很大,前前后后大概花了三個(gè)晚上才把這些東西搞定。

于是我就在想,該寫點(diǎn)代碼了。

上個(gè)月買了服務(wù)器,也備案了,該有的都有了,于是就打算把這些資源用代碼實(shí)現(xiàn)下,因?yàn)榇髮W(xué)時(shí)候搞過(guò)公眾號(hào)開(kāi)發(fā),倒也沒(méi)什么難度,于是說(shuō)干就干。

2.實(shí)現(xiàn)思路

其實(shí)松哥這個(gè)回復(fù)口令獲取視頻鏈接的實(shí)現(xiàn)原理很簡(jiǎn)單,說(shuō)白了,就是一個(gè)數(shù)據(jù)查詢操作而已,回復(fù)的口令是查詢關(guān)鍵字,回復(fù)的內(nèi)容則是查詢結(jié)果。這個(gè)原理很簡(jiǎn)單。

另一方面大家需要明白微信公眾號(hào)后臺(tái)開(kāi)發(fā)消息發(fā)送的一個(gè)流程,大家看下面這張圖:

這是大家在公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字的情況。那么這個(gè)消息是怎么樣一個(gè)傳遞流程呢?我們來(lái)看看下面這張圖:

這張圖,我給大家稍微解釋下:

  1. 首先 javaboy4096 這個(gè)字符從公眾號(hào)上發(fā)送到了微信服務(wù)器
  2. 接下來(lái)微信服務(wù)器會(huì)把 javaboy4096 轉(zhuǎn)發(fā)到我自己的服務(wù)器上
  3. 我收到 javaboy4096 這個(gè)字符之后,就去數(shù)據(jù)庫(kù)中查詢,將查詢的結(jié)果,按照騰訊要求的 XML 格式進(jìn)行返回
  4. 微信服務(wù)器把從我的服務(wù)器收到的信息,再發(fā)回到微信上,于是小伙伴們就看到了返回結(jié)果了

大致的流程就是這個(gè)樣子。

接下來(lái)我們就來(lái)看一下實(shí)現(xiàn)細(xì)節(jié)。

3.公眾號(hào)后臺(tái)配置

開(kāi)發(fā)的第一步,是微信服務(wù)器要驗(yàn)證我們自己的服務(wù)器是否有效。

首先我們登錄微信公眾平臺(tái)官網(wǎng)后,在公眾平臺(tái)官網(wǎng)的 「開(kāi)發(fā)-基本設(shè)置」 頁(yè)面,勾選協(xié)議成為開(kāi)發(fā)者,然后點(diǎn)擊“修改配置”按鈕,填寫:

  • 服務(wù)器地址(URL)
  • Token
  • EncodingAESKey

這里的 URL 配置好之后,我們需要針對(duì)這個(gè) URL 開(kāi)發(fā)兩個(gè)接口,一個(gè)是 GET 請(qǐng)求的接口,這個(gè)接口用來(lái)做服務(wù)器有效性驗(yàn)證,另一個(gè)則是 POST 請(qǐng)求的接口,這個(gè)用來(lái)接收微信服務(wù)器發(fā)送來(lái)的消息。也就是說(shuō),微信服務(wù)器的消息都是通過(guò) POST 請(qǐng)求發(fā)給我的。

Token 可由開(kāi)發(fā)者可以任意填寫,用作生成簽名(該 Token 會(huì)和接口 URL 中包含的 Token 進(jìn)行比對(duì),從而驗(yàn)證安全性)。

EncodingAESKey 由開(kāi)發(fā)者手動(dòng)填寫或隨機(jī)生成,將用作消息體加解密密鑰。

同時(shí),開(kāi)發(fā)者可選擇消息加解密方式:明文模式、兼容模式和安全模式。明文模式就是我們自己的服務(wù)器收到微信服務(wù)器發(fā)來(lái)的消息是明文字符串,直接就可以讀取并且解析,安全模式則是我們收到微信服務(wù)器發(fā)來(lái)的消息是加密的消息,需要我們手動(dòng)解析后才能使用。

4.開(kāi)發(fā)

公眾號(hào)后臺(tái)配置完成后,接下來(lái)我們就可以寫代碼了。

4.1 服務(wù)器有效性校驗(yàn)

我們首先來(lái)創(chuàng)建一個(gè)普通的 Spring Boot 項(xiàng)目,創(chuàng)建時(shí)引入 spring-boot-starter-web 依賴,項(xiàng)目創(chuàng)建成功后,我們創(chuàng)建一個(gè) Controller ,添加如下接口:

@GetMapping("/verify_wx_token")
public void login(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
    request.setCharacterEncoding("UTF-8");
    String signature = request.getParameter("signature");
    String timestamp = request.getParameter("timestamp");
    String nonce = request.getParameter("nonce");
    String echostr = request.getParameter("echostr");
    PrintWriter out = null;
    try {
        out = response.getWriter();
        if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
            out.write(echostr);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        out.close();
    }
}

關(guān)于這段代碼,我做如下解釋:

  1. 首先通過(guò) request.getParameter 方法獲取到微信服務(wù)器發(fā)來(lái)的 signature、timestamp、nonce 以及 echostr 四個(gè)參數(shù),這四個(gè)參數(shù)中:signature 表示微信加密簽名,signature 結(jié)合了開(kāi)發(fā)者填寫的 token 參數(shù)和請(qǐng)求中的timestamp參數(shù)、nonce參數(shù);timestamp 表示時(shí)間戳;nonce 表示隨機(jī)數(shù);echostr 則表示一個(gè)隨機(jī)字符串。
  2. 開(kāi)發(fā)者通過(guò)檢驗(yàn) signature 對(duì)請(qǐng)求進(jìn)行校驗(yàn),如果確認(rèn)此次 GET 請(qǐng)求來(lái)自微信服務(wù)器,則原樣返回 echostr 參數(shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者成功,否則接入失敗。
  3. 具體的校驗(yàn)就是松哥這里的 CheckUtil.checkSignature 方法,在這個(gè)方法中,首先將token、timestamp、nonce 三個(gè)參數(shù)進(jìn)行字典序排序,然后將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行 sha1 加密,最后開(kāi)發(fā)者獲得加密后的字符串可與 signature 對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信。

校驗(yàn)代碼如下:

public class CheckUtil {
    private static final String token = "123456";
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] str = new String[]{token, timestamp, nonce};
        //排序
        Arrays.sort(str);
        //拼接字符串
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < str.length; i++) {
            buffer.append(str[i]);
        }
        //進(jìn)行sha1加密
        String temp = SHA1.encode(buffer.toString());
        //與微信提供的signature進(jìn)行匹對(duì)
        return signature.equals(temp);
    }
}
public class SHA1 {
    private static final char[] HEX_DIGITS = {'0''1''2''3''4''5',
            '6''7''8''9''a''b''c''d''e''f'};
    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }
    public static String encode(String str) {
        if (str == null) {
            return null;
        }
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

OK,完成之后,我們的校驗(yàn)接口就算是開(kāi)發(fā)完成了。接下來(lái)就可以開(kāi)發(fā)消息接收接口了。

4.2 消息接收接口

接下來(lái)我們來(lái)開(kāi)發(fā)消息接收接口,消息接收接口和上面的服務(wù)器校驗(yàn)接口地址是一樣的,都是我們一開(kāi)始在公眾號(hào)后臺(tái)配置的地址。只不過(guò)消息接收接口是一個(gè) POST 請(qǐng)求。

我在公眾號(hào)后臺(tái)配置的時(shí)候,消息加解密方式選擇了明文模式,這樣我在后臺(tái)收到的消息直接就可以處理了。微信服務(wù)器給我發(fā)來(lái)的普通文本消息格式如下:

<xml>
  <ToUserName>ToUserName>
  <FromUserName>FromUserName>
  <CreateTime>1348831860CreateTime>
  <MsgType>MsgType>
  <Content>Content>
  <MsgId>1234567890123456MsgId>
xml>

這些參數(shù)含義如下:

看到這里,大家心里大概就有數(shù)了,當(dāng)我們收到微信服務(wù)器發(fā)來(lái)的消息之后,我們就進(jìn)行 XML 解析,提取出來(lái)我們需要的信息,去做相關(guān)的查詢操作,再將查到的結(jié)果返回給微信服務(wù)器。

這里我們先來(lái)個(gè)簡(jiǎn)單的,我們將收到的消息解析并打印出來(lái):

@PostMapping("/verify_wx_token")
public void handler(HttpServletRequest request, HttpServletResponse response) throws Exception {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    PrintWriter out = response.getWriter();
    Map  parseXml = MessageUtil.parseXml(request);
    String msgType = parseXml.get( "MsgType");
    String content = parseXml.get( "Content");
    String fromusername = parseXml.get( "FromUserName");
    String tousername = parseXml.get( "ToUserName");
    System.out.println(msgType);
    System.out.println(content);
    System.out.println(fromusername);
    System.out.println(tousername);
}
public static Map   parseXml (HttpServletRequest request)  throws Exception  {
    Map  map =  new HashMap ();
    InputStream inputStream = request.getInputStream();
    SAXReader reader =  new SAXReader();
    Document document = reader.read(inputStream);
    Element root = document.getRootElement();
    List  elementList = root.elements();
     for (Element e : elementList)
        map.put(e.getName(), e.getText());
    inputStream.close();
    inputStream =  null;
     return map;
}

大家看到其實(shí)都是一些常規(guī)代碼,沒(méi)有什么難度。

做完這些之后,我們將項(xiàng)目打成 jar 包在服務(wù)器上部署啟動(dòng)。啟動(dòng)成功之后,確認(rèn)微信的后臺(tái)配置也沒(méi)問(wèn)題,我們就可以在公眾號(hào)上發(fā)一條消息了,這樣我們自己的服務(wù)端就會(huì)打印出來(lái)剛剛消息的信息。

5.消息分類

在討論如何給微信服務(wù)器回復(fù)消息之前,我們需要先來(lái)了解下微信服務(wù)器發(fā)來(lái)的消息主要有哪些類型以及我們回復(fù)給微信的消息都有哪些類型。

在上文中大家了解到,微信發(fā)送來(lái)的 xml 消息中有一個(gè) MsgType 字段,這個(gè)字段就是用來(lái)標(biāo)記消息的類型。這個(gè)類型可以標(biāo)記出這條消息是普通消息還是事件消息還是圖文消息等。

普通消息主要是指:

  • 文本消息
  • 圖片消息
  • 語(yǔ)音消息
  • 視頻消息
  • 小視頻消息
  • 地址位置消息
  • 鏈接消息

不同的消息類型,對(duì)應(yīng)不同的 MsgType,這里我還是以普通消息為例,如下:

消息類型 MsgType
文本消息 text
圖片消息 image
語(yǔ)音消息 voice
視頻消息 video
小視頻消息 shortvideo
地址位置消息 location
鏈接消息 link

大家千萬(wàn)不要以為不同類型消息的格式是一樣的,其實(shí)是不一樣的,也就是說(shuō),MsgType 為 text 的消息和 MsgType 為 image 的消息,微信服務(wù)器發(fā)給我們的消息內(nèi)容是不一樣的,這樣帶來(lái)一個(gè)問(wèn)題就是我無(wú)法使用一個(gè) Bean 去接收不同類型的數(shù)據(jù),因此這里我們一般使用 Map 接收即可。

這是消息的接收,除了消息的接收之外,還有一個(gè)消息的回復(fù),我們回復(fù)的消息也有很多類型,可以回復(fù)普通消息,也可以回復(fù)圖片消息,回復(fù)語(yǔ)音消息等,不同的回復(fù)消息我們可以進(jìn)行相應(yīng)的封裝。因?yàn)椴煌姆祷叵?shí)例也是有一些共同的屬性的,例如消息是誰(shuí)發(fā)來(lái)的,發(fā)給誰(shuí),消息類型,消息 id 等,所以我們可以將這些共同的屬性定義成一個(gè)父類,然后不同的消息再去繼承這個(gè)父類。

6.返回消息類型定義

首先我們來(lái)定義一個(gè)公共的消息類型:

public class BaseMessage {
    private String ToUserName;
    private String FromUserName;
    private long CreateTime;
    private String MsgType;
    private long MsgId;
    //省略 getter/setter
}

在這里:

  • ToUserName 表示開(kāi)發(fā)者的微信號(hào)
  • FromUserName 表示發(fā)送方賬號(hào)(用戶的 OpenID)
  • CreateTime 消息的創(chuàng)建時(shí)間
  • MsgType 表示消息的類型
  • MsgId 表示消息 id

這是我們的基本消息類型,就是說(shuō),我們返回給用戶的消息,無(wú)論是什么類型的消息,都有這幾個(gè)基本屬性。然后在此基礎(chǔ)上,我們?cè)偃U(kuò)展出文本消息、圖片消息 等。

我們來(lái)看下文本消息的定義:

public class TextMessage extends BaseMessage {
    private String Content;
    //省略 getter/setter
}

文本消息在前面消息的基礎(chǔ)上多了一個(gè) Content 屬性,因此文本消息繼承自 BaseMessage ,再額外添加一個(gè) Content 屬性即可。

其他的消息類型也是類似的定義,我就不一一列舉了,至于其他消息的格式,大家可以參考微信開(kāi)放文檔(http://1t.click/aPXK)。

7.返回消息生成

消息類型的 Bean 定義完成之后,接下來(lái)就是將實(shí)體類生成 XML。

首先我們定義一個(gè)消息工具類,將常見(jiàn)的消息類型枚舉出來(lái):

/**
 * 返回消息類型:文本
 */

public static final String RESP_MESSAGE_TYPE_TEXT = "text";
/**
 * 返回消息類型:音樂(lè)
 */

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";
/**
 * 返回消息類型:語(yǔ)音
 */

public static final String RESP_MESSAGE_TYPE_Voice = "voice";
/**
 * 返回消息類型:視頻
 */

public static final String RESP_MESSAGE_TYPE_Video = "video";
/**
 * 請(qǐng)求消息類型:文本
 */

public static final String REQ_MESSAGE_TYPE_TEXT = "text";
/**
 * 請(qǐng)求消息類型:圖片
 */

public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
/**
 * 請(qǐng)求消息類型:鏈接
 */

public static final String REQ_MESSAGE_TYPE_LINK = "link";
/**
 * 請(qǐng)求消息類型:地理位置
 */

public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
/**
 * 請(qǐng)求消息類型:音頻
 */

public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
/**
 * 請(qǐng)求消息類型:視頻
 */

public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
/**
 * 請(qǐng)求消息類型:推送
 */

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(自定義菜單點(diǎn)擊事件)
 */

public static final String EVENT_TYPE_CLICK = "CLICK";
/**
 * 事件類型:VIEW(自定義菜單 URl 視圖)
 */

public static final String EVENT_TYPE_VIEW = "VIEW";
/**
 * 事件類型:LOCATION(上報(bào)地理位置事件)
 */

public static final String EVENT_TYPE_LOCATION = "LOCATION";
/**
 * 事件類型:LOCATION(上報(bào)地理位置事件)
 */

public static final String EVENT_TYPE_SCAN = "SCAN";

大家注意這里消息類型的定義,以 RESP 開(kāi)頭的表示返回的消息類型,以 REQ 表示微信服務(wù)器發(fā)來(lái)的消息類型。然后在這個(gè)工具類中再定義兩個(gè)方法,用來(lái)將返回的對(duì)象轉(zhuǎn)換成 XML:

public static String textMessageToXml(TextMessage textMessage) {
    xstream.alias("xml", textMessage.getClass());
    return xstream.toXML(textMessage);
}
private static XStream xstream = new XStream(new XppDriver() {
    public HierarchicalStreamWriter createWriter(Writer out) {
        return new PrettyPrintWriter(out) {
            boolean cdata = true;
            @SuppressWarnings("rawtypes")
            public void startNode(String name, Class clazz) {
                super.startNode(name, clazz);
            }
            protected void writeText(QuickWriter writer, String text) {
                if (cdata) {
                    writer.write(");
????????????????????writer.write(text);
????????????????????writer.write("]]>");
                } else {
                    writer.write(text);
                }
            }
        };
    }
});

textMessageToXML 方法用來(lái)將 TextMessage 對(duì)象轉(zhuǎn)成 XML 返回給微信服務(wù)器,類似的方法我們還需要定義 imageMessageToXml、voiceMessageToXml 等,不過(guò)定義的方式都基本類似,我就不一一列出來(lái)了。

8.返回消息分發(fā)

由于用戶發(fā)來(lái)的消息可能存在多種情況,我們需要分類進(jìn)行處理,這個(gè)就涉及到返回消息的分發(fā)問(wèn)題。因此我在這里再定義一個(gè)返回消息分發(fā)的工具類,如下:

public class MessageDispatcher {
    public static String processMessage(Map  map)  {
        String openid = map.get("FromUserName"); //用戶 openid
        String mpid = map.get("ToUserName");   //公眾號(hào)原始 ID
        if (map.get("MsgType").equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { 
            //普通文本消息
            TextMessage txtmsg = new TextMessage();
            txtmsg.setToUserName(openid);
            txtmsg.setFromUserName(mpid);
            txtmsg.setCreateTime(new Date().getTime());
            txtmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
            txtmsg.setContent("這是返回消息");
            return MessageUtil.textMessageToXml(txtmsg);
        }
        return null;
    }
    public String processEvent(Map  map)  {
        //在這里處理事件
    }
}

這里我們還可以多加幾個(gè) elseif 去判斷不同的消息類型,我這里因?yàn)橹挥衅胀ㄎ谋鞠?,所以一個(gè) if 就夠用了。

在這里返回值我寫死了,實(shí)際上這里需要根據(jù)微信服務(wù)端傳來(lái)的 Content 去數(shù)據(jù)中查詢,將查詢結(jié)果返回,數(shù)據(jù)庫(kù)查詢這一套相信大家都能搞定,我這里就不重復(fù)介紹了。

最后在消息接收 Controller 中調(diào)用該方法,如下:

@PostMapping(value = "/verify_wx_token",produces = "application/xml;charset=utf-8")
public String handler(HttpServletRequest request, HttpServletResponse response) throws Exception {
    request.setCharacterEncoding("UTF-8");
    Map  map = MessageUtil.parseXml(request);
    String msgType = map.get( "MsgType");
     if (MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(msgType)) {
         return messageDispatcher.processEvent(map);
    } else{
         return messageDispatcher.processMessage(map);
    }
}

在 Controller 中,我們首先判斷消息是否是事件,如果是事件,進(jìn)入到事件處理通道,如果不是事件,則進(jìn)入到消息處理通道。

「注意,這里需要配置一下返回消息的編碼,否則可能會(huì)出現(xiàn)中文亂碼。」

如此之后,我們的服務(wù)器就可以給公眾號(hào)返回消息了。

好了,本文我們就先說(shuō)到這里,感興趣的小伙伴不妨試試。

        
— 【 THE END 】—
本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲??!


3T技術(shù)資源大放送!包括但不限于:Java、C/C++,Linux,Python,大數(shù)據(jù),人工智能等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。。?/span>




瀏覽 77
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美色图色就是色| 国产福利美女网站| 日韩中文字幕一区二区| 亚洲一级a| 日本免费在线视频| 日本AⅤ在线观看| 国产精品久久久精品| 91丨人妻丨国产丨丝袜| 青操AV| 蜜桃无码一区| 91丨九色丨国产在线| 成人亚洲电影| 蜜臀久久99精品久久久电影| 久久中文字幕电影| 国产人成视频| 欧美一级久久| 黄色片A片| 青青草五月天色婷婷丁香| 伊人久久大香色综合久久| 嫩BBB槡BBBB槡BBBB二一| 国产美女一级真毛片酒店| 日本免费中文字幕| 亚洲欧洲无码在线| 91视频福利| 丁香社区五月天| 久久久久综合| AA黄色电影| 亚洲精品福利视频导航| 东方AV在线免费观看| 欧美成人性爱网| 欧美成人aaa| 九九久久精品视频| 亚洲无码成人在线观看| 一区二区三区欧美| 波多野结衣无码AV专区| 天天视频国产| 婷婷五月综合网| 亚洲区综合| 亚洲欧美久久久| 性满足BBWBBWBBW| 999日本不卡影院| 日韩精品无码人妻| 刘玥无码| 日韩二区| www.91在线视频| 成人黄色视频网站在线观看 | 国产在线秘麻豆精品观看| 色综合天天| 中文字幕AV免费观看| 国产乱仑视频| 一级片在线免费观看| 乱伦99| 边添小泬边狠狠躁视频| 免费做爱网站| 亚洲无码天堂| 丁香五月天激情视频| 欧美综合精品| 久久丁香五月婷婷五月天激情视频| 爱爱视频天天操| 伊人视频在线观看| 2025av中文字幕| 日韩一区二区三区免费视频| 国产毛片基地| 日本高清视频www| 91亚洲精品视频在线| 亚洲三级在线播放| 午夜成人大片| 成人片免费| 久久av电影| 黄色片大香蕉| 日韩日日夜夜| 欧美日韩a| 操逼三级片| 青青国产在线| 国产视频一区二区三区四区| 嫩BBB搡BBB搡BBB四川| 久碰| 国产手机AV在线| 午夜福利视频网站| 国产精品无码永久免费不卡| 做aAAAAA免费视频| 日韩夜夜操| 欧美自拍偷拍| 黄色视频网站观看| 亚洲有码在线| 国产精品久久久久久亚洲毛片| 色色色欧美| 在线免费看黄色| 亚洲精品影视| 狠狠操网站| 国产一区二区波多野结衣| 国产人妻精品| 成人无码自拍| 国产一卡二卡在线观看| 九色九一| 国产色网站| 6969电视影片最新更新| 欧美性高潮| 91麻豆大奶巨乳一区白虎| 欧美黄色免费在线观看| 国产精品无码一区二区在线欢| henhengan| 草逼网址| 97精品超碰一区二区三区| 激情小视频| 安微妇搡BBBB搡BBBB日| 99在线播放| 香蕉中文在线| 四虎AV| 国产精品宾馆| 91拍真实国产伦偷精品| 亚洲欧洲高清无码| 中文字幕无码在线播放| 亚洲无码中文视频| 国产免费一区二区三区最新不卡| 日韩无码性爱视频| 免费操逼网址| 人妻无码久久| 蜜芽成人在线视频| 免费亲子乱婬一级A片| 无码秘蜜桃一区二区三区| 国产无码一区| 起碰在线视频| 在线永久看片免费的视频| 特写毛茸茸BBwBBwBBw | 国产综合婷婷| 日韩中文毛片| a片在线观看免费| 一级A爱爱| 久久久在线视频| 久久午夜福利视频| 超碰免费99| av一级片| 色欲影视插综合一区二区三区| 欧美成人一级a片| 国内自拍偷拍视频| 婷婷五月在线| www.婷婷色| 中文字幕精品一区| 免费黄片视频| www.91AV| 人人操人人透| 91丨熟女丨首页| 91av免费看| 日韩无码一级片| 九色91PORNY国产| 天天日天天干天天射| 国产视频123区| 4438成人网| 五月丁香综合在线| 中文一区| 在线观看国产| 欧美人妻中文字幕| 操干视频| 日韩久久免费视频| 亚洲人妻免费视频| 日一日干一干| 国产熟妇搡BBBB搡BBBB搡| 国产精品久久久久久久久久久久久久久 | 在线操| av東熱激情东京热| 97福利视频| 学生妹一级片内射视频| 亚洲在线视频| 先锋av资源网| 午夜亚洲无码| 天天日很很日| 国产日产亚洲精品| 日韩欧美中文字幕视频| 亚洲欧美日韩一区二区| 一区二区三区日本| 亚洲无码午夜| 一区在线观看视频| 动漫一区二区三区| 三级无码| 华女与黑人91A∨| 日本中文在线观看| 四虎影库男人天堂| 最新国产视频| 99热99re6国产线播放| 成人激情视频A极| 黄色资源在线观看| 无套免费视频欧美| 久久久久久97电影院电影院无码| 99精品无码| wwwAV在线观看| 日韩精品网址| 国产91在线中日| 天天日人人| 五月婷婷黄色| 中文字幕免费在线观看| 国内精品久久久| 一级黄色录像视频| 青青操国产乱伦| 国产黄色在线免费观看| 欧美浮力影院| 日本色区| 91牛视频| 亚洲热视频| 成人网站在线看。| 特级西西444www高清大胆免费看 | 久久一做爱| 色网站在线观看| 亚洲成人高清在线| 中文字幕午夜福利| 双飞人妻13p| 亚欧免费视频| 中文字幕成人A片| www.黄色在线| 欧美精品秘一区二区三区蜜臀| www.俺也去| 嫩BBB| 蜜芽成人精品久久久视频| 九色视频在线观看| 日韩h视频| 五月天婷婷网址| 国产福利免费视频| 中文无码Av| 白浆四溢av| 三上悠亚无码破解69XXX| 中文字幕性爱电影| 97桃色| 久久久www| 青青草原AV| 色悠久久久| 色草视频| 狠狠精品| 久久午夜福利视频| 亚洲成人无码在线观看| 97人妻精品一区二区三区| 97人人爽人人爽人人人| 99久热在线精品| 五月天久久久久久久| 国产精品久久久久久久久| 新超碰在线观看| 97超碰在线免费观看| 国产高清自拍视频| 黄片免费在线播放| 免费观看A级毛片| 国产美女操逼网站| 中文无码久久| 51XX嘿嘿午夜| 一级操逼视频免费观看| 日韩AV一区二区三区| 一区二区三区色| 日韩免费中文字幕A片| 大香蕉在线网站| 俺也来www俺也色com| 欧美特黄AAA| 91在线看| 九九国产视频| 大香蕉在线电影| 91工厂露脸熟女| 亚洲欧美日韩一区二区| 精品一级| 国产成人无码AⅤ片免费播放| 亚洲一卡二卡三卡四卡免| 制服.丝袜.亚洲.中文.豆花| 人妻av一区二区三区| 亚洲国产成人精品午夜| 国产一视频| 丁香六月婷婷久久综合| 91精品福利| 国产精品成人免费精品自在线观看| 人妻FrXXeeXXee护士| 99er视频| 欧美精品久久久久久| 夜色视频网| 日韩视频91| 激情无码精品| 国产亚洲三级| 老熟妇一区二区三区啪啪| 日韩AV成人电影| 中文无码AV在线| 国内自拍网站| 亚洲日韩字幕| 3D动漫精品啪啪一区二区竹笋| 亚洲无码一级视频| 精品三级网站| 爱五月| 亚洲人人色| 高清无码网站在线观看| 中文字幕成人免费视频| 国产中文字幕在线免费观看| 国产乱子伦一区二区三区免看| 高清无码操逼视频| 台湾成人在线视频| 国产AV日韩AⅤ亚洲AV中文| 精品久久91| 亚洲中文字幕无码在线观看| 五月天综合久久| 欧美日韩三级在线| 麻豆精品传媒国产剧的特点| 五香丁香天堂网| 中文字幕精品一级A片| 无码视频久久| 大香蕉尹人在看| 天天草网| 精品三级网站| 午夜啪啪视频| 亚洲最大视频| 一级爱爱免费视频| 青春草视频在线观看| 欧美黄片免费观看| 久久国产AV| 撸一撸成人在线做爱视频。| 国产精品3| 国产免费成人在线观看| 久久久久久久久久久久成人| 欧美黄色激情视频网站| 超碰人人干人人操| 在线亚洲一区| 另类老太婆性BBWBBw| 亚洲制服在线观看| 影音先锋三级| 午夜黄色电影| 日韩A片一级无码免费蜜桃| 91无码精品久久久一区第1集| 亚洲精品视频在线观看网站| WWWA级片| 91在线无码精品在线看| 国产免费一级特黄A片| 国产丝袜av| 熟女嗷嗷叫高潮合集91| www.97色色| 久久肏| 欧美色999| 亚洲图片在线观看| 久久69| 久久99久久99久久| 国产成人精品777777| 18XXX亚洲HD护士JD| www.jiujiujiu| 黄色片一级| 色综合网址| 狠狠色色| 最近中文字幕高清2019中文字幕 | 亚洲一级在线观看| 亚洲性爱AV网站| 久久精品国产亚洲AV成人婷婷 | 日韩啊啊啊| 成人黄色毛片| 五月丁香综合在线| 91做爱视频| 日韩3级片| 嫩BBB| 四虎成人无码| 特级毛片| 无码AA| AV资源站| www.日本黄色| 三级网站大全| 亚洲欧美激情小说另类| 亚洲欧美日韩一区| 大秀91视频| 欧美一级欧美三级在线观看| 亚州精品无码| 人妻人人操| 91久久午夜无码鲁丝片久久人妻 | 一本加勒比HEZYO东京热无码| 很很撸| 国产无遮挡又黄又爽在线观看| 嫩BX区二区三区的区别| 欧美撒色逼撒| 欧美午夜伦理| 麻豆性爱视频| 亚洲视频在线免费观看| 五月天婷婷激情视频| 天天肏| 七十路の高齢熟女千代子下载 | 亚洲福利女神成人福利| 中文不卡在线| 日韩本色一区| 青青草原网站在线观看| 极品美女扒开粉嫩小泬高潮一| 婷婷丁香五月激情一区综合网| 国产精品99视频| 人人摸人人| 国产主播中文字幕| 五月天丁香社区| 三级毛片网站| 91做爱| 波多野结衣在线无码视频| 午夜在线观看视频18| 亚洲无码在线精品| 先锋影音资源AV| 欧美日韩免费看| 亚洲手机在线播放| 亚洲天堂一区| 欧美一级a视频免费放| 亚洲精品一区二区三区| 狠狠色噜噜狠狠狠888米奇视频| 波多野结衣网址| 东京热黄色电影| 亚洲天堂视频在线观看| 久久无码人妻精品一区二区三区| 一级片a片| 日韩av三级在线观看| 亚洲黄色在线看| 91久久久无码国产一区二区三区| 俺也去官网| 久久国产精品波多野结衣AV| 农村三级片| 久久久久久久久久国产精品免费观看-百度| 大香蕉在线75| 特级毛片AAAAAA蜜桃| 欧美日韩视频在线播放| 欧美一级黄色电影| 无码精品一区二区免费| 国产91福利| 91无码一区二区| 高清无码免费在线| 亚洲中文字幕在线视频播放| 大香蕉75| 狠狠色婷婷777| 欧美色啪| 成人视频在线观看免费| 日韩精品中文字幕在线观看| 麻豆成人精品| 亚洲综合色婷婷| 免费无码蜜臀在线观看| 黑吊操| 伊人综合网站| 国产一区二区三区四区五区六区七区 | 丝瓜污视频| 久久精品熟妇丰满人妻99| 69av网站| 色老板视频在线观看| gogogo视频在线观看黑人| 亚洲中文字幕在线看| 亚洲AV无码精品岛国| 91AV在线看| a级片在线观看| 操杨幂| 国产7777| 91丝袜足交| 国产精品大全| 又爽又黄免费网站97双女| 亚洲精品乱码| 国产成人一级| 欧美国产日韩在线观看| www日本黄色| 久久国产av| 免费看操逼逼| 久操免费在线| 亚洲国产精品久久人人爱| 欧美日韩色视频| 操逼综合| 欧美一卡| 一级a一级a爱片兔兔软件| 51黄片库| 久久系列观看完整指南| 亚洲精品一区二区三区新线路| 久操香蕉| 苍井空一区| 西西人体44www大胆无码| 一级片在线| 一级午夜| 国产女人18毛片水真多18| 91av成人| 亚洲尤物在线| 中文无码熟妇一区二区| 欧美日韩免费在线观看| 翔田千里91| 男人天堂v| 亚洲精品久久久久久久蜜桃| 午夜国产视频| 黑人精品欧美一区二区蜜桃| 无码xx| 国产综合网站| 一区二区人妻| 久久亚洲天堂| 黑人乱伦| 日韩无码成人电影| 91成人在线免费视频| 97视频网站| A在线免费观看| 国产极品久久久| 欧美成人一级| 色婷婷国产精品综合在线观看| www.伊人网| 8050网午夜| 搡女人视频国产一级午夜片| 免费人成视频观看| caoporen| 亚洲av免费在线| 国产高清第一页| 亚洲AV自拍| 国产无码成人免费| 91视频在线| 日逼网站免费观看| 无码国产精品一区二区视频| 久久99高清视频| 99re热| 欧美久久久久久| 午夜无码免费| 黄色福利视频| 无码人妻中文字幕| BBw日本熟妇BBwHD| 性饥渴欧美老妇XXXXX| 国产99自拍| 99性视频| 中文字幕亞洲高清手機版第617 | 亚洲精品一区二区三| 在线视频久| 嫖中国站街老熟女HD| 操人妻视频| 日韩a级毛片| 天天舔天天操| 成人国产精品在线观看| 91精品综合| 中日毛片| 黄色三级片网站| 国产午夜激情视频| 无码A级| 国产高清在线视频| 国产一级操逼视频| 风流老熟女一区二区三区| 青青草手机视频在线| 成人A片在线观看| 亚洲综合一区二区三区| 成人欧美一区二区三区在线观看 | www99热| 插进去综合图| 五月天综合久久| 网站毛片| 大香蕉性爱视频| 在线观看国产| gogogo视频在线观看黑人| 久久你懂的| 久久亚洲影视| 国产免费久久| 午夜福利成人网站| 古装一级无遮挡A片| www.俺去| 91国产在线播放| 成人免费毛片蓝莓| 日韩欧美小视频| 天天操天天射天天日| 亚洲精品国产成人AV在线| av手机版| 特黄AV| 精品AV| 亚洲av偷拍| 亚洲一区三区| 久久不卡视频| 国产一级a爱做片免费☆观看| 欧美性性性| 香蕉日逼| 成人无码中文字幕| 丁香五月天婷婷| 日本一级婬片A片免费看| 成人你懂的| 大香蕉婷婷五月天| 性生活毛片| 国产熟女一区二区三区五月婷 | 日本天堂网站| 欧美久久大香蕉| 97成人人妻一区二区三区| 国产xxxxx| 人人爽人人爽人人| 一级Aa视频免费看| 色天堂影院| 99色亚洲| 日韩精品一二区| 搡BBBB搡BBBB搡BBB| 国产精品啪啪啪啪| 亚洲av网站在线观看| 天天干天天天天| 中文字幕在线观看免费高清电影| 少妇三区| 人人人妻人人人操| 欧美日韩肏屄视频| 黄色毛片一级| 夜夜操影院| 夜夜嗨av无码一区二区三区| 欧美另类极品| 亚洲免费观看高清完整版在线观 | 91白丝在线观看| 日韩一区二区三区免费视频| 囯产精品久久久久久久久久辛辛| 江苏妇搡BBBB搡BBB| YOUjiZZ欧美大全| 日韩国产| 图片区小说区区亚洲五月| 日韩TV| 亚洲欧美视频| 毛片网站免费| 无码做爰欢H肉动漫网站在线看 | 影音先锋乱伦电影| 日韩视频播放在线综合| 日韩精品无码一区二区| 亚州精品人妻一二三区| 九九亚洲| 大鸡巴免费视频| 日日干AV| 日韩黄色精品| 婷婷在线观看免费| 国产精品秘精东影业| www.cao| 久久综合九九| 91在线超碰| 精品自拍偷拍| 日韩AV小电影| 九九综合网| 九九热视频在线| 成人网站中文字幕| 一级a黄片| 久久中文字幕电影| 亚洲777| 少妇大战28厘米黑人| 99久久99久久精品免费看蜜桃| 国产一级黄色录像| 乱子伦国产精品www| 高清无码爱爱| 影音先锋AV资源在线| jizz在线视频| 丝袜二区| 亚洲无码激情在线| 撸一撸成人在线做爱视频。| 黄色片在线播放| 欧美精品在线播放| 青青青草视频| 亚洲无码精品一区二区| 操逼视频免费网站| 国产AV无| 欧美成人福利在线观看| jizz丝袜| 91官网在线观看| 51午夜福利| 国产精品一品二区三区的使用体验| 亚洲视频日韩在线观看| 成人做爰黄A片免费看三区蜜臀| 日本不卡一区二区三区| 天天操夜夜操狠狠操| 婷婷五月天成人电影| 先锋影音中文字幕| 人人妻人人玩人人澡人人爽| 毛茸茸BBBBBB毛茸茸| 中文字幕无码观看| 欧美级黑寡妇毛片app| 亚洲日本无码50p| 久久久偷拍视频| 亚洲天堂在线观看视频网站| 婷婷五月激情中文字幕| 四虎在线视频观看96| 水果派成人播放无码| AV成人| 韩剧《邻居的妻子》电视剧| 国产视频福利| 91人人澡| 人人精品| 中文字幕一区在线观看| 日韩91视频| 一级A片在线观看| 在线观看污视频| 中文字幕日韩有码| 国产精品久久久精品| 成人影音先锋| 欧美日韩成人在线视频| 真实国产乱子伦毛片| 精品无码在线| 亚洲精品无码电影| 99爱在线观看| 在线无码视频播放| 美女黄色视频网站| 亚洲日韩在线观看视频| 青青草亚洲| 极品人妻疯狂3p超刺激| 色呦呦一区二区三区| 午夜无码人妻AV大片| 美女天天肏| 成人亚洲视频| 四虎高清无码| www.亚洲精品| 成人在线超碰| 亚洲无码小电影| 人人妻人人操人人| 大香蕉伊人在线观看视频| 91高潮| 日逼黄色| 亚洲无码专区在线| av免费播放| 成人午夜无码福利视频| www.五月婷婷| 大鸡吧网站| 成人啪啪视频| 欧美一级日韩一级| 日韩无码中字| 国产成人亚洲日韩| 无码三级| 一区二区三区精品婷婷| 在线观看国产区| 91香蕉在线观看视频在线播放 | 激情在线视频| 午夜九九| 国产精品一区二区视频| 日韩日逼视频| 欧美黄片网站| 9I看片成人免费视频| 性99网站| 成人婷婷五月| 在线天堂9| 国产黄色视频在线播放| 国产精品无| 国产精品一区二区三区不卡| 亚洲成人精品AV| 91瑟瑟| 影音先锋亚洲AV| 久久婷五月天| 一级黄色电影免费观看| 亚洲AV无码久久精品色无码蜜桃| 少妇黄色视频| 日本黄色视频在线播放| 日韩精品人妻中文字幕蜜乳| 91精品国产综合久久久蜜臀酒店 | 4080yy午夜理论片成人| 一级操逼大片| 亚洲无码理论片| 69综合| 内射熟妇| 色999日韩| 色天使亚洲| 色五月婷婷五月| 黄片免费看| 天天干天天爽| 中文字幕福利电影| 无码AV高清| 小黄片在线免费观看| 亚洲videos| 加勒比无码视频| 亚洲永久免费精品| 97无码精品人妻一区二区三区| 欧美日韩毛片| 日韩无码免费播放| 亲子乱AⅤ一区二区三区| 久久精品中文字幕| 青青草五月天色婷婷丁香| 香蕉国产AV| 久久网一区| www.91在线视频| 中文在线A∨在线| 高清无码免费不卡| 日本一区二区三区在线观看网站| 国产日本在线| 色色a| 天天天天天天干| 国产性爱自拍一下| 国外亚洲成AV人片在线观看| 黄色免费福利视频| 一区二区三区Av| 3d啪啪动漫| 欧美在线大香蕉| 日韩欧美分区视频| 精品成人电影| 日韩欧美一级片| 午夜无码鲁丝片午夜精品一区二区| 欧美高清国产| 色男人的天堂网| 秋霞福利影院| 欧美亚洲综合在线| 久久亚洲婷婷| www.久久99| 伊人网在线视频| 特级毛片av| 欧美XX888做受| 香蕉成人网站| 26uuu亚洲| 国产一区二区三区免费视频| 中文字幕+乱码+中文乱码91| 欧洲黑人成人A版免费视频| 视频一区二区免费| 欧美日韩在线观看一区二区三区| 久久国产精品精品国产色婷婷 | 黄色激情网站| 无码人妻丰满熟妇区毛片蜜桃麻豆 | 99热99精品| 国产精品一二| 正在播放ADN156松下纱荣子 | 六月婷婷五月天| 欧美色色综合| 91人人操人人爽| 日本特级黄A片免费观看| 无码免费在线视频| 粉嫩AV蜜乳AV蜜臀AV蜂腰AV| 亚洲国产成人av| 男女av免费观看| 成年女人免费视频| 大香蕉性爱视频| 日皮视频在线观看| 91人妻一区二区三区无不码超满| 人人妻日日摸狠狠躁视频| 综合网插菊花| 日韩av毛片| 久久xxx| 精品福利一区二区三区| 欧美一级A片在免费看| 无码人妻丰满熟妇精品| 操大爷影院| 青青av| а√在线中文网新版地址在线 | 人人看人人摸人人草| 丰满岳乱妇一区二区三区| 国产成人午夜| 欧美精品午夜福利无码| 亚洲婷婷精品国产成人| 国产九九九九九九| 国产乱妇乱子伦视频免费观看让女人 | 亚洲操操| 久久精品三级片| 国产人国产视频成人免费观看…| 在线一区视频| 天天干无码| 殴美A片| 三洞齐开Av在线免费观看| 男女av在线观看| 免费成人高清视频| 黄色网址在线免费观看| 伊人网址| 超碰在线观看2407| 四虎www| 中文有码在线观看| 超碰成人在线观看| 欧美色大香蕉| 天天舔九色婷婷| 高清成人无码| 国产高清无码自拍| 五月影院| 日批网站在线| 91丨九色丨老农村| 嫩BBB槡BBBB槡BBB| 中文字幕永久在线视频v1.0| 色在线视频| 一道本无码一区| 亚洲视频网| 婷婷色情网| 欧美日韩久久久| 呦小BBBB小小BBBB| 91在线看| 四川BBB操BBB| 丁香五月天av| 免费成人黄片| 激情AAA| 老妇槡BBBB| 久久久WWW成人免费精品| 免费性爱视频网站| 无码不卡视频在线| 欧美久操| 无码人妻精品一区二区三千菊电影| 91综合网| 欧美日韩中文视频| 欧美一级棒| 欧美一卡二卡三卡| 蜜芽av在线观看| 色婷婷播放| 九九九成人| 操一炮在线视频| 亚洲中文字幕日韩精品| 西西人体444rt高清大胆模特| 强伦轩一区二区三区四区播放方式| 天天干天天在线观看| 熟女人妻在线观看| 中文字幕日韩在线观看| 日韩三级在线免费观看| 成人免费在线电影| 99热这里只有精品1| 无码三级在线免费观看| 国产又爽又黄视频| 簧片网站在线观看| 久久久成人网| 国产A片一区| 国产黄色视频在线免费看| 黄色片在线免费看| 国产一级二级三级视频| 国产主播第一页| 俺来俺去| 四虎在线观看视频| 亚洲A片电影| 91爽爽| 黄色av无码| 国产精品秘ThePorn| 国产一区二区三区免费播放| 麻豆视频在线免费观看| 精品成人在线视频| 中文字幕乱视频| 操欧美女人| 日韩操屄视频| 日韩黄色在线观看| 日韩A级视频| 久久午夜一级A片| 激情五月综合| 中文字幕乱在线| 欧美成人午夜福利| 球AV在线| 日韩免费高清无码视频| 无码人妻一区二区三区免费n鬼沢 北京熟妇槡BBBB槡BBBB | xxxx日韩| jizz国产精品| 人妻电影亚洲av| 日本人妻在线观看|