在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網絡軟件教程 > 詳細頁面

公眾號支付接口的開發

公眾號支付接口的開發

更新時間:2025-09-20 文章作者:未知 信息來源:網絡 閱讀次數:

微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務的免費應用程序,由張小龍所帶領的騰訊廣州研發中心產品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統平臺...
微信(WeChat)是騰訊公司于2011年1月21日推出的一個為智能終端提供即時通訊服務的免費應用程序,由張小龍所帶領的騰訊廣州研發中心產品團隊打造 [2] 。微信支持跨通信運營商、跨操作系統平臺通過網絡快速發送免費(需消耗少量網絡流量)語音短信、視頻、圖片和文字,同時,也可以使用通過共享流媒體內容的資料和基于位置的社交插件“搖一搖”、“漂流瓶”、“朋友圈”、”公眾平臺“、”語音記事本“等服務插件。
這次給大家帶來公眾號支付接口的開發,公眾號支付接口開發的注意事項有哪些,下面就是實戰案例,一起來看一下。

公眾號支付就是在微信里面的H5頁面喚起微信支付,不用掃碼即可付款的功能。做這個功能首先要明確的就是,只有和商戶號mch_id匹配的appid才能成功支付。商戶號在注冊成功的時候就會將相關信息發送到郵箱里面。而喚起支付的一個關鍵是靠openid拿到統一下單。而openid是和appid一一對應的。也就是說如果你登錄使用的appid不是公眾號的appid,得到的openid就無法喚起公眾號內的支付(會出現appid和商戶號不匹配的錯誤)。曾經就在這個地方繞了個彎,因為微信的開放平臺可以創建網站應用,也有一個appid和appsecreat,也可以在微信里面一鍵登錄。

業務流程

下面是微信的官方流程,看似有點復雜,重點就是要拿到統一下單接口返回的json串,其他按照官方demo基本就能正確,下面說一下幾個細節。

公眾號支付接口的開發

創建訂單

在調用微信公眾號支付之前,首先我們自己要把訂單創建好。比如一個充值的訂單。主要是先確定下金額再進行下一步。

  public JsonResult CreateRecharegOrder(decimal money)
        {            if (money < (decimal)0.01) return Json(new PaymentResult("充值金額非法!"));            var user = _workContext.CurrentUser;            var order = _paymentService.CreateRechargeOrder(user.Id, money);            return Json(new PaymentResult(true) {OrderId = order.OrderNumber});
        }

調用統一下單

訂單創建成功之后,頁面跳轉到支付頁面,這個時候就是按照官方的流程去拿prepay_id和paySign,微信的demo中提供了一個jsApiPay的對象。但這個對象需要一個page對象初始化。

       [LoginValid]        public ActionResult H5Pay(string orderNumber)
        {            var user = _workContext.CurrentUser;            var order = _paymentService.GetOrderByOrderNumber(orderNumber);            //判斷訂單是否存在            //訂單是否已經支付了
            var openid = user.OpenId;            var jsApipay = new JsApiPayMvc(this.ControllerContext.HttpContext);
            jsApipay.openid = openid;
            jsApipay.total_fee = (int)order.Amount * 100;
            WxPayData unifiedOrderResult = jsApipay.GetUnifiedOrderResult();
            ViewBag.wxJsApiParam = jsApipay.GetJsApiParameters();//獲取H5調起JS API參數     
            ViewBag.unifiedOrder = unifiedOrderResult.ToPrintStr();
            ViewBag.OrderNumber = order.OrderNumber;            return View();
        }

在MVC中我們簡單改一下就可以了。也就是把page對象換成httpContext即可。然后里面的方法就可以直接用了。

JsApiPayMvc:

using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Runtime.Serialization;using System.IO;using System.Text;using System.Net;using System.Web.Security;using LitJson;namespace WxPayAPI
{    public class JsApiPayMvc
    {        /// <summary>
        /// 保存頁面對象,因為要在類的方法中使用Page的Request對象        /// </summary>
        public HttpContextBase context { get; set; }        /// <summary>
        /// openid用于調用統一下單接口        /// </summary>
        public string openid { get; set; }        /// <summary>
        /// access_token用于獲取收貨地址js函數入口參數        /// </summary>
        public string access_token { get; set; }        /// <summary>
        /// 商品金額,用于統一下單        /// </summary>
        public int total_fee { get; set; }        /// <summary>
        /// 統一下單接口返回結果        /// </summary>
        public WxPayData unifiedOrderResult { get; set; }        public JsApiPayMvc(HttpContextBase _context)
        {
            context = _context;
        }        /**
        * 
        * 網頁授權獲取用戶基本信息的全部過程
        * 詳情請參看網頁授權獲取用戶基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
        * 第一步:利用url跳轉獲取code
        * 第二步:利用code去獲取openid和access_token
        * 
        */
        public void GetOpenidAndAccessToken(string code)
        {            if (!string.IsNullOrEmpty(code))
            {                //獲取code碼,以獲取openid和access_token
                Log.Debug(this.GetType().ToString(), "Get code : " + code);
                GetOpenidAndAccessTokenFromCode(code);
            }            else
            {                //構造網頁授權獲取code的URL
                string host = context.Request.Url.Host;                string path = context.Request.Path;                string redirect_uri = HttpUtility.UrlEncode("http://" + host + path);
                WxPayData data = new WxPayData();
                data.SetValue("appid", WxPayConfig.APPID);
                data.SetValue("redirect_uri", redirect_uri);
                data.SetValue("response_type", "code");
                data.SetValue("scope", "snsapi_base");
                data.SetValue("state", "STATE" + "#wechat_redirect");                string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
                Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url);                try
                {                    //觸發微信返回code碼         
                    context.Response.Redirect(url);//Redirect函數會拋出ThreadAbortException異常,不用處理這個異常                }                catch(System.Threading.ThreadAbortException ex)
                {
                }
            }
        }        /**
        * 
        * 通過code換取網頁授權access_token和openid的返回數據,正確時返回的JSON數據包如下:
        * {
        *  "access_token":"ACCESS_TOKEN",
        *  "expires_in":7200,
        *  "refresh_token":"REFRESH_TOKEN",
        *  "openid":"OPENID",
        *  "scope":"SCOPE",
        *  "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
        * }
        * 其中access_token可用于獲取共享收貨地址
        * openid是微信支付jsapi支付接口統一下單時必須的參數
        * 更詳細的說明請參考網頁授權獲取用戶基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
        * @失敗時拋異常WxPayException        */
        public void GetOpenidAndAccessTokenFromCode(string code)
        {            try
            {                //構造獲取openid及access_token的url
                WxPayData data = new WxPayData();
                data.SetValue("appid", WxPayConfig.APPID);
                data.SetValue("secret", WxPayConfig.APPSECRET);
                data.SetValue("code", code);
                data.SetValue("grant_type", "authorization_code");                string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl();                //請求url以獲取數據
                string result = HttpService.Get(url);
                Log.Debug(this.GetType().ToString(), "GetOpenidAndAccessTokenFromCode response : " + result);                //保存access_token,用于收貨地址獲取
                JsonData jd = JsonMapper.ToObject(result);
                access_token = (string)jd["access_token"];                //獲取用戶openid
                openid = (string)jd["openid"];
                Log.Debug(this.GetType().ToString(), "Get openid : " + openid);
                Log.Debug(this.GetType().ToString(), "Get access_token : " + access_token);
            }            catch (Exception ex)
            {
                Log.Error(this.GetType().ToString(), ex.ToString());                throw new WxPayException(ex.ToString());
            }
        }        /**
         * 調用統一下單,獲得下單結果
         * @return 統一下單結果
         * @失敗時拋異常WxPayException         */
        public WxPayData GetUnifiedOrderResult()
        {            //統一下單
            WxPayData data = new WxPayData();
            data.SetValue("body", "test");
            data.SetValue("attach", "test");
            data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());
            data.SetValue("total_fee", total_fee);
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
            data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
            data.SetValue("goods_tag", "test");
            data.SetValue("trade_type", "JSAPI");
            data.SetValue("openid", openid);
            WxPayData result = WxPayApi.UnifiedOrder(data);            if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "")
            {
                Log.Error(this.GetType().ToString(), "UnifiedOrder response error!");                throw new WxPayException("UnifiedOrder response error!");
            }
            unifiedOrderResult = result;            return result;
        }        /**
        *  
        * 從統一下單成功返回的數據中獲取微信瀏覽器調起jsapi支付所需的參數,
        * 微信瀏覽器調起JSAPI時的輸入參數格式如下:
        * {
        *   "appId" : "wx2421b1c4370ec43b",     //公眾號名稱,由商戶傳入     
        *   "timeStamp":" 1395712654",         //時間戳,自1970年以來的秒數     
        *   "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //隨機串     
        *   "package" : "prepay_id=u802345jgfjsdfgsdg888",     
        *   "signType" : "MD5",         //微信簽名方式:    
        *   "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名 
        * }
        * @return string 微信瀏覽器調起JSAPI時的輸入參數,json格式可以直接做參數用
        * 更詳細的說明請參考網頁端調起支付API:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7
        * 
        */
        public string GetJsApiParameters()
        {
            Log.Debug(this.GetType().ToString(), "JsApiPay::GetJsApiParam is processing...");
            WxPayData jsApiParam = new WxPayData();
            jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid"));
            jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp());
            jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr());
            jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id"));
            jsApiParam.SetValue("signType", "MD5");
            jsApiParam.SetValue("paySign", jsApiParam.MakeSign());            string parameters = jsApiParam.ToJson();
            Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters);            return parameters;
        }        /**
        * 
        * 獲取收貨地址js函數入口參數,詳情請參考收貨地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9
        * @return string 共享收貨地址js函數需要的參數,json格式可以直接做參數使用        */
        public string GetEditAddressParameters()
        {            string parameter = "";            try
            {                string host = context.Request.Url.Host;                string path = context.Request.Path;                string queryString = context.Request.Url.Query;                //這個地方要注意,參與簽名的是網頁授權獲取用戶信息時微信后臺回傳的完整url
                string url = "http://" + host + path + queryString;                //構造需要用SHA1算法加密的數據
                WxPayData signData = new WxPayData();
                signData.SetValue("appid",WxPayConfig.APPID);
                signData.SetValue("url", url);
                signData.SetValue("timestamp",WxPayApi.GenerateTimeStamp());
                signData.SetValue("noncestr",WxPayApi.GenerateNonceStr());
                signData.SetValue("accesstoken",access_token);                string param = signData.ToUrl();
                Log.Debug(this.GetType().ToString(), "SHA1 encrypt param : " + param);                //SHA1加密
                string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, "SHA1");
                Log.Debug(this.GetType().ToString(), "SHA1 encrypt result : " + addrSign);                //獲取收貨地址js函數入口參數
                WxPayData afterData = new WxPayData();
                afterData.SetValue("appId",WxPayConfig.APPID);
                afterData.SetValue("scope","jsapi_address");
                afterData.SetValue("signType","sha1");
                afterData.SetValue("addrSign",addrSign);
                afterData.SetValue("timeStamp",signData.GetValue("timestamp"));
                afterData.SetValue("nonceStr",signData.GetValue("noncestr"));                //轉為json格式
                parameter = afterData.ToJson();
                Log.Debug(this.GetType().ToString(), "Get EditAddressParam : " + parameter);
            }            catch (Exception ex)
            {
                Log.Error(this.GetType().ToString(), ex.ToString());                throw new WxPayException(ex.ToString());
            }            return parameter;
        }
    }
}

View Code

這個頁面可以在本地調試,可以比較方便的確認參數是否ok。

喚起支付

官方頁面的示例如下:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6 但主要的參數(mark部分)是由后臺生成的,也就是上一個步驟的ViewBag.wxJsApiParam

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {           "appId" : "wx2421b1c4370ec43b",     //公眾號名稱,由商戶傳入     
           "timeStamp":" 1395712654",         //時間戳,自1970年以來的秒數     
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //隨機串     
           "package" : "prepay_id=u802345jgfjsdfgsdg888",     
           "signType" : "MD5",         //微信簽名方式:     
           "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名 
       },
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回    ok,但并不保證它絕對可靠。 
       }
   ); 
}

所以在MVC中要這樣寫:

@{
    ViewBag.Title = "微信支付";
    Layout = "~/Views/Shared/_Layout.cshtml";
}<p class="page" id="Wxpayment">
    <p class="content">
        <p>訂單詳情:@Html.Raw(ViewBag.unifiedOrder)</p>
        <button id="h5pay" onclick="callpay()">支付</button>
    </p>
    <input type="hidden" value="@ViewBag.OrderNumber" id="ordernum"/></p>
 <script type="text/javascript">
    //調用微信JS api 支付
    function jsApiCall() {
        WeixinJSBridge.invoke(            'getBrandWCPayRequest',            @Html.Raw(ViewBag.wxJsApiParam),//josn串
            function (res)
            {
                WeixinJSBridge.log(res.err_msg);                //alert(res.err_code + res.err_desc + res.err_msg);
                if (res.err_msg == "get_brand_wcpay_request:ok") {                   var num = $("#ordernum").val();
                    $.post("/payment/WeiXinPaySuccess", { ordernumber: num }, function(data) {                        if (data.IsSuccess === true) {
                            alert("支付成功");
                            location.href = document.referrer;
                        } else {
                            
                        }
                    });
                } 
                if (res.err_msg == 'get_brand_wcpay_request:cancel') {
                      $('.button').removeAttr('submitting');
                      alert('取消支付');
                } 
            }
        );
    }    function callpay()
    {        if (typeof WeixinJSBridge == "undefined")
        {
            alert("WeixinJSBridge =");            if (document.addEventListener)
            {
                document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
            }            else if (document.attachEvent)
            {
                document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
            }
        }        else
        {
            jsApiCall();
        }
    }</script>

必須要用Html.Raw,不然json解析不對,無法支付。這個時候點擊頁面,會出現微信的加載效果,但別高興的太早,還是會出錯,出現一個“3當前的URL未注冊”

公眾號支付接口的開發

原因就在于,需要在公眾號中設置支付目錄。而這個支付目錄是大小寫敏感的,所以你得多試幾次。直到彈出輸入密碼的窗口才是真的流程正確了。然后支付成功之后馬上就可以收到js中的回調,這個時候你可以去處理你的訂單和業務邏輯。

小結

如果是生產環境,我們需要再多個地方調用,需要再封裝一下。

function jsApiCall(json, success, fail) {
    WeixinJSBridge.invoke(        'getBrandWCPayRequest',
        json,//josn串
        function (res)
        {
            WeixinJSBridge.log(res.err_msg);            //alert(res.err_code + res.err_desc + res.err_msg);
            if (res.err_msg == "get_brand_wcpay_request:ok") {                //充值進去 要區分是出題充值 還是購買懸賞 前者沖到他的錢包
                //后者直接沖到系統賬戶
                if (success) success();
            } 
            if (res.err_msg == 'get_brand_wcpay_request:cancel') {                // alert('取消支付');
                if (fail)fail();
            } 
        }
    );
}function callpay(json,success,fail)
{    if (typeof WeixinJSBridge == "undefined")
    {
        alert("請在微信中打開!");        if (document.addEventListener)
        {
            document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
        }        else if (document.attachEvent)
        {
            document.attachEvent('WeixinJSBridgeReady', jsApiCall);
            document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
        }
    }    else
    {
        jsApiCall(json, success, fail);
    }
}

View Code

  [LoginValid]        public ActionResult H5PayJson(string orederId)
        {            var user = _workContext.CurrentUser;            var order = _paymentService.GetOrderByOrderNumber(orederId);            //判斷訂單是否存在            //訂單是否已經支付了
            var openid = user.OpenId;            var jsApipay = new JsApiPayMvc(ControllerContext.HttpContext)
            {
                openid = openid,
                total_fee = (int) order.Amount*100
            };            try
            {
                jsApipay.GetUnifiedOrderResult();                return Json(jsApipay.GetJsApiParameters());//實際還是字符串
            }            catch (Exception e)
            {                //統一下單失敗
                return Json(new PortalResult(false, e.Message));
            }
        }

調用的時候這樣直接喚起支付了。 但如果傳入的json不是json對象,微信加載動畫會一直卡在哪兒。

 $.post("/Checkout/H5PayJson", { orederId: orderId }, function (jsondata) {                                var jdata = JSON.parse(jsondata);                                if (jdata.appId) {
                                    callpay(jdata, function () {
                                        $.post("/payment/WeiXinPaySuccess", { ordernumber: orderId }, function (paymentdata) {                                            if (paymentdata.IsSuccess === true) {
                                                submitQuestion();
                                            } else {
                                                $.alert(paymentdata.Message);
                                            }
                                        });
                                    }, function () {
                                        $.alert("你已取消支付!");
                                    });
                                } else {
                                    alert("統一下單失敗!");
                                }
                            });

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

webpack自動刷新與解析的使用

webpack的模塊熱替換詳解

JS事件先發布后訂閱的方法

以上就是公眾號支付接口的開發的詳細內容,更多請關注php中文網其它相關文章!


微信提供公眾平臺、朋友圈、消息推送等功能,用戶可以通過“搖一搖”、“搜索號碼”、“附近的人”、掃二維碼方式添加好友和關注公眾平臺,同時微信將內容分享給好友以及將用戶看到的精彩內容分享到微信朋友圈。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 香蕉视频xxxx| 成人黄色一区二区| 国产精品嫩草影视| 国产一区视频免费观看| 僵尸世界大战2 在线播放| 搡的我好爽在线观看免费视频| 干日本少妇首页| 欧美视频免费播放| 丁香啪啪综合成人亚洲| 欧美变态另类刺激| 欧美激情国产精品日韩| 色一情一乱一伦一区二区三区日本| 日韩av在线播放不卡| 欧美日韩黄色一级片| 少妇无码av无码专区在线观看 | 亚洲一区二区蜜桃| 欧在线一二三四区| 日本超碰在线观看| 特级毛片在线免费观看| 中文字幕乱码免费| 99在线精品免费视频| 久久久久狠狠高潮亚洲精品| 成人性生生活性生交12| 一级全黄肉体裸体全过程| 欧美交换配乱吟粗大25p| 国产乱子伦农村叉叉叉| 爱情岛论坛成人| 日韩久久久久久久久久久久| 男人亚洲天堂网| 天天操精品视频| 免费看一级大黄情大片| 亚洲欧美日韩三级| 日本人妻伦在线中文字幕| 999香蕉视频| 成人免费a级片| 蜜桃免费在线视频| www.av蜜桃| 日本成人xxx| www.日日操| 亚洲色欲久久久综合网东京热| 国产一级片黄色| 9色porny| 黄瓜视频免费观看在线观看www| 极品美女扒开粉嫩小泬| 激情图片中文字幕| 午夜免费高清视频| 免费观看日韩毛片| 欧美高清中文字幕| 五月六月丁香婷婷| 国产精品一区二区小说| 亚洲熟妇国产熟妇肥婆| 91大学生片黄在线观看| 日本高清一区二区视频| 少妇高潮喷水久久久久久久久久| 先锋影音男人资源| 久久久久久综合网| 亚洲一级免费观看| www.日本xxxx| 欧美成人黄色网址| 国产成人精品无码播放| 欧美成人xxxxx| 亚洲 自拍 另类小说综合图区| 亚洲天堂av一区二区三区| 中日韩av在线播放| chinese少妇国语对白| 欧美性大战久久久久xxx| 久久成人免费观看| 欧美 日韩 国产 高清| 亚洲美免无码中文字幕在线 | av动漫免费观看| 国产乱女淫av麻豆国产| 少妇一级淫免费播放| 五月婷婷六月合| 日韩高清第一页| 中文字幕综合在线观看| 国产盗摄视频在线观看| 亚洲区成人777777精品| 日本五级黄色片| 国产精品50p| 亚洲一区在线不卡| 日韩av.com| 成人一区二区av| 99视频在线免费播放| www.xxx亚洲| 亚洲女人在线观看| 五月天在线免费视频| 欧美精品自拍视频| 色诱视频在线观看| 一区二区三区一级片| 日韩在线视频在线| 成人一区二区三| 欧美日韩在线免费观看视频| 50度灰在线观看| 妞干网在线视频观看| www.99av.com| 2018中文字幕第一页| 日本熟妇人妻中出| www.欧美黄色| 一级黄色录像在线观看| 少妇一晚三次一区二区三区| 欧美a v在线播放| 色乱码一区二区三区熟女| 欧美一级片免费播放| 中文久久久久久| 日本女人高潮视频| 亚洲黄色av网址| 波多野结衣 作品| 三级视频中文字幕| 日韩av三级在线| 欧美一区二区三区综合| 中文字幕网av| 97av视频在线观看| 手机av在线网站| 天堂av在线网站| 成人av一级片| 欧美久久在线观看| 黄色一级片网址| 国产乱码一区二区三区四区| 久章草在线视频| 日韩av一二三四区| 黄色成人在线免费观看| 国产精品波多野结衣| 中文字幕亚洲欧洲| 久久久精品麻豆| 午夜免费高清视频| 又色又爽又高潮免费视频国产| 欧美国产日韩激情| 国产激情片在线观看| 裸体大乳女做爰69| 婷婷视频在线播放| 亚洲女人在线观看| 日本高清久久久| 国产三级三级看三级| 鲁一鲁一鲁一鲁一色| 免费观看美女裸体网站| 国产91沈先生在线播放| 男人天堂av片| 奇米精品一区二区三区| 黄色一级片播放| 亚洲精品高清无码视频| 黄色三级视频在线| 91网址在线观看精品| 国产奶头好大揉着好爽视频| 国产av不卡一区二区| 欧洲在线免费视频| 国产精品视频一二三四区| 国产欧美精品aaaaaa片| 丝袜人妻一区二区三区| 欧美亚洲另类色图| 最新天堂中文在线| 成人在线观看www| 黄色网页免费在线观看| 中文字幕无码不卡免费视频| 麻豆一区二区三区视频| 午夜av中文字幕| 2018日日夜夜| 男女污污的视频| 免费在线精品视频| wwwxxx黄色片| www.日本久久| 国产91在线视频观看| 亚洲视频在线观看一区二区三区| 波多野结衣国产精品| www.xxx麻豆| www.夜夜爽| 男人天堂av片| 狠狠干狠狠操视频| 日韩a级在线观看| 玖玖爱视频在线| 少妇人妻无码专区视频| 尤物国产在线观看| 黄色免费福利视频| 国产福利精品一区二区三区| 大地资源网在线观看免费官网| 日本一本二本在线观看| 精品一区二区三区毛片| 手机视频在线观看| 国产精品久久中文字幕| 91亚洲一区二区| 人妻无码视频一区二区三区 | 欧美日韩激情四射| 一级做a免费视频| 农村妇女精品一二区| 国产精品国三级国产av| 中文字幕第17页| 五月天激情视频在线观看| 欧美老熟妇喷水| 欧美这里只有精品| 国产又粗又长又爽视频| 毛片毛片毛片毛片毛| 另类小说第一页| 无人在线观看的免费高清视频| 日韩欧美不卡在线| 全黄性性激高免费视频| 91丝袜超薄交口足| 日韩精品aaa| 最新av在线免费观看| 伊人五月天婷婷| 在线观看免费黄色片| 男同互操gay射视频在线看|