亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# MVC 微信支付教程系列之公眾號支付代碼

2020-01-24 00:52:48
字體:
來源:轉載
供稿:網友

今天,我們接著講微信支付的系列教程,前面,我們講了這個微信紅包和掃碼支付。現在,我們講講這個公眾號支付。公眾號支付的應用環境常見的用戶通過公眾號,然后再通過公眾號里面的菜單鏈接,進入公眾號的商城,然后在里面完成購買和支付功能,我們可以看看官方對這個公眾號支付的場景的解釋,鏈接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1,通過這個官方的解釋,那我們大概清楚這個公眾號的用途了,下面,我就說說,做這個公眾號支付的準備工作有哪些了。

 1、下載微信web開發者工具,工具的使用方式,也看鏈接,地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140&token=&lang=zh_CN

  2、配置“微信支付”環境,如下圖:

3、授權獲取用戶信息,如下圖:

 下面開始,一步一步往下走。

 一、我們先開發程序,首先,新建一個MVC工程(asp.net的話,官方給的demo就是asp.net的,可以下載來參考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1),名為:微信支付之公眾號支付,如下圖:

 

然后右鍵項目,我們修改一下屬性,如下圖:

 

然后我們再把程序自動生成的HomeController.cs和View里面的刪掉,再新建一個HomeController.cs和添加View,代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace Web.Controllers{ public class HomeController : Controller {  // GET: Home  public ActionResult Index()  {   return View();  } }} 

View代碼:

@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /> <title>Index</title></head><body> <div>  </div></body></html>

嗯,沒錯,目前還是空的,現在我們開始寫前臺,代碼如下(我先貼上代碼,后續再解釋為啥這么做,因為如果一步步的寫下去,按照前面兩個的篇幅來,我覺得都可以開課了,所以,我先上代碼,然后再一步步解釋。):

@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /> <title>電表充值服務</title> <link href="~/Scripts/jquery-easyui-1.4.5/themes/bootstrap/easyui.css" rel="stylesheet" /> <link href="~/Scripts/jquery-easyui-1.4.5/themes/mobile.css" rel="stylesheet" /> <link href="~/Scripts/jquery-easyui-1.4.5/themes/icon.css" rel="stylesheet" /> <style type="text/css">  body{   margin:0;   padding:0;  }  .logo {   width: 100%;   height: 70px;   background: url(/Images/EleLogo.png) 0 0 no-repeat;   background-size: 100% 100%;   padding: 0;   margin: 0;  }  .line {   width: 100%;   float: left;   height: auto;   text-align: center;   margin-top: 10px;  }  .lineText {   width: 100%;   float: left;   height: auto;   text-indent: 5%;   text-align: left;   font-size: x-large;   margin: 0;  }  .function {   height: 60pt;   line-height: 60pt;   width: 45%;   float: left;   border-radius: 10px;   background-color: #990000;   margin-left: 8pt;  }  .title {   font-family: "微軟雅黑";   font-size: x-large;   color: white;  }  a {   text-decoration: none;   color: white;  }  input {   vertical-align: central;  }  label {   vertical-align: central;  }  .lbBlock {   border: 1px solid #808080;   background-color: grey;   width: 90%;   margin-left: 5%;   font-size: x-large;   border-radius: 10px;   text-align: left;   text-indent: 10pt;   height: 30pt;   padding-top: 5pt;  }  .btn {   width: 90%;   height: 35pt;   font-size: x-large;   background-color: #990000;   color: white;   background: url(/Images/red.png) 0 0 repeat;   border: none;   border-radius: 10px;   margin: 10px 0 0 0;  }  .input {   height: 30pt;   width: 90%;   font-size: x-large;   border-radius: 10px;   margin: 0;   padding: 0;  } </style></head><body> <div class="logo"> </div> <form id="ChargeForm">    <div class="line">   <div class="lineText">    充值金額:   </div>  </div>  <div class="line">   <input type="number" id="ChargeVal" name="ChargeVal" class="input" placeholder="單位:元" />  </div>   </form> <div class="line">  <input type="button" class="btn" value="立即充值" onclick="fCharge()" style="margin-top: 20px;" /> </div> <div class="line">  <input type="button" id="btnHome" class="btn" value="返回主頁" onclick="fBackHome()" /> </div> <script src="~/Scripts/jquery-easyui-1.4.5/jquery.min.js"></script> <script src="~/Scripts/jquery-easyui-1.4.5/jquery.easyui.min.js"></script> <script src="~/Scripts/jquery-easyui-1.4.5/jquery.easyui.mobile.js"></script> <script src="~/Scripts/jquery-easyui-1.4.5/easyloader.js"></script> <script type="text/javascript">  $(function () {   var vCode = getQueryString("code");   if (vCode != "" && vCode != null) {    //alert(vCode);    $.ajax({     type: 'post',     data: {      code: vCode     },     url: '/Home/getWxInfo',     success: function (sjson) {      //alert(sjson);      //var vData = JSON.stringify(sjson);      //alert(vData);      $.messager.show({       title: '提示',       msg: '歡迎您來到微信端充值中心。'      });     }    })   }   else {    $.ajax({     type: 'post',     url: '/Home/getCode',     success: function (sjson) {      //alert(sjson);      location.href = sjson;     }    })   }  })  //獲取url的參數  function getQueryString(name) {   var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");   var r = window.location.search.substr(1).match(reg);   if (r != null) return unescape(r[2]); return null;  }  //初始化微信支付環境  function fCharge() {   if (typeof WeixinJSBridge == "undefined") {    if (document.addEventListener) {     document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);    } else if (document.attachEvent) {     document.attachEvent('WeixinJSBridgeReady', onBridgeReady);     document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);    }   } else {    fPostCharge();   }  }  //提交充值數據  function fPostCharge() {   var vChargeVal = $("#ChargeVal").val();   vChargeVal = parseFloat(vChargeVal);   if (vChargeVal > 0) {    $.messager.progress({     title: "",     msg: "正在調用微信支付接口,請稍后..."    });    $.ajax({     type: "post",     data: "totalfee=" + vChargeVal,     url: "/Home/MeterRecharge",     success: function (json) {      $.messager.progress('close');//記得關閉      //var json = eval("(" + msg + ")");//轉換后的JSON對象      onBridgeReady(json);     },     error: function () {      $.messager.progress('close');//記得關閉      $.messager.alert("提示", '調用微信支付模塊失敗,請稍后再試。', 'info')     }    })   }   else {    alert("房間名或者充值金額不可以為空或者為負數,請確認后再試.")   }  }  //調用微信支付模塊  function onBridgeReady(json) {   WeixinJSBridge.invoke(   'getBrandWCPayRequest', {    "appId": json.appId,  //公眾號名稱,由商戶傳入    "timeStamp": json.timeStamp,   //時間戳,自1970年以來的秒數    "nonceStr": json.nonceStr, //隨機串    "package": json.packageValue,    "signType": "MD5",   //微信簽名方式:    "paySign": json.paySign //微信簽名   },   function (res) {    if (res.err_msg == "get_brand_wcpay_request:ok") {     //alert("支付成功,請稍后查詢余額,如有疑問,請聯系管理員.");     fAlreadyPay();    }  // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回 ok,但并不保證它絕對可靠。   }   );  }  function fBackHome() {   location.href = "/";  } </script></body></html>

后臺代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using Web.Models;using WxPayAPI;namespace Web.Controllers{ public class HomeController : Controller {  JsApiPay jsApiPay = new JsApiPay();  // GET: Home  public ActionResult Index()  {   if (Session["openid"] == null)   {    try    {     //調用【網頁授權獲取用戶信息】接口獲取用戶的openid和access_token     GetOpenidAndAccessToken();    }    catch (Exception ex)    {     //Response.Write(ex.ToString());     //throw;    }   }   return View();  }  /**  *   * 網頁授權獲取用戶基本信息的全部過程  * 詳情請參看網頁授權獲取用戶基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html  * 第一步:利用url跳轉獲取code  * 第二步:利用code去獲取openid和access_token  *   */  public void GetOpenidAndAccessToken()  {   if (Session["code"] != null)   {    //獲取code碼,以獲取openid和access_token    string code = Session["code"].ToString();    Log.Debug(this.GetType().ToString(), "Get code : " + code);    jsApiPay.GetOpenidAndAccessTokenFromCode(code);   }   else   {    //構造網頁授權獲取code的URL    string host = Request.Url.Host;    string path = Request.Path;    string redirect_uri = HttpUtility.UrlEncode("http://" + host + path);    //string redirect_uri = HttpUtility.UrlEncode("http://gzh.lmx.ren");    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);    Session["url"] = url;       }  }  /// <summary>  /// 獲取code  /// </summary>  /// <returns></returns>  [HttpPost]  public ActionResult getCode()  {   object objResult = "";   if (Session["url"] != null)   {    objResult = Session["url"].ToString();   }   else   {    objResult = "url為空。";   }   return Json(objResult);  }  /// <summary>  /// 通過code換取網頁授權access_token和openid的返回數據  /// </summary>  /// <returns></returns>  [HttpPost]  public ActionResult getWxInfo()  {   object objResult = "";   string strCode = Request.Form["code"];   if (Session["access_token"] == null || Session["openid"] == null)   {    jsApiPay.GetOpenidAndAccessTokenFromCode(strCode);   }   string strAccess_Token = Session["access_token"].ToString();   string strOpenid = Session["openid"].ToString();   objResult = new { openid = strOpenid, access_token = strAccess_Token };   return Json(objResult);  }  /// <summary>  /// 充值  /// </summary>  /// <returns></returns>  [HttpPost]  public ActionResult MeterRecharge()  {   object objResult = "";   string strTotal_fee = Request.Form["totalfee"];   string strFee = (double.Parse(strTotal_fee) * 100).ToString();   //若傳遞了相關參數,則調統一下單接口,獲得后續相關接口的入口參數   jsApiPay.openid = Session["openid"].ToString();   jsApiPay.total_fee = int.Parse(strFee);   //JSAPI支付預處理   try   {    string strBody = "南宮蕭塵微信支付";//商品描述    WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(strBody);    WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//獲取H5調起JS API參數,注意,這里引用了官方的demo的方法,由于原方法是返回string的,所以,要對原方法改為下面的代碼,代碼在下一段    ModelForOrder aOrder = new ModelForOrder()    {     appId = wxJsApiParam.GetValue("appId").ToString(),     nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(),     packageValue = wxJsApiParam.GetValue("package").ToString(),     paySign = wxJsApiParam.GetValue("paySign").ToString(),     timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(),     msg = "成功下單,正在接入微信支付."    };    objResult = aOrder;   }   catch (Exception ex)   {    ModelForOrder aOrder = new ModelForOrder()    {     appId = "",     nonceStr = "",     packageValue = "",     paySign = "",     timeStamp = "",     msg = "下單失敗,請重試,多次失敗,請聯系管理員."    };    objResult = aOrder;   }   return Json(objResult);  } }} 

這里就是上面修改了的代碼,童鞋們請注意

  /**  *   * 從統一下單成功返回的數據中獲取微信瀏覽器調起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 WxPayData 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 jsApiParam;  }

ModelForOrder類的代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Web.Models{ public class ModelForOrder {  public string appId { get; set; }  public string timeStamp { get; set; }  public string nonceStr { get; set; }  public string packageValue { get; set; }  public string paySign { get; set; }  public string msg { get; set; } }} 

還有一個地方需要注意,修改一下的就是這里WxLib/business/JsApiPay.cs,如下圖:

最后,把程序發布出來,這次咱們把Web發布在http://gzh.lmx.ren上 ,然后再把接口權限,改為這樣的,如下圖:

 

注意,這里面的域名和上面我們發布的域名要一致。 

除此以外,我們還需要改這里:

就是一定要授權這里,否則,支付的時候,會提示其他錯誤,具體,我就不測試了。

另外,這里其實已經完成了這個公眾號的支付的流程了,但是,我們頁面上,會友善的提醒(其實不友善,提示是紅色的,在頭部,提示別輸入密碼什么),這是因為,我們還沒把咱們這個http://gzh.lmx.ren域名設置為安全域名,設置之后,就不會在提示了。設置方法如下圖:

在這里面加入咱們的域名,就完美了。。。

 我的代碼都盡量精簡,多余的,我都會丟掉,就是為了避免混淆視聽。如果代碼里面,有寫的不清楚的,可以私信問我,或群里來問我,群號在文章末端。

 現在,我開始一一解釋我上面的做法。

首先,在后端,頁面加載的時候,他會先執行

public ActionResult Index()  {   if (Session["openid"] == null)   {    try    {     //調用【網頁授權獲取用戶信息】接口獲取用戶的openid和access_token     GetOpenidAndAccessToken();    }    catch (Exception ex)    {     //Response.Write(ex.ToString());     //throw;    }   }   return View();  } 

 這里面就是為了獲取用戶的Openid和Access_token,這個用途很大,還有就是,我們通過代碼可以知道,我們通過這個方法,可以獲取到微信的一些相關信息,獲取完了之后,他會返回到我們的頁面上來,url就存在一個session里面,如下:

 Session["url"] = url;       

接著,在前端:

當頁面加載完畢之后,會執行以下JS方法,如下:

 

 $(function () {   var vCode = getQueryString("code");   if (vCode != "" && vCode != null) {    //alert(vCode);    $.ajax({     type: 'post',     data: {      code: vCode     },     url: '/Home/getWxInfo',     success: function (sjson) {      //alert(sjson);      //var vData = JSON.stringify(sjson);      //alert(vData);      $.messager.show({       title: '提示',       msg: '歡迎您來到微信端充值中心。'      });     }    })   }   else {    $.ajax({     type: 'post',     url: '/Home/getCode',     success: function (sjson) {      //alert(sjson);      location.href = sjson;     }    })   }  }) 

他會先獲取瀏覽器的url,然后獲取code,就是一般url后面的xxx.com?code=xxx,這里面就是首先判斷有無code,如果沒有code,則,我們去后臺請求這個code。為什么請求這個code呢?我們來看這個方法: getWxInfo,如下圖:

/// <summary>  /// 獲取code  /// </summary>  /// <returns></returns>  [HttpPost]  public ActionResult getCode()  {   object objResult = "";   if (Session["url"] != null)   {    objResult = Session["url"].ToString();   }   else   {    objResult = "url為空。";   }   return Json(objResult);  } 

他就會返回url到前端,前端通過js去訪問那個網址,那個網址就是微信端獲取到我們的信息之后,給我們按照規則再返回一個url,這rul就是我們后面需要后去的code的url。這個code對我們至關重要,因為后面我們要做跟支付有關的工作,都用到的。有了code,我們才能拿到openid和access_token。具體看代碼邏輯也可以明了。

好,走到這一步,我們已經知道openid和access_token了,這個時候,我們就負責處理前端的東西。

前端,我就一個金額輸入框,然后一個提交,實際應用中,我們肯定還需要傳入商品的參數,我這里面就不寫那些多余的了,后續你們自己加進去就可以了。這里面在點擊提交的時候,會調用微信的環境,看下面的代碼:

 //初始化微信支付環境  function fCharge() {   if (typeof WeixinJSBridge == "undefined") {    if (document.addEventListener) {     document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);    } else if (document.attachEvent) {     document.attachEvent('WeixinJSBridgeReady', onBridgeReady);     document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);    }   } else {    fPostCharge();   }  } 

他會初始化一下環境,如果初始化成功,代表,這個頁面是在微信客戶端里面運行的,那么我們就給他運行我們真正的充值代碼提交,所以,就會執行:fPostCharge();

提交之后,就會進入后臺,后臺需要組織我們前臺需要用到的參數,其中包括如下:

/// <summary>  /// 充值  /// </summary>  /// <returns></returns>  [HttpPost]  public ActionResult MeterRecharge()  {   object objResult = "";   string strTotal_fee = Request.Form["totalfee"];   string strFee = (double.Parse(strTotal_fee) * 100).ToString();   //若傳遞了相關參數,則調統一下單接口,獲得后續相關接口的入口參數   jsApiPay.openid = Session["openid"].ToString();   jsApiPay.total_fee = int.Parse(strFee);   //JSAPI支付預處理   try   {    string strBody = "南宮蕭塵微信支付";//商品描述    WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(strBody);    WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//獲取H5調起JS API參數    ModelForOrder aOrder = new ModelForOrder()    {     appId = wxJsApiParam.GetValue("appId").ToString(),     nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(),     packageValue = wxJsApiParam.GetValue("package").ToString(),     paySign = wxJsApiParam.GetValue("paySign").ToString(),     timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(),     msg = "成功下單,正在接入微信支付."    };    objResult = aOrder;   }   catch (Exception ex)   {    ModelForOrder aOrder = new ModelForOrder()    {     appId = "",     nonceStr = "",     packageValue = "",     paySign = "",     timeStamp = "",     msg = "下單失敗,請重試,多次失敗,請聯系管理員."    };    objResult = aOrder;   }   return Json(objResult);  } 

我們主要需要提供的就是這個類ModelForOrder 里面的參數,然后再把這些參數返回給前臺調用,如下:

 //調用微信支付模塊  function onBridgeReady(json) {   WeixinJSBridge.invoke(   'getBrandWCPayRequest', {    "appId": json.appId,  //公眾號名稱,由商戶傳入    "timeStamp": json.timeStamp,   //時間戳,自1970年以來的秒數    "nonceStr": json.nonceStr, //隨機串    "package": json.packageValue,    "signType": "MD5",   //微信簽名方式:    "paySign": json.paySign //微信簽名   },   function (res) {    if (res.err_msg == "get_brand_wcpay_request:ok") {     //alert("支付成功,請稍后查詢余額,如有疑問,請聯系管理員.");     fAlreadyPay();    }  // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回 ok,但并不保證它絕對可靠。   }   );  } 

這樣,他就會彈出一個微信支付的窗口,如下:

 

然后我們確認付款之后,是否付款成功,如果付款成功,我們在執行: fAlreadyPay();

這個方法已經被我刪掉了,用途是用于,我們收到用戶的款之后,我們需要同步一些數據到我們的數據庫里面去,所以,該怎么操作,自己自行修改了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线观看视频国产| 欧美三级免费观看| 国产999精品| 国产免费一区二区三区在线观看| 亚洲大胆人体av| 日韩国产高清视频在线| 国产精品青青在线观看爽香蕉| 久久精品视频在线| 91国内产香蕉| 亚洲精品电影在线观看| 日韩成人激情视频| 欧美成人免费在线视频| 国产精品成熟老女人| 亚洲图片在线综合| 国产91精品视频在线观看| 日韩欧美国产中文字幕| 欧美久久久精品| 大量国产精品视频| 久久九九精品99国产精品| 91在线高清视频| 国产三级精品网站| 一区国产精品视频| 国产精品美女久久久免费| 欧美黑人视频一区| 日韩av在线网| 亚洲自拍偷拍福利| 国产成人精品免费久久久久| 欧美成人精品一区| 91免费国产网站| 欧美日韩成人在线视频| 九九久久精品一区| 久久韩剧网电视剧| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲free性xxxx护士白浆| 精品亚洲国产成av人片传媒| 国产视频丨精品|在线观看| 欧美在线视频免费播放| 亚洲影院色无极综合| 成人国内精品久久久久一区| 日韩在线欧美在线国产在线| 成人午夜在线视频一区| 中文字幕成人精品久久不卡| 久久男人的天堂| 亚洲香蕉成人av网站在线观看| 91免费在线视频| 视频直播国产精品| 国产精品视频精品| 高清日韩电视剧大全免费播放在线观看| 久久影院中文字幕| 亚洲精品一区在线观看香蕉| 欧美精品999| 欧美精品成人91久久久久久久| 国产视频自拍一区| 成人激情视频在线| 美日韩精品免费视频| 亚洲a∨日韩av高清在线观看| 亚洲人午夜色婷婷| 裸体女人亚洲精品一区| 人九九综合九九宗合| 精品国产一区二区在线| 亚洲人成伊人成综合网久久久| 亚洲色图15p| 国产精品www| 国产精品久久网| 精品久久久久久久中文字幕| 少妇高潮久久久久久潘金莲| 精品毛片三在线观看| 97国产成人精品视频| 久色乳综合思思在线视频| 91精品国产高清久久久久久久久| 日韩国产精品视频| 伦伦影院午夜日韩欧美限制| 国产精品高潮视频| 久久资源免费视频| 国产精品视频网| 欧美激情亚洲国产| 成人国内精品久久久久一区| 欧洲成人性视频| 久久成人亚洲精品| 亚洲色图50p| 日韩精品免费看| 欧美精品在线视频观看| 欧美成人全部免费| 51ⅴ精品国产91久久久久久| www.日韩欧美| 欧美日韩久久久久| 日韩乱码在线视频| 亚洲第一中文字幕| 亚洲毛茸茸少妇高潮呻吟| 欧美成人精品一区二区三区| 国产亚洲aⅴaaaaaa毛片| 97香蕉久久超级碰碰高清版| 国产精品免费视频xxxx| 国产精品av在线播放| 日韩免费视频在线观看| 国产精品中文久久久久久久| 亚洲乱亚洲乱妇无码| 亚洲精品成人久久| 日本成人在线视频网址| 亚洲一区二区三区在线免费观看| 国产精品久久久久秋霞鲁丝| 亚洲欧美日韩精品| 久久久天堂国产精品女人| 国产精品自产拍在线观| 国产91色在线免费| 成人欧美一区二区三区黑人| 日韩av在线影院| 97精品国产aⅴ7777| 国产一区二区三区视频在线观看| 久热精品视频在线免费观看| 亚洲第一区在线| 91产国在线观看动作片喷水| 岛国av一区二区在线在线观看| 一区二区国产精品视频| 亚洲成人亚洲激情| 国产精品手机播放| 狠狠综合久久av一区二区小说| 国产精品成人av在线| 超碰日本道色综合久久综合| 欧美亚洲午夜视频在线观看| 久久久精品国产网站| 亚洲精品国产综合区久久久久久久| 欧美香蕉大胸在线视频观看| 欧美精品videosex极品1| 日韩成人激情在线| 欧美猛交ⅹxxx乱大交视频| 亚洲性夜色噜噜噜7777| 日韩精品免费在线观看| 国产成人极品视频| 亚洲精品国精品久久99热| 久久99精品久久久久久噜噜| 久久中文字幕视频| 国产有码在线一区二区视频| 欧美精品在线第一页| 久久五月天综合| 成人免费网站在线| 色午夜这里只有精品| 国产国语刺激对白av不卡| 久久精品视频亚洲| 欧美巨乳在线观看| 久久电影一区二区| 久久精品视频在线| 国产精品国产三级国产专播精品人| 久久6精品影院| 欧美乱大交xxxxx| 欧美色道久久88综合亚洲精品| 66m—66摸成人免费视频| 日韩中文av在线| 在线观看日韩av| 国产成+人+综合+亚洲欧洲| 97成人精品区在线播放| 久久手机精品视频| 97在线精品国自产拍中文| 欧美国产日韩二区| 国产亚洲视频中文字幕视频| 韩日精品中文字幕| 欧美成人合集magnet| 中文字幕免费精品一区| 国产精品久久av| 日韩美女免费线视频| 国产精品视频yy9099| 久久在精品线影院精品国产| 在线日韩中文字幕| 国产精品69久久久久|