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

首頁 > 開發 > Java > 正文

java實現網站微信掃碼支付

2024-07-14 08:41:38
字體:
來源:轉載
供稿:網友

一、網站微信掃碼支付開發并沒有現成的java示例,總結一下自己微信掃碼支付心得

二、首先去微信公眾平臺申請賬戶 

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

三、賬戶開通、開發者認證之后就可以進行微信支付開發了 

1、微信統一下單接口調用獲取預支付id,以及生成二維碼所需的codeUrl

/** * 保存訂單,并生成二維碼所需的codeUrl *  * @param request * @param response * @param notifyURLBuf * @param order * @return * @throws Exception */ @Override public Map<String, String> getWechatOrderInfo(String ip, Cuser user, String notifyUrl, Order order) throws Exception { Map<String, String> resultMap = new HashMap<String, String>(); // 生成并保存訂單 order.setUserId(user.getId()); // 支付方式 0:銀聯 1:支付寶 2:網上銀行 3:微信 4:其他 order.setPayType("3"); // 生成訂單號 order.setOrderNo(OrderNoGenerator.getOrderNo()); // 訂單類型 1:消費 2:退款 order.setOrderType("1"); // 訂單創建時間 order.setCreateTime(new Date()); // 訂單更新時間 order.setUpdateTime(new Date()); // 訂單狀態 0: 交易中 1:完成 2:已取消 order.setOrderStatus("0"); // 付款狀態 0:失敗 1:成功 2、待付款 order.setPayStatus("2"); // 設置訂單失效時間 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.HOUR, 2); order.setExpireTime(calendar.getTime()); Integer orderId = this.balanceDao.saveOrder(order); Map<String, String> payPreIdMap = new HashMap<>(); payPreIdMap = WechatUtil.getPayPreId(String.valueOf(orderId), "體檢報告", notifyUrl, ip,  String.valueOf((order.getMoney().multiply(new BigDecimal(100)).intValue())), orderId.toString()); String prePayId = payPreIdMap.get("prepay_id"); // 更新 order.setId(orderId); order.setPrepayId(prePayId); order.setCodeUrl(payPreIdMap.get("code_url")); this.balanceDao.updateOrder(order); // return WechatUtil.QRfromGoogle(order.getCodeUrl(), 300, 0); resultMap.put("codeUrl", order.getCodeUrl()); resultMap.put("orderId", String.valueOf(order.getId())); return resultMap; }

此方法返回的數據如下

<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wxaf0b*****8afbf]]></appid><mch_id><![CDATA[1408****02]]></mch_id><nonce_str><![CDATA[zf0vGvdtVycBliwB]]></nonce_str><sign><![CDATA[A2910F16086211153D747058063B3368]]></sign><result_code><![CDATA[SUCCESS]]></result_code><prepay_id><![CDATA[wx201701191109388037e9a12310276591827]]></prepay_id><trade_type><![CDATA[NATIVE]]></trade_type><code_url><![CDATA[weixin://wxpay/bizpayurl?pr=1UjorNX]]></code_url></xml>

2、服務器端接受微信支付結果通知

/**  * 保存微信通知結果  *   * @param request  * @param response  * @return  * @throws Exception  */ @Override public String saveWechatNotify(String notifyInfoXml) throws Exception {  Map<String, String> noticeMap = XMLUtil.doXMLParse(notifyInfoXml);  // 這個其實是訂單 的id  String outTradeNo = noticeMap.get("out_trade_no");  Order order = this.balanceDao.getOrderById(Integer.valueOf(outTradeNo));  // 如果支付通知信息不為,說明請求已經處理過,直接返回  if (StringUtil.isNotEmpty(order.getNotifyInfo())) {   return "SUCCESS";  }  String sign = noticeMap.get("sign");  noticeMap.remove("sign");  // 驗簽通過  if (WechatUtil.getSignVeryfy(noticeMap, sign)) {   // 通信成功此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷   if ("SUCCESS".equals(noticeMap.get("return_code"))) {    // 交易成功    if ("SUCCESS".equals(noticeMap.get("result_code"))) {     // 商戶訂單號     // 訂單更新時間     order.setUpdateTime(new Date());     // ------------------------------     // 處理業務開始     // ------------------------------     // 是否交易成功,1:成功0:失敗     // 微信支付成功     order.setPayStatus("1");     // 訂單狀態 0: 交易中 1:完成 2:已取消     order.setOrderStatus("1");     // 保存通知信息     order.setNotifyInfo(notifyInfoXml);     this.balanceDao.updateOrder(order);     // 處理業務完畢    } else {     // 錯誤時,返回結果未簽名,記錄retcode、retmsg看失敗詳情。     logger.info("查詢驗證簽名失敗或業務錯誤");     logger.info("retcode:" + noticeMap.get("retcode") + " retmsg:" + noticeMap.get("retmsg"));    }    return "SUCCESS";   } else {    logger.info("后臺調用通信失敗");   }   return "SUCCESS";  } else {   logger.info("通知簽名驗證失敗");  }  return null; }

3、上面代碼用到的工具方法都在WechatUtil.java工具類中

package com.caifu.tencent.common;import java.io.IOException;import java.net.URISyntaxException;import java.net.URLEncoder;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Random;import org.apache.commons.httpclient.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.utils.URIBuilder;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.jdom2.JDOMException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.caifu.login.utils.XMLUtil;public class WechatUtil { private static Logger logger = LoggerFactory.getLogger(WechatUtil.class); public static final String TAG = "Wechat.Util"; private static final int timeout = 5000; public static byte[] httpPost(String url, String entity) throws URISyntaxException, IOException {  if (url == null || url.length() == 0) {   logger.info(TAG, "httpPost, url is null");   return null;  }  CloseableHttpClient httpClient = HttpClients.createDefault();  URIBuilder uriBuilder = new URIBuilder(url);  HttpPost httpPost = new HttpPost(uriBuilder.build());  RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout).setConnectionRequestTimeout(timeout).setConnectTimeout(timeout).build();  httpPost.setConfig(requestConfig);  // 避免漢字亂碼導致請求失敗,  httpPost.setEntity(new StringEntity(entity, "UTF-8"));  CloseableHttpResponse resp = null;  try {   resp = httpClient.execute(httpPost);   if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {    logger.info(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());    return null;   }   return EntityUtils.toByteArray(resp.getEntity());  } catch (Exception e) {   logger.info(TAG, "httpPost exception, e = " + e.getMessage());   e.printStackTrace();   return null;  } finally {   if (httpClient != null) {    httpClient.close();   }   if (resp != null) {    resp.close();   }  } } /**  * 把數組所有元素排序,并按照“參數=參數值”的模式用“&”字符拼接成字符串  *   * @param params  *   需要排序并參與字符拼接的參數組  * @return 拼接后字符串  */ public static String createLinkString(Map<String, String> params) {  List<String> keys = new ArrayList<String>(params.keySet());  Collections.sort(keys);  String prestr = "";  for (int i = 0; i < keys.size(); i++) {   String key = keys.get(i);   String value = params.get(key);   if (i == keys.size() - 1) {// 拼接時,不包括最后一個&字符    prestr = prestr + key + "=" + value;   } else {    prestr = prestr + key + "=" + value + "&";   }  }  return prestr; } /**  * 根據反饋回來的信息,生成簽名結果  *   * @param Params  *   通知返回來的參數數組  * @param sign  *   比對的簽名結果  * @return 生成的簽名結果  */ public static boolean getSignVeryfy(Map<String, String> Params, String sign) {  // 過濾空值、sign與sign_type參數  // Map<String, String> sParaNew = AlipayCore.paraFilter(Params);  // 獲取待簽名字符串  String preSignStr = createLinkString(Params);  preSignStr += "&key=" + Configure.getKey();  // 獲得簽名驗證結果  String resultSign = MD5.MD5Encode(preSignStr).toUpperCase();  // String resultSign = MD5Util.MD5Encode(preSignStr.toString(),  // "UTF-8").toLowerCase();  if (sign.equals(resultSign)) {   return true;  } else {   return false;  } } /**  * 裝配xml,生成請求prePayId所需參數  *   * @param params  * @return  */ public static String toXml(List<NameValuePair> params) {  StringBuilder sb = new StringBuilder();  sb.append("<xml>");  for (int i = 0; i < params.size(); i++) {   sb.append("<" + params.get(i).getName() + ">");   sb.append(params.get(i).getValue());   sb.append("</" + params.get(i).getName() + ">");  }  sb.append("</xml>");  return sb.toString(); } /**  * 生成簽名  */ public static String genPackageSign(List<NameValuePair> params) {  StringBuilder sb = new StringBuilder();  for (int i = 0; i < params.size(); i++) {   sb.append(params.get(i).getName());   sb.append('=');   sb.append(params.get(i).getValue());   sb.append('&');  }  sb.append("key=");  sb.append(Configure.getKey());  String packageSign = MD5.MD5Encode(sb.toString());  return packageSign; } /**  *   * @param goodOrderNo  * @param body  * @param noticeUrl  * @param ip  * @param totalFee  * @return  */ public static String genProductArgs(String goodOrderNo, String body, String noticeUrl, String ip, String totalFee, String productId) {  StringBuffer xml = new StringBuffer();  try {   String nonceStr = getNonceStr();   xml.append("</xml>");   List<NameValuePair> packageParams = new LinkedList<NameValuePair>();   packageParams.add(new BasicNameValuePair("appid", Configure.getAppid()));   packageParams.add(new BasicNameValuePair("body", body));   packageParams.add(new BasicNameValuePair("mch_id", Configure.getMchid()));   packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));   packageParams.add(new BasicNameValuePair("notify_url", noticeUrl));   packageParams.add(new BasicNameValuePair("out_trade_no", goodOrderNo));   packageParams.add(new BasicNameValuePair("product_id", productId));   packageParams.add(new BasicNameValuePair("spbill_create_ip", ip));   packageParams.add(new BasicNameValuePair("total_fee", totalFee));   packageParams.add(new BasicNameValuePair("trade_type", "NATIVE"));   String sign = genPackageSign(packageParams);   packageParams.add(new BasicNameValuePair("sign", sign));   String xmlstring = toXml(packageParams);   return xmlstring;  } catch (Exception e) {   logger.info("genProductArgs fail, ex = " + e.getMessage());   return null;  } } /**  * 生成支付簽名  *   * @param params  * @return  */ public static String genAppSign(List<NameValuePair> params) {  StringBuilder sb = new StringBuilder();  for (int i = 0; i < params.size(); i++) {   sb.append(params.get(i).getName());   sb.append('=');   sb.append(params.get(i).getValue());   sb.append('&');  }  sb.append("key=");  sb.append(Configure.getKey());  String appSign = MD5.MD5Encode(sb.toString()).toUpperCase();  logger.info("orion", appSign);  return appSign; } /**  * 生成調用微信支付所需參數  *   * @param prepayId  * @return  */ public static Map<String, String> genPayReq(String prepayId) {  Map<String, String> resultMap = new HashMap<String, String>();  String timeStamp = getTimeStamp();  String nonceStr = getNonceStr();  List<NameValuePair> signParams = new LinkedList<NameValuePair>();  signParams.add(new BasicNameValuePair("appid", Configure.getAppid()));  signParams.add(new BasicNameValuePair("noncestr", nonceStr));  signParams.add(new BasicNameValuePair("package", "Sign=WXPay"));  signParams.add(new BasicNameValuePair("partnerid", Configure.getMchid()));  signParams.add(new BasicNameValuePair("prepayid", prepayId));  signParams.add(new BasicNameValuePair("timestamp", timeStamp));  String sign = genAppSign(signParams);  resultMap.put("appid", Configure.getAppid());  resultMap.put("noncestr", nonceStr);  resultMap.put("packageValue", "Sign=WXPay");  resultMap.put("partnerid", Configure.getMchid());  resultMap.put("prepayid", prepayId);  resultMap.put("timestamp", timeStamp);  resultMap.put("sign", sign);  return resultMap; } /**  * 微信支付生成預支付訂單  *   * @throws IOException  * @throws JDOMException  */ public static Map<String, String> getPayPreId(String goodOrderNo, String body, String noticeUrl, String ip, String totalFee, String productId) throws Exception {  String paramsXml = genProductArgs(goodOrderNo, body, noticeUrl, ip, totalFee, productId);  logger.info("orion", paramsXml);  byte[] buf = WechatUtil.httpPost(Configure.UNIFIEDORDER_API, paramsXml);  String contentXml = new String(buf);  Map<String, String> resultMap = XMLUtil.doXMLParse(contentXml);  return resultMap; } public static String getNonceStr() {  Random random = new Random();  return MD5.MD5Encode(String.valueOf(random.nextInt(10000))); } public static String getTimeStamp() {  return String.valueOf(System.currentTimeMillis() / 1000); } /**  * 生成支付二維碼  * @param request  * @param response  * @param width  * @param height  * @param text 微信生成預定id時,返回的codeUrl  */ public static void getQRcode(HttpServletRequest request, HttpServletResponse response, Integer width, Integer height, String text) {  if (width == null) {   width = 300;  }  if (height == null) {   height = 300;  }  String format = "jpg";  Hashtable hints = new Hashtable();  hints.put(EncodeHintType.CHARACTER_SET, "utf-8");  BitMatrix bitMatrix;  try {   bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);   MatrixToImageWriter.writeToStream(bitMatrix, format, response.getOutputStream());  } catch (WriterException e) {   e.printStackTrace();  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } }}

生成二維碼需要兩jar

<!-- google zxing 二維碼jar begin -->  <dependency>   <groupId>com.google.zxing</groupId>   <artifactId>core</artifactId>   <version>3.3.0</version>  </dependency>  <dependency>   <groupId>com.google.zxing</groupId>   <artifactId>javase</artifactId>   <version>3.3.0</version>  </dependency><!-- google zxing 二維碼jar begin -->

4、下面是用到的配置類

package com.caifu.tencent.common;/** * User: rizenguo * Date: 2014/10/29 * Time: 14:40 * 這里放置各種配置數據 */public class Configure {//這個就是自己要保管好的私有Key了(切記只能放在自己的后臺代碼里,不能放在任何可能被看到源代碼的客戶端程序中) // 每次自己Post數據給API的時候都要用這個key來對所有字段進行簽名,生成的簽名會放在Sign這個字段,API收到Post數據的時候也會用同樣的簽名算法對Post過來的數據進行簽名和驗證 // 收到API的返回的時候也要用這個key來對返回的數據算下簽名,跟API的Sign數據進行比較,如果值不一致,有可能數據被第三方給篡改 private static String key = "A6gB0Dy4dsfdssuPCPsdfdshkSCDQcr3eXS"; private static String appSecret="7584sdfdsfe4f26fadsfsdfs56f10728a"; //微信分配的公眾號ID(開通公眾號之后可以獲取到) private static String appID = "wxaf0b86sdfsdf8afbf"; //微信支付分配的商戶號ID(開通公眾號的微信支付功能之后可以獲取到) private static String mchID = "14012313702"; //受理模式下給子商戶分配的子商戶號 private static String subMchID = ""; //HTTPS證書的本地路徑 private static String certLocalPath = ""; //HTTPS證書密碼,默認密碼等于商戶號MCHID private static String certPassword = ""; //是否使用異步線程的方式來上報API測速,默認為異步模式 private static boolean useThreadToDoReport = true; //機器IP private static String ip = ""; //以下是幾個API的路徑: //1)被掃支付API public static String UNIFIEDORDER_API = "https://api.mch.weixin.qq.com/pay/unifiedorder"; public static String PAY_API = "https://api.mch.weixin.qq.com/pay/micropay"; //2)被掃支付查詢API public static String PAY_QUERY_API = "https://api.mch.weixin.qq.d/pay/orderquery"; //3)退款API public static String REFUND_API = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //4)退款查詢API public static String REFUND_QUERY_API = "https://api.mch.weixin.qq.com/pay/refundquery"; //5)撤銷API public static String REVERSE_API = "https://api.mch.weixin.qq.com/secapi/pay/reverse"; //6)下載對賬單API public static String DOWNLOAD_BILL_API = "https://api.mch.weixin.qq.com/pay/downloadbill"; //7) 統計上報API public static String REPORT_API = "https://api.mch.weixin.qq.com/payitil/report"; public static boolean isUseThreadToDoReport() {  return useThreadToDoReport; } public static void setUseThreadToDoReport(boolean useThreadToDoReport) {  Configure.useThreadToDoReport = useThreadToDoReport; } public static String HttpsRequestClassName = "com.tencent.common.HttpsRequest"; public static void setKey(String key) {  Configure.key = key; } public static void setAppID(String appID) {  Configure.appID = appID; } public static void setMchID(String mchID) {  Configure.mchID = mchID; } public static void setSubMchID(String subMchID) {  Configure.subMchID = subMchID; } public static void setCertLocalPath(String certLocalPath) {  Configure.certLocalPath = certLocalPath; } public static void setCertPassword(String certPassword) {  Configure.certPassword = certPassword; } public static void setIp(String ip) {  Configure.ip = ip; } public static String getKey(){  return key; } public static String getAppid(){  return appID; } public static String getMchid(){  return mchID; } public static String getSubMchid(){  return subMchID; } public static String getCertLocalPath(){  return certLocalPath; } public static String getCertPassword(){  return certPassword; } public static String getIP(){  return ip; } public static void setHttpsRequestClassName(String name){  HttpsRequestClassName = name; }}

在這里需要注意的配置 
private static String key = “A6gB0Dy4dsfdssuPCPsdfdshkSCDQcr3eXS”; 
這里的key 是登陸https://pay.weixin.qq.com/index.php/core/info (微信商戶平臺)設置的api_key

5、xml 解析工具類

package com.caifu.login.utils;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.dom4j.io.SAXReader;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.JDOMException;import org.jdom2.input.SAXBuilder;/** * xml工具類 *  * @author miklchen * */public class XMLUtil { /**  * 解析xml,返回第一級元素鍵值對。如果第一級元素有子節點,則此節點的值是子節點的xml數據。  *   * @param strxml  * @return  * @throws JDOMException  * @throws IOException  */ public static Map doXMLParse(String strxml) throws JDOMException, IOException {  strxml = strxml.replaceFirst("encoding=/".*/"", "encoding=/"UTF-8/"");  if (null == strxml || "".equals(strxml)) {   return null;  }  Map m = new HashMap();  InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));  SAXBuilder builder = new SAXBuilder();  Document doc = builder.build(in);  Element root = doc.getRootElement();  List list = root.getChildren();  Iterator it = list.iterator();  while (it.hasNext()) {   Element e = (Element) it.next();   String k = e.getName();   String v = "";   List children = e.getChildren();   if (children.isEmpty()) {    v = e.getTextNormalize();   } else {    v = XMLUtil.getChildrenText(children);   }   m.put(k, v);  }  // 關閉流  in.close();  return m; } /**  * 獲取子結點的xml  *   * @param children  * @return String  */ public static String getChildrenText(List children) {  StringBuffer sb = new StringBuffer();  if (!children.isEmpty()) {   Iterator it = children.iterator();   while (it.hasNext()) {    Element e = (Element) it.next();    String name = e.getName();    String value = e.getTextNormalize();    List list = e.getChildren();    sb.append("<" + name + ">");    if (!list.isEmpty()) {     sb.append(XMLUtil.getChildrenText(list));    }    sb.append(value);    sb.append("</" + name + ">");   }  }  return sb.toString(); } /**  * 將requestxml通知結果轉出啊成map  * @param request  * @return  * @throws Exception  */ public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {  // 解析結果存儲在HashMap  Map<String, String> map = new HashMap<String, String>();  InputStream inputStream = request.getInputStream();  // 讀取輸入流  SAXReader reader = new SAXReader();  org.dom4j.Document document = reader.read(inputStream);  // 得到xml根元素  org.dom4j.Element root = document.getRootElement();  // 得到根元素的所有子節點  List<org.dom4j.Element> elementList = root.elements();  // 遍歷所有子節點  for (org.dom4j.Element e : elementList)   map.put(e.getName(), e.getText());  // 釋放資源  inputStream.close();  inputStream = null;  return map; }}

6、整個后臺服務已經完成,最后關閉頁面微信支付二維碼,告知用戶支付已經完成了

var f; /* 定時任務方法,異步請求去查詢訂單是否支付*/ function GetOrder() {  var orderId = $('#orderId').val();  if (orderId != '') {   $.ajax({    url : "${base}/balance/auth/isPay?orderId=" + orderId,    type : "GET",    async : false,    success : function(d) {     if (d == "1") {      //當獲取到微信支付結果時,關閉二維碼div      $(".weixinpay").css("display", "none");      $("#zhichutankuang").css("display", "block");      ////當獲取到微信支付結果時,關閉定時任務      clearInterval(f);      // layer.alert('付款成功', {      // skin : 'layui-layer-molv', // 樣式類名      // closeBtn : 0      // }, function() {      // location.href = "${base}/balance/auth/presentation?tjNo=" + $("#tjNo").val();      // });     }    }   });  } } //異步請求獲取生成二維碼的url $(".paylast").click(function() {  var $payType = $('input:radio:checked').val();  var $money = $("#money").val();  var $tjReportType = $("#tjReportType").val();  var $tjNo = $("#tjNo").val();  $.ajax({   url : "${base}/balance/auth/wechatInfo",   type : "POST",   async : false,   data : {    payType : $payType,    money : $money,    tjNo : $tjNo,    tjReportType : $tjReportType   },   success : function(d) {    if (d.resultCode == "1000") {     //當請求成功時,設置二維碼圖片地址     $("#codeImg").attr('src', d.obj);     $("#orderId").val(d.attributes.orderId);     ////當請求成功時,啟動定時任務,每隔3秒去后臺查詢一次訂單是否成功     f = setInterval(GetOrder, 3000);     // GetOrder(true);    }   }  });  $(".selpaycon").css("display", "none");  $(".weixinpay").css("display", "block"); });

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲女成人图区| 主播福利视频一区| 亚洲精品视频久久| 日韩av不卡在线| 亚洲性日韩精品一区二区| 亚洲摸下面视频| 欧美日韩激情视频8区| 欧美亚洲另类在线| 日韩一区二区三区在线播放| 亚洲精品女av网站| 奇米四色中文综合久久| 中文字幕视频一区二区在线有码| 欧美大片在线免费观看| 久久久久久69| 91精品久久久久久综合乱菊| 欧美精品激情在线观看| 亚洲精品720p| 国产一区视频在线| 91嫩草在线视频| 亚洲一区av在线播放| 精品久久中文字幕久久av| 国产精品久久久久久久久久东京| 日韩免费电影在线观看| 亚洲国产成人精品女人久久久| 久久久亚洲影院你懂的| 国产精品永久免费视频| 日韩av在线最新| 国产亚洲精品激情久久| 91国偷自产一区二区三区的观看方式| 国产成人综合一区二区三区| 国产成人精品一区二区三区| 欧美性受xxxx黑人猛交| 国产亚洲精品久久久久久牛牛| 日韩美女激情视频| 亚洲图片欧洲图片av| 精品久久久久久久久久久| 久久精品国产精品亚洲| 成人免费看吃奶视频网站| 91在线精品播放| 亚洲精品aⅴ中文字幕乱码| 国产香蕉精品视频一区二区三区| 色偷偷91综合久久噜噜| 国产日韩精品一区二区| 国内成人精品视频| 97久久久久久| 性色av一区二区三区红粉影视| 欧美午夜女人视频在线| 久久久视频免费观看| 亚洲精品suv精品一区二区| 欧美亚州一区二区三区| 亚洲在线www| 日本成人黄色片| 欧美亚洲国产日本| 精品国产乱码久久久久久虫虫漫画| 亚洲国产精品99| 136fldh精品导航福利| 国产精品h在线观看| 一区二区三欧美| 亚洲成人激情小说| 国模精品一区二区三区色天香| 欧美日产国产成人免费图片| 日韩综合中文字幕| 亚洲天堂免费观看| 国产玖玖精品视频| 亚洲天堂成人在线| 国产在线观看一区二区三区| 国产成人精品亚洲精品| 欧洲s码亚洲m码精品一区| 日韩电影中文 亚洲精品乱码| 国产日韩在线亚洲字幕中文| 欧美亚洲成人网| 欧美黑人极品猛少妇色xxxxx| 日韩一区二区三区国产| 黑人狂躁日本妞一区二区三区| 国内精品国产三级国产在线专| 国产一区二区三区直播精品电影| 日韩免费看的电影电视剧大全| 国产精品久久久久久久久粉嫩av| 久久人人爽亚洲精品天堂| 欧美黄色片视频| 日韩免费精品视频| 欧美日韩成人在线视频| 91sao在线观看国产| 亚洲最大中文字幕| 欧美日韩亚洲高清| 伊人久久久久久久久久| 国产精品免费在线免费| 精品视频在线播放色网色视频| 最近2019年好看中文字幕视频| 亚洲国产私拍精品国模在线观看| 91国内产香蕉| 日韩欧美国产中文字幕| 岛国视频午夜一区免费在线观看| 国产99视频在线观看| 成人av在线网址| 日韩极品精品视频免费观看| 国产精品久久久久77777| 国产一区二区三区三区在线观看| 中文字幕日韩精品在线| 国产97在线视频| 欧美精品18videos性欧| 久久这里只有精品99| 欧美性猛交xxxx乱大交蜜桃| 亚洲91av视频| 97精品视频在线观看| 97在线精品国自产拍中文| 欧美激情精品久久久久久久变态| 成人黄色午夜影院| 亚洲精品动漫久久久久| 91免费欧美精品| 久久综合久久八八| 亚洲精品欧美一区二区三区| 国产精品永久免费视频| 亚洲欧美精品中文字幕在线| 一级做a爰片久久毛片美女图片| 日韩电影中文 亚洲精品乱码| 国产裸体写真av一区二区| 亚洲精品白浆高清久久久久久| 最近2019年好看中文字幕视频| 久久99久久亚洲国产| 国产日韩欧美在线播放| 成人免费网站在线| 亚洲欧美日韩天堂| 国产精品国产三级国产aⅴ浪潮| 高清欧美性猛交xxxx黑人猛交| 亚洲精品欧美极品| 日本精品久久久| 成人免费激情视频| 午夜精品久久久久久久99热浪潮| 91干在线观看| www.99久久热国产日韩欧美.com| 欧美日在线观看| 91av在线精品| 久久久久99精品久久久久| 国产精品吹潮在线观看| 亚洲一区制服诱惑| 97精品久久久| 国产精品海角社区在线观看| 国产成人综合精品在线| 欧美黑人狂野猛交老妇| www.午夜精品| 91免费国产视频| 中文字幕亚洲一区二区三区五十路| 亚洲最大福利视频网站| 国内成人精品一区| 高清欧美一区二区三区| 日产精品99久久久久久| 国色天香2019中文字幕在线观看| 国产视频在线观看一区二区| 色综合伊人色综合网| 成人日韩av在线| 国内免费精品永久在线视频| 亚洲精品美女在线| 亚洲日本中文字幕| 亚洲欧美一区二区精品久久久| 精品视频在线播放| 最好看的2019的中文字幕视频| 黄色成人在线播放| 国产一区二中文字幕在线看| 亚洲午夜色婷婷在线| 日韩在线视频免费观看高清中文| 91国在线精品国内播放| 国产91在线高潮白浆在线观看| 亚洲电影av在线|