麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

.NET微信公眾號開發-6.0模板消息

2019-11-14 15:55:41
字體:
來源:轉載
供稿:網友

一.前言

    為了保證用戶不受到騷擾,在開發者出現需要主動提醒、通知用戶時,才允許開發者在公眾平臺網站中模板消息庫中選擇模板,選擇后獲得模板ID,再根據模板ID向用戶主動推送提醒、通知消息。這個意思也就是,我們作為微信商戶,不能主動的給用戶推送消息,如果這個功能完全開放,那么用戶有可能會受到大量的垃圾信息,為了做一個很好的控制,微信那邊給我們開放了一個模板消息,通過模板消息我們可以友好的給用戶發送一些相關的消息提醒。

二.開發前的準備

 1.0模板消息官方文檔地址

 2.0查看我們的模板消息是否申請成功。申請成功后你可以看到如下圖片:

三.開始編碼

 一般我們在客戶支付成功訂單以后,會有一個支付的跳轉頁面,在我們前面的代碼中也有相應的頁面,代碼如下:

<script type="text/javascript">               //調用微信JS api 支付               function jsApiCall()               {                   WeixinJSBridge.invoke(                   'getBrandWCPayRequest',                   <%=wxJsApiParam%>,//josn串                    function (res)                    {                      if (res.err_msg == "get_brand_wcpay_request:ok")                       {                           var OrderId=$("#OrderId").val();                           var orderPRoductName=$("#orderProductName").val();                           var orderMoneySum=$("#orderMoneySum").val();                            window.location.href="http://www.baidu.com/PaySkip.aspx?OrderId="+OrderId+"&orderMoneySum="+orderMoneySum+"&orderProductName="+orderProductName;//支付成功后的跳轉頁面                        }else                        {                          WeixinJSBridge.call('closeWindow');                        }                                              }                    );               }               function callpay()               {                   if (typeof WeixinJSBridge == "undefined")                   {                       if (document.addEventListener)                       {                           document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);                       }                       else if (document.attachEvent)                       {                           document.attachEvent('WeixinJSBridgeReady', jsApiCall);                           document.attachEvent('onWeixinJSBridgeReady', jsApiCall);                       }                   }                   else                   {                       jsApiCall();                   }               }                          </script>

    在上一篇,微信支付成功后,我們有這樣一個支付跳轉頁面,在這個支付跳轉頁面里,我們可以寫一些我們自己的業務邏輯,比如我們今天的主角,模板消息提醒:直接上代碼

                    #region 發送支付成功的消息                    ErrorMessage errorMessage;                    string username = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString();                    string templateId = System.Configuration.ConfigurationManager.AppSettings["templateId"].ToString();                    string first = "您已成功付費,歡迎下次光臨。";                    string orderMoneySum = Request["orderMoneySum"] ?? "0";                    string orderProductName = Request["orderProductName"] ?? "有位停車付費系統測試";                    string Remark = "如有問題請致電400-6238-136或直接在微信留言,我們將第一時間為您服務!";                    Color color = Color.Red;                    Tuple<string, string, Color>[] data = new Tuple<string, string, Color>[]{                    new Tuple<string,string,Color>("first",first,Color.Blue),                    new Tuple<string,string,Color>("orderMoneySum",orderMoneySum,Color.Red),                    new Tuple<string,string,Color>("orderProductName",orderProductName,Color.Orange),                    new Tuple<string,string,Color>("Remark",Remark,Color.Green)                };                    long msgId = TemplateMessage.Send(username, openId, templateId, "", color, data, out errorMessage);                    if (errorMessage.IsSuccess)                    {                        Response.Write("errorMessage " + errorMessage.errmsg + "<br/>");                    }                    else                    {                        Response.Write("errorMessage.errmsg: " + errorMessage.errmsg + "<br/>");                    }                    #endregion

從上面的代碼中我們可以看到TemplateMessage.Send()這個方法是我們發送消息的關鍵,我們來看看這個方法是怎樣的:

        #region 發送模板消息        /// <summary>        /// 發送模板消息        /// </summary>        /// <param name="userName">公眾號</param>        /// <param name="touser">接收消息的賬號</param>        /// <param name="templateId">模板id</param>        /// <param name="detailUrl">詳情地址</param>        /// <param name="topColor">頂端顏色</param>        /// <param name="data">數據</param>        /// <param name="errorMessage">返回發送是否成功</param>        /// <returns>返回消息id;如果發送失敗,返回-1。</returns>        public static long Send(string userName, string touser, string templateId, string detailUrl, Color topColor,            Tuple<string, string, Color>[] data, out ErrorMessage errorMessage)        {            errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "");            long id = -1;            //校驗參數            if (string.IsNullOrWhiteSpace(touser))            {                errorMessage.errmsg = "接收消息的賬號不能為空。";                return id;            }            if (string.IsNullOrWhiteSpace(templateId))            {                errorMessage.errmsg = "模板id不能為空。";                return id;            }            if (data == null || data.Length == 0)            {                errorMessage.errmsg = "模板數據不能為空。";                return id;            }            foreach (Tuple<string, string, Color> item in data)            {                if (string.IsNullOrWhiteSpace(item.Item1) || string.IsNullOrWhiteSpace(item.Item2))                {                    errorMessage.errmsg = "模板數據不能為空。";                    return id;                }            }            //獲取許可令牌            accessToken token = AccessToken.Get(userName);            if (token == null)            {                errorMessage.errmsg = "獲取許可令牌失敗。";                return id;            }            string url = string.Format(urlForSending, token.access_token);            //生成待發送的數據            dynamic postData = new ExpandoObject();            postData.touser = touser;            postData.template_id = templateId;            postData.url = detailUrl ?? string.Empty;            postData.topcolor = Utility.GetColorString(topColor);            postData.data = new ExpandoObject();            IDictionary<string, object> dataDict = (IDictionary<string, object>)postData.data;            foreach (Tuple<string, string, Color> item in data)            {                dataDict.Add(item.Item1, new { value = item.Item2, color = Utility.GetColorString(item.Item3) });            }            string json = JsonConvert.SerializeObject(postData);            //發送數據            string responseContent;            if (!HttpHelper.Request(url, out responseContent, httpMethod, json))            {                errorMessage.errmsg = "提交數據到微信服務器失敗。";                return id;            }            //解析結果            JObject jo = JObject.Parse(responseContent);            JToken jt;            if (jo.TryGetValue("errcode", out jt) && jo.TryGetValue("errmsg", out jt))            {                errorMessage.errcode = (int)jo["errcode"];                errorMessage.errmsg = (string)jo["errmsg"];                if (jo.TryGetValue("msgid", out jt))                    id = (long)jt;            }            else                errorMessage.errmsg = "解析返回結果失敗。";            return id;        }         #endregion
 AccessToken token = AccessToken.Get(userName);獲取許可令牌上一篇文章中我們已經說過這個類,這里就不多說了,HttpHelper幫助類的代碼如下:
   /// <summary>    /// HttpHelper:http請求與響應輔助類    /// </summary>    public static class HttpHelper    {        /// <summary>        /// 向微信服務器發送請求時的編碼        /// </summary>        public static readonly Encoding RequestEncoding = Encoding.UTF8;        /// <summary>        /// 微信服務器響應的編碼        /// </summary>        public static readonly Encoding ResponseEncoding = Encoding.UTF8;        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的數據        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseData">返回響應數據</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out byte[] responseData,            string httpMethod = WebRequestMethods.Http.Get, byte[] data = null)        {            bool success = false;            responseData = null;            Stream requestStream = null;            HttpWebResponse response = null;            Stream responseStream = null;            MemoryStream ms = null;            try            {                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);                request.Method = httpMethod;                if (data != null && data.Length > 0)                {                    request.ContentLength = data.Length;                    requestStream = request.GetRequestStream();                    requestStream.Write(data, 0, data.Length);                }                response = (HttpWebResponse)request.GetResponse();                //由于微信服務器的響應有時沒有正確設置ContentLength,這里不檢查ContentLength                //if (response.ContentLength > 0)                {                    ms = new MemoryStream();                    responseStream = response.GetResponseStream();                    int bufferLength = 2048;                    byte[] buffer = new byte[bufferLength];                    int size = responseStream.Read(buffer, 0, bufferLength);                    while (size > 0)                    {                        ms.Write(buffer, 0, size);                        size = responseStream.Read(buffer, 0, bufferLength);                    }                    responseData = ms.ToArray();                }                success = true;            }            finally            {                if (requestStream != null)                    requestStream.Close();                if (responseStream != null)                    responseStream.Close();                if (ms != null)                    ms.Close();                if (response != null)                    response.Close();            }            return success;        }        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的數據        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseData">返回響應數據</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out byte[] responseData,            string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            byte[] bytes = string.IsNullOrEmpty(data) ? null : RequestEncoding.GetBytes(data);            return Request(url, out responseData, httpMethod, (byte[])bytes);        }        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的內容        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseContent">返回響應內容</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out string responseContent,            string httpMethod = WebRequestMethods.Http.Get, byte[] data = null)        {            byte[] responseData;            responseContent = string.Empty;            bool success = Request(url, out responseData, httpMethod, data);            if (success && responseData != null && responseData.Length > 0)                responseContent = ResponseEncoding.GetString(responseData);            return success;        }        /// <summary>        /// 向微信服務器提交數據,并獲取微信服務器響應的內容        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="responseContent">返回響應內容</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, out string responseContent,            string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            byte[] bytes = string.IsNullOrEmpty(data) ? null : RequestEncoding.GetBytes(data);            return Request(url, out responseContent, httpMethod, (byte[])bytes);        }        /// <summary>        /// 向微信服務器提交數據        /// </summary>        /// <param name="url">服務器地址</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, string httpMethod = WebRequestMethods.Http.Get, byte[] data = null)        {            bool success = false;            Stream requestStream = null;            HttpWebResponse response = null;            try            {                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);                request.Method = httpMethod;                if (data != null && data.Length > 0)                {                    request.ContentLength = data.Length;                    requestStream = request.GetRequestStream();                    requestStream.Write(data, 0, data.Length);                }                response = (HttpWebResponse)request.GetResponse();                success = true;            }            finally            {                if (requestStream != null)                    requestStream.Close();                if (response != null)                    response.Close();            }            return success;        }        /// <summary>        /// 組合url,發送數據,然后返回響應字符串        /// </summary>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回響應內容;如果請求失敗,或者發生錯誤,返回空字符串</returns>        public static string RequestResponseContent(string urlFormat, string userName, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            string responseContent = string.Empty;            AccessToken token = AccessToken.Get(userName);            if (token == null)                return responseContent;            string url;            if (urlParameters == null)                url = string.Format(urlFormat, token.access_token);            else            {                List<object> paramList = new List<object>(urlParameters);                paramList.Insert(0, token.access_token);                url = string.Format(urlFormat, paramList.ToArray());            }            HttpHelper.Request(url, out responseContent, httpMethod, (string)data);            return responseContent;        }        /// <summary>        /// 組合url,發送數據,然后返回響應的錯誤消息。        /// 注:錯誤消息不一定代表失敗或者錯誤。        /// </summary>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回響應的錯誤消息</returns>        public static ErrorMessage RequestErrorMessage(string urlFormat, string userName, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            string responseContent = RequestResponseContent(urlFormat, userName, urlParameters, httpMethod, data);            if (string.IsNullOrWhiteSpace(responseContent))                return new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");            else if (ErrorMessage.IsErrorMessage(responseContent))                return ErrorMessage.Parse(responseContent);            else                return new ErrorMessage(ErrorMessage.ExceptionCode, "解析響應失敗。");        }        /// <summary>        /// 組合url,發送數據,然后返回結果。        /// 注:結果為需要解析的類。        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回null。</returns>        public static T RequestParsableResult<T>(string urlFormat, string userName, out ErrorMessage errorMessage, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)            where T : IParsable, new()        {            T result = default(T);            errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");            string responseContent = RequestResponseContent(urlFormat, userName, urlParameters, httpMethod, data);            if (string.IsNullOrWhiteSpace(responseContent))                return result;            if (ErrorMessage.IsErrorMessage(responseContent))                errorMessage = ErrorMessage.Parse(responseContent);            else            {                try                {                    result = Utility.Parse<T>(responseContent);                    if (result != null)                        errorMessage = new ErrorMessage(ErrorMessage.SuccessCode, "請求成功。");                    else                        errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "解析失敗。");                }                catch                {                    errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "解析失敗。");                }            }            return result;        }        /// <summary>        /// 組合url,發送數據,然后返回結果。        /// 注:結果為已知的簡單值類型。        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="urlFormat">url格式字符串,第一個參數為userName獲取到的許可令牌,然后依次為parameters中的參數</param>        /// <param name="userName">公眾號</param>        /// <param name="propertyNameInJson">返回結果在json中的鍵名</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <param name="urlParameters">參數</param>        /// <param name="httpMethod">執行請求的http方法</param>        /// <param name="data">請求的內容</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回default(T)。</returns>        public static T RequestValueTypeResult<T>(string urlFormat, string userName, string propertyNameInJson, out ErrorMessage errorMessage, IEnumerable<object> urlParameters = null, string httpMethod = WebRequestMethods.Http.Get, string data = null)            where T : struct        {            errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");            string responseContent = RequestResponseContent(urlFormat, userName, urlParameters, httpMethod, data);            return ConvertValueTypeResult<T>(responseContent, propertyNameInJson, out errorMessage);        }        /// <summary>        /// 獲取值類型的結果        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="responseContent">響應內容</param>        /// <param name="propertyNameInJson">返回結果在json中的鍵名</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回default(T)。</returns>        private static T ConvertValueTypeResult<T>(string responseContent, string propertyNameInJson, out ErrorMessage errorMessage)            where T : struct        {            if (string.IsNullOrWhiteSpace(responseContent))            {                errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "請求失敗。");                return default(T);            }            if (ErrorMessage.IsErrorMessage(responseContent))                errorMessage = ErrorMessage.Parse(responseContent);            else                errorMessage = new ErrorMessage(ErrorMessage.SuccessCode, "請求成功。");            JObject jo = JObject.Parse(responseContent);            JToken jt;            if (jo.TryGetValue(propertyNameInJson, out jt))                return ConvertValueTypeResult<T>((string)jt);            else                return default(T);        }        /// <summary>        /// 獲取值類型的結果        /// </summary>        /// <typeparam name="T">返回結果的類型</typeparam>        /// <param name="responseContent">響應內容</param>        /// <param name="propertyNameInJson">返回結果在json中的鍵名</param>        /// <param name="errorMessage">返回請求是否成功</param>        /// <returns>返回結果;如果請求失敗,或者發生錯誤,返回default(T)。</returns>        private static T ConvertValueTypeResult<T>(string value)            where T : struct        {            Type type = typeof(T);            if (type.IsEnum)                return (T)Enum.Parse(type, value);            else if (type == typeof(sbyte))                return (T)(object)Convert.ToSByte(value);            else if (type == typeof(byte))                return (T)(object)Convert.ToByte(value);            else if (type == typeof(char))                return (T)(object)Convert.ToChar(value);            else if (type == typeof(short))                return (T)(object)Convert.ToInt16(value);            else if (type == typeof(ushort))                return (T)(object)Convert.ToUInt16(value);            else if (type == typeof(int))                return (T)(object)Convert.ToInt32(value);            else if (type == typeof(uint))                return (T)(object)Convert.ToUInt32(value);            else if (type == typeof(long))                return (T)(object)Convert.ToInt64(value);            else if (type == typeof(ulong))                return (T)(object)Convert.ToUInt64(value);            else if (type == typeof(float))                return (T)(object)Convert.ToSingle(value);            else if (type == typeof(double))                return (T)(object)Convert.ToDouble(value);            else if (type == typeof(decimal))                return (T)(object)Convert.ToDecimal(value);            else if (type == typeof(bool))                return (T)(object)Convert.ToBoolean(value);            else                throw new ArgumentException("不支持的值類型。");        }        /// <summary>        /// 向微信服務器提交數據        /// </summary>        /// <param name="url">服務器地址</param>        /// /// <param name="httpMethod">http方法</param>        /// <param name="data">數據</param>        /// <returns>返回是否提交成功</returns>        public static bool Request(string url, string httpMethod = WebRequestMethods.Http.Get, string data = null)        {            byte[] bytes = string.IsNullOrEmpty(data) ? null : RequestEncoding.GetBytes(data);            return Request(url, httpMethod, (byte[])bytes);        }        /// <summary>        /// 上傳文件        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="filename">文件名(不包含路徑)</param>        /// <param name="fileData">文件數據</param>        /// <param name="formData">表單數據</param>        /// <returns>返回服務器的響應字符串</returns>        public static string Upload(string url, string filename, byte[] fileData, NameValueCollection formData = null)        {            string responseContent = string.Empty;            if (string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(filename) || fileData == null || fileData.Length == 0)                return responseContent;            // 邊界符            string boundary = "AaB03xAaB03x";            // 開始邊界符            byte[] beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "/r/n");            // 結束符            byte[] endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--/r/n");            //換行            byte[] newLine = Encoding.ASCII.GetBytes("/r/n");            MemoryStream ms = null;            Stream stream = null;            HttpWebResponse response = null;            StreamReader sr = null;            try            {                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);                request.Method = WebRequestMethods.Http.Post;                request.ContentType = "multipart/form-data; boundary=" + boundary;                // 寫入文件                string header = string.Format("Content-Disposition: form-data; filename=/"{0}/"/r/n" +                     "Content-Type: application/octet-stream/r/n/r/n",                     filename);                byte[] headerbytes = Encoding.UTF8.GetBytes(header);                ms = new MemoryStream();                ms.Write(beginBoundary, 0, beginBoundary.Length);                ms.Write(headerbytes, 0, headerbytes.Length);                ms.Write(fileData, 0, fileData.Length);                // 寫入表單數據                if (formData != null && formData.Count > 0)                {                    var formItem = "/r/n--" + boundary +                                           "/r/nContent-Disposition: form-data; name=/"{0}/"" +                                           "/r/n/r/n{1}/r/n";                    foreach (string key in formData.Keys)                    {                        string value = formData[key];                        byte[] bytes = Encoding.UTF8.GetBytes(string.Format(formItem, key, value));                        ms.Write(bytes, 0, bytes.Length);                    }                }                //寫入結束邊界符                ms.Write(newLine, 0, newLine.Length);                ms.Write(endBoundary, 0, endBoundary.Length);                request.ContentLength = ms.Length;                stream = request.GetRequestStream();                stream.Write(ms.ToArray(), 0, (int)ms.Length);                //獲取響應                response = (HttpWebResponse)request.GetResponse();                sr = new StreamReader(response.GetResponseStream(), HttpHelper.ResponseEncoding);                responseContent = sr.ReadToEnd();            }            finally            {                if (ms != null)                    ms.Close();                if (stream != null)                    stream.Close();                if (sr != null)                    sr.Close();                if (response != null)                    response.Close();            }            return responseContent;        }        /// <summary>        /// 上傳文件        /// </summary>        /// <param name="url">服務器地址</param>        /// <param name="pathname">包含路徑的文件名</param>        /// <param name="formData">表單數據</param>        /// <returns>返回服務器的響應字符串</returns>        public static string Upload(string url, string pathname, NameValueCollection formData = null)        {            string filename = Path.GetFileName(pathname);            byte[] data = null;            FileStream fs = null;            MemoryStream ms = null;            try            {                fs = new FileStream(pathname, FileMode.Open, FileAccess.Read);                ms = new MemoryStream();                int bufferLength = 2048;                byte[] buffer = new byte[bufferLength];                int size = fs.Read(buffer, 0, bufferLength);                while (size > 0)                {                    ms.Write(buffer, 0, size);                    size = fs.Read(buffer, 0, bufferLength);                }                data = ms.ToArray();            }            finally            {                if (fs != null)                    fs.Close();                if (ms != null)                    ms.Close();            }            return Upload(url, filename, data, formData);        }    }
HttpHelper

四.最終效果如下:

五.微信公眾號開發系列導航

1.0初始微信公眾號

2.0創建自定義菜單

3.0查詢自定義菜單

4.0公眾號消息處理

5.0微信支付

6.0模板消息


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成年人视频免费 | 香蕉视频99 | 久久久青青草 | 久久久久久久一区 | 毛片在线看免费 | av在线官网 | 国产精品午夜未成人免费观看 | 成人在线视频在线观看 | 亚洲第一成网站 | 国产影视 | 91精品国产乱码久久桃 | 性 毛片 | 99r国产精品 | 国产精品一区二区三区在线播放 | 美国一级免费视频 | 最新一区二区三区 | japanese xxxxhd| 中文字幕观看 | 羞羞的视频免费在线观看 | 色妞欧美 | 亚洲国产精品久久久久婷婷老年 | 草莓视频在线导航 | 欧美一级做a | 欧美一区在线观看视频 | 成年免费大片黄在线观看岛国 | 最新一区二区三区 | 久久久久国产一区二区三区不卡 | 精国产品一区二区三区四季综 | av在线免费网 | 国产视频在线播放 | 欧美黄一区 | 一区在线免费视频 | 特黄一级小说 | 欧美一级视频免费看 | 久久99久久99免费视频 | xxxx8| 久久成人综合视频 | 国产精品久久久久久久午夜片 | 精品一区二区三区电影 | 九草在线 | 国产精品99久久免费观看 |