日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java开发微信支付流程及容易入坑的点

發布時間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java开发微信支付流程及容易入坑的点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本人琢磨微信支付好幾天了,終于完成了,下面是開發微信支付的流程:

1.先要有認證后的微信服務號,然后申請開通微信支付功能,通過之后,騰訊會跟你發一封郵件,如下圖:

?2.配置好微信支付的支付授權目錄(配置錯誤,支付時微信會返回:http://ki.hdh.com/kjjk/jh未注冊錯誤)

3.我們要參照微信傳的參數,如下圖:

4.生成prepay_id(在WeiXinUtils工具類里)

String getPrepayId = WeiXinUtils.getPayOrderByWeiXin(openid,String.valueOf(sumPrice*100),userIp,url,body,num+timeStamp);

?

?
  • public static String getPayOrderByWeiXin(String opentId, String total_fee, String userIp, String notifyUrl, String body, String orderNumber) {

  • SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();

  • parameters.put("appid", APP_ID);

  • System.out.println("appid:"+APP_ID);

  • parameters.put("mch_id", MCH_ID);

  • System.out.println("mch_id:"+MCH_ID);

  • parameters.put("nonce_str", nonceStr);

  • System.out.println("nonce_str:"+"HZNAONAOCOM");

  • parameters.put("body", body);

  • System.out.println("body:"+body);

  • parameters.put("out_trade_no", orderNumber);

  • System.out.println("out_trade_no:"+orderNumber);

  • parameters.put("total_fee", total_fee.substring(0, total_fee.indexOf(".")));

  • System.out.println("total_fee="+total_fee.substring(0, total_fee.indexOf(".")));

  • parameters.put("spbill_create_ip", userIp);

  • System.out.println("spbill_create_ip="+userIp);

  • parameters.put("notify_url",notifyUrl );

  • System.out.println("notify_url="+notifyUrl);

  • parameters.put("trade_type", "JSAPI");

  • System.out.println("trade_type=JSAPI");

  • parameters.put("openid", opentId);

  • System.out.println("openid="+opentId);

  • String sign = Sign.createSign("UTF-8", parameters);

  • System.out.println("sign="+sign);

  • parameters.put("sign", sign);

  • ?
  • String requestXML = Utils.getRequestXml(parameters);

  • System.out.println("requestXML="+requestXML);

  • String result = PostRequest.httpsRequest(unifiedOrder, "POST", requestXML);

  • System.out.println("prepay_id="+result);

  • return getPrepayId(result);

  • }

  • ?

    5.工具類

    ?

    ?
  • package com.naonao.cmall.utils;

  • ?
  • import java.io.UnsupportedEncodingException;

  • import java.security.MessageDigest;

  • import java.security.NoSuchAlgorithmException;

  • import java.util.Formatter;

  • import java.util.HashMap;

  • import java.util.Iterator;

  • import java.util.Map;

  • import java.util.Set;

  • import java.util.SortedMap;

  • import java.util.UUID;

  • ?
  • import org.springframework.cache.annotation.Cacheable;

  • ?
  • import com.naonao.cmall.utils.http.HttpClient;

  • ?
  • public class Sign {

  • ?
  • @Cacheable(value="baseCache")

  • public static String getToken() {

  • String s = HttpClient.sendGet(

  • "https://api.weixin.qq.com/cgi-bin/token",

  • "grant_type=client_credential&appid=" + WeiXinUtils.APP_ID

  • + "&secret=" + WeiXinUtils.APP_SECRET);

  • HashMap<String, Object> json = JsonUtil.stringToTObj(s, HashMap.class);

  • String token = json.get("access_token").toString();

  • ?
  • return token;

  • }

  • ?
  • @Cacheable(value="baseCache")

  • public static String getTicket() {

  • String token = Sign.getToken();

  • ?
  • String s1 = HttpClient.sendGet(

  • "https://api.weixin.qq.com/cgi-bin/ticket/getticket",

  • "access_token=" + token + "&type=jsapi");

  • HashMap<String, Object> json1 = JsonUtil

  • .stringToTObj(s1, HashMap.class);

  • return json1.get("ticket").toString();

  • }

  • ?
  • public static String getNonceStr() {

  • return create_timestamp();

  • }

  • ?
  • //chatSet SHA-1 or MD5

  • public static Map<String, String> sign(String url, String chatSet) {

  • Map<String, String> ret = new HashMap<String, String>();

  • String nonce_str = create_nonce_str();

  • String timestamp = create_timestamp();

  • String string1;

  • String signature = "";

  • String jsapi_ticket = getTicket();

  • ?
  • // 注意這里參數名必須全部小寫,且必須有序

  • string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str

  • + "×tamp=" + timestamp + "&url=" + url;

  • // System.out.println(string1);

  • ?
  • try {

  • MessageDigest crypt = MessageDigest.getInstance(chatSet);

  • crypt.reset();

  • crypt.update(string1.getBytes("UTF-8"));

  • signature = byteToHex(crypt.digest());

  • } catch (NoSuchAlgorithmException e) {

  • e.printStackTrace();

  • } catch (UnsupportedEncodingException e) {

  • e.printStackTrace();

  • }

  • ?
  • ret.put("url", url);

  • ret.put("jsapi_ticket", jsapi_ticket);

  • ret.put("nonceStr", nonce_str);

  • ret.put("timestamp", timestamp);

  • ret.put("signature", signature);

  • for (Map.Entry entry : ret.entrySet()) {

  • System.out.println(entry.getKey() + ", " + entry.getValue());

  • }

  • return ret;

  • }

  • ?
  • private static String byteToHex(final byte[] hash) {

  • Formatter formatter = new Formatter();

  • for (byte b : hash) {

  • formatter.format("%02x", b);

  • }

  • String result = formatter.toString();

  • formatter.close();

  • return result;

  • }

  • ?
  • private static String create_nonce_str() {

  • return UUID.randomUUID().toString();

  • }

  • ?
  • private static String create_timestamp() {

  • return Long.toString(System.currentTimeMillis() / 1000);

  • }

  • ?
  • public static String createSign(String characterEncoding, SortedMap<Object, Object> parameters) {

  • StringBuffer sb = new StringBuffer();

  • Set es = parameters.entrySet();

  • Iterator it = es.iterator();

  • while (it.hasNext()) {

  • Map.Entry entry = (Map.Entry) it.next();

  • String k = (String) entry.getKey();

  • Object v = entry.getValue();

  • if (null != v && !"".equals(v) && !"sign".equals(k)

  • && !"key".equals(k)) {

  • sb.append(k + "=" + v + "&");

  • }

  • }

  • sb.append("key=" + WeiXinUtils.APP_KEY);

  • String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();

  • return sign;

  • }

  • ?
  • public static String paySign(String characterEncoding, SortedMap<Object, Object> parameters) {

  • StringBuffer sb = new StringBuffer();

  • Set es = parameters.entrySet();

  • Iterator it = es.iterator();

  • while (it.hasNext()) {

  • Map.Entry entry = (Map.Entry) it.next();

  • String k = (String) entry.getKey();

  • Object v = entry.getValue();

  • if (null != v && !"".equals(v) && !"sign".equals(k)

  • && !"key".equals(k)) {

  • sb.append(k + "=" + v + "&");

  • }

  • }

  • //sb.replace(sb.length()-1, sb.length(), "?");

  • sb.append("key=" + WeiXinUtils.APP_KEY);

  • //sb.append("params=value");

  • System.out.println(sb);

  • String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();

  • return sign;

  • }

  • }

  • ?
  • package com.naonao.cmall.utils;

  • ?
  • import java.io.UnsupportedEncodingException;

  • import java.lang.reflect.Method;

  • import java.math.BigDecimal;

  • import java.security.MessageDigest;

  • import java.security.NoSuchAlgorithmException;

  • import java.text.DecimalFormat;

  • import java.text.SimpleDateFormat;

  • import java.util.Arrays;

  • import java.util.Calendar;

  • import java.util.Collection;

  • import java.util.Date;

  • import java.util.Iterator;

  • import java.util.List;

  • import java.util.Map;

  • import java.util.Random;

  • import java.util.Set;

  • import java.util.SortedMap;

  • ?
  • import javax.servlet.http.HttpServletRequest;

  • ?
  • public class Utils {

  • // MD5加密

  • public static String getMd5(String plainText) {

  • try {

  • MessageDigest md = MessageDigest.getInstance("MD5");

  • md.update(plainText.getBytes());

  • byte b[] = md.digest();

  • ?
  • int i;

  • ?
  • StringBuffer buf = new StringBuffer("");

  • for (int offset = 0; offset < b.length; offset++) {

  • i = b[offset];

  • if (i < 0)

  • i += 256;

  • if (i < 16)

  • buf.append("0");

  • buf.append(Integer.toHexString(i));

  • }

  • // 32

  • return buf.toString();

  • // 16

  • // return buf.toString().substring(8, 24);

  • } catch (NoSuchAlgorithmException e) {

  • e.printStackTrace();

  • return null;

  • }

  • ?
  • }

  • ?
  • public static String getRemortIP(HttpServletRequest request) {

  • if (request.getHeader("x-forwarded-for") == null) {

  • return request.getRemoteAddr();

  • }

  • return request.getHeader("x-forwarded-for");

  • }

  • ?
  • public static String encode(String str) {

  • try {

  • return java.net.URLEncoder.encode(str, "UTF-8");

  • } catch (UnsupportedEncodingException e) {

  • // TODO Auto-generated catch block

  • e.printStackTrace();

  • }

  • return str;

  • }

  • ?
  • public static String getRequestXml(SortedMap<Object, Object> parameters) {

  • StringBuffer sb = new StringBuffer();

  • sb.append("<xml>");

  • Set es = parameters.entrySet();

  • Iterator it = es.iterator();

  • while (it.hasNext()) {

  • Map.Entry entry = (Map.Entry) it.next();

  • String k = (String) entry.getKey();

  • String v = (String) entry.getValue();

  • if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)

  • || "sign".equalsIgnoreCase(k)) {

  • sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");

  • } else {

  • sb.append("<" + k + ">" + v + "</" + k + ">");

  • }

  • }

  • sb.append("</xml>");

  • return sb.toString();

  • }

  • ?
  • public static String getOutTradeNo(Integer userId, Integer shopId) {

  • return userId + "c" + shopId + "c" + (new Date()).getTime();

  • }

  • ?
  • /**

  • * 利用反射實現對象之間屬性復制

  • *

  • * @param from

  • * @param to

  • */

  • public static void copyProperties(Object from, Object to) throws Exception {

  • copyPropertiesExclude(from, to, null);

  • }

  • ?
  • /**

  • * 復制對象屬性

  • *

  • * @param from

  • * @param to

  • * @param excludsArray

  • * 排除屬性列表

  • * @throws Exception

  • */

  • public static void copyPropertiesExclude(Object from, Object to,

  • String[] excludsArray) throws Exception {

  • List<String> excludesList = null;

  • if (excludsArray != null && excludsArray.length > 0) {

  • excludesList = Arrays.asList(excludsArray); // 構造列表對象

  • }

  • Method[] fromMethods = from.getClass().getDeclaredMethods();

  • Method[] toMethods = to.getClass().getDeclaredMethods();

  • Method fromMethod = null, toMethod = null;

  • String fromMethodName = null, toMethodName = null;

  • for (int i = 0; i < fromMethods.length; i++) {

  • fromMethod = fromMethods[i];

  • fromMethodName = fromMethod.getName();

  • if (!fromMethodName.contains("get"))

  • continue;

  • // 排除列表檢測

  • if (excludesList != null

  • && excludesList.contains(fromMethodName.substring(3)

  • .toLowerCase())) {

  • continue;

  • }

  • toMethodName = "set" + fromMethodName.substring(3);

  • toMethod = findMethodByName(toMethods, toMethodName);

  • if (toMethod == null)

  • continue;

  • Object value = fromMethod.invoke(from, new Object[0]);

  • if (value == null)

  • continue;

  • // 集合類判空處理

  • if (value instanceof Collection) {

  • Collection newValue = (Collection) value;

  • if (newValue.size() <= 0)

  • continue;

  • }

  • toMethod.invoke(to, new Object[] { value });

  • }

  • }

  • ?
  • /**

  • * 對象屬性值復制,僅復制指定名稱的屬性值

  • *

  • * @param from

  • * @param to

  • * @param includsArray

  • * @throws Exception

  • */

  • public static void copyPropertiesInclude(Object from, Object to,

  • String[] includsArray) throws Exception {

  • List<String> includesList = null;

  • if (includsArray != null && includsArray.length > 0) {

  • includesList = Arrays.asList(includsArray); // 構造列表對象

  • } else {

  • return;

  • }

  • Method[] fromMethods = from.getClass().getDeclaredMethods();

  • Method[] toMethods = to.getClass().getDeclaredMethods();

  • Method fromMethod = null, toMethod = null;

  • String fromMethodName = null, toMethodName = null;

  • for (int i = 0; i < fromMethods.length; i++) {

  • fromMethod = fromMethods[i];

  • fromMethodName = fromMethod.getName();

  • if (!fromMethodName.contains("get"))

  • continue;

  • // 排除列表檢測

  • String str = fromMethodName.substring(3);

  • if (!includesList.contains(str.substring(0, 1).toLowerCase()

  • + str.substring(1))) {

  • continue;

  • }

  • toMethodName = "set" + fromMethodName.substring(3);

  • toMethod = findMethodByName(toMethods, toMethodName);

  • if (toMethod == null)

  • continue;

  • Object value = fromMethod.invoke(from, new Object[0]);

  • if (value == null)

  • continue;

  • // 集合類判空處理

  • if (value instanceof Collection) {

  • Collection newValue = (Collection) value;

  • if (newValue.size() <= 0)

  • continue;

  • }

  • toMethod.invoke(to, new Object[] { value });

  • }

  • }

  • ?
  • /**

  • * 從方法數組中獲取指定名稱的方法

  • *

  • * @param methods

  • * @param name

  • * @return

  • */

  • public static Method findMethodByName(Method[] methods, String name) {

  • for (int j = 0; j < methods.length; j++) {

  • if (methods[j].getName().equals(name))

  • return methods[j];

  • }

  • return null;

  • }

  • ?
  • /**

  • * map 轉 Bean

  • *

  • * @param map

  • * @param cls

  • * @return

  • */

  • public static Object map2Bean(Map map, Class cls) {

  • Object obj = null;

  • try {

  • obj = cls.newInstance();

  • } catch (Exception e) {

  • e.printStackTrace();

  • }

  • // 取出bean里的所有方法

  • Method[] methods = cls.getMethods();

  • for (int i = 0; i < methods.length; i++) {

  • // 取方法名

  • String method = methods[i].getName();

  • // 取出方法的類型

  • Class[] cc = methods[i].getParameterTypes();

  • if (cc.length != 1)

  • continue;

  • ?
  • // 如果方法名沒有以set開頭的則退出本次for

  • if (method.indexOf("set") < 0)

  • continue;

  • // 類型

  • String type = cc[0].getSimpleName();

  • ?
  • try {

  • // 轉成小寫

  • // Object value = method.substring(3).toLowerCase();

  • Object value = method.substring(3, 4).toLowerCase()

  • + method.substring(4);

  • // 如果map里有該key

  • if (map.containsKey(value) && map.get(value) != null) {

  • // 調用其底層方法

  • setValue(type, map.get(value), i, methods, obj);

  • }

  • } catch (Exception e) {

  • e.printStackTrace();

  • }

  • }

  • return obj;

  • }

  • ?
  • /**

  • * 調用底層方法設置值

  • */

  • private static void setValue(String type, Object value, int i,

  • Method[] method, Object bean) {

  • if (value != null && !value.equals("")) {

  • try {

  • if (type.equals("String")) {

  • // 第一個參數:從中調用基礎方法的對象 第二個參數:用于方法調用的參數

  • method[i].invoke(bean, new Object[] { value });

  • } else if (type.equals("int") || type.equals("Integer")) {

  • method[i].invoke(bean, new Object[] { new Integer(""

  • + value) });

  • } else if (type.equals("double") || type.equals("Double")) {

  • method[i].invoke(bean,

  • new Object[] { new Double("" + value) });

  • } else if (type.equals("float") || type.equals("Float")) {

  • method[i].invoke(bean,

  • new Object[] { new Float("" + value) });

  • } else if (type.equals("long") || type.equals("Long")) {

  • method[i].invoke(bean,

  • new Object[] { new Long("" + value) });

  • } else if (type.equals("boolean") || type.equals("Boolean")) {

  • method[i].invoke(bean,

  • new Object[] { Boolean.valueOf("" + value) });

  • } else if (type.equals("BigDecimal")) {

  • method[i].invoke(bean, new Object[] { new BigDecimal(""

  • + value) });

  • } else if (type.equals("Date")) {

  • Date date = null;

  • if (value.getClass().getName().equals("java.util.Date")) {

  • date = (Date) value;

  • } else {

  • String format = ((String) value).indexOf(":") > 0 ? "yyyy-MM-dd hh:mm:ss"

  • : "yyyy-MM-dd";

  • SimpleDateFormat sf = new SimpleDateFormat();

  • sf.applyPattern(format);

  • date = sf.parse((String) (value));

  • }

  • if (date != null) {

  • method[i].invoke(bean, new Object[] { date });

  • }

  • } else if (type.equals("byte[]")) {

  • method[i].invoke(bean,

  • new Object[] { new String(value + "").getBytes() });

  • }

  • } catch (Exception e) {

  • System.out

  • .println("將linkHashMap 或 HashTable 里的值填充到javabean時出錯,請檢查!");

  • e.printStackTrace();

  • }

  • }

  • }

  • ?
  • /** 計算年齡 */

  • public static String getAge(Date birthDay) throws Exception {

  • Calendar cal = Calendar.getInstance();

  • ?
  • if (cal.before(birthDay)) {

  • throw new IllegalArgumentException(

  • "The birthDay is before Now.It's unbelievable!");

  • }

  • ?
  • int yearNow = cal.get(Calendar.YEAR);

  • int monthNow = cal.get(Calendar.MONTH) + 1;

  • int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);

  • ?
  • cal.setTime(birthDay);

  • int yearBirth = cal.get(Calendar.YEAR);

  • int monthBirth = cal.get(Calendar.MONTH);

  • int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);

  • ?
  • int age = yearNow - yearBirth;

  • ?
  • if (monthNow <= monthBirth) {

  • if (monthNow == monthBirth) {

  • // monthNow==monthBirth

  • if (dayOfMonthNow < dayOfMonthBirth) {

  • age--;

  • }

  • } else {

  • // monthNow>monthBirth

  • age--;

  • }

  • }

  • ?
  • return age + "";

  • }

  • ?
  • public static String getStringByFloat(Float d1) {

  • DecimalFormat Formator = new DecimalFormat("###.##");

  • return Formator.format(d1);

  • }

  • }

  • ?

    ?
  • package com.naonao.cmall.utils.http;

  • ?
  • import java.io.BufferedReader;

  • import java.io.DataOutputStream;

  • import java.io.IOException;

  • import java.io.InputStream;

  • import java.io.InputStreamReader;

  • import java.io.OutputStream;

  • import java.io.OutputStreamWriter;

  • import java.net.ConnectException;

  • import java.net.HttpURLConnection;

  • import java.net.URL;

  • import java.net.URLConnection;

  • import java.util.HashMap;

  • import java.util.Map;

  • ?
  • import javax.net.ssl.HttpsURLConnection;

  • import javax.net.ssl.SSLContext;

  • import javax.net.ssl.SSLSocketFactory;

  • import javax.net.ssl.TrustManager;

  • ?
  • import org.slf4j.Logger;

  • import org.slf4j.LoggerFactory;

  • ?
  • import com.alibaba.fastjson.JSONObject;

  • import com.naonao.cmall.utils.MyX509TrustManager;

  • public class PostRequest {

  • ?
  • private static final Logger log = LoggerFactory

  • .getLogger(PostRequest.class);

  • public static String GET_URL = "";

  • ?
  • public static String POST_URL = "";

  • ?
  • public static String readContentFromGet() throws IOException {

  • String getURL = GET_URL;

  • URL getUrl = new URL(getURL);

  • // 根據拼湊的URL,打開連接,URL.openConnection函數會根據URL的類型,

  • // 返回不同的URLConnection子類的對象,這里URL是一個http,因此實際返回的是HttpURLConnection

  • HttpURLConnection connection = (HttpURLConnection) getUrl

  • .openConnection();

  • // 進行連接,但是實際上get request要在下一句的connection.getInputStream()函數中才會真正發到

  • // 服務器

  • connection.connect();

  • // 取得輸入流,并使用Reader讀取

  • BufferedReader reader = new BufferedReader(new InputStreamReader(

  • connection.getInputStream(), "utf-8"));// 設置編碼,否則中文亂碼

  • String line = "";

  • String lines = "";

  • while ((line = reader.readLine()) != null) {

  • // line = new String(line.getBytes(), "utf-8");

  • lines += line.trim();

  • }

  • reader.close();

  • // 斷開連接

  • connection.disconnect();

  • return lines;

  • }

  • ?
  • public static void contentFromGet() throws IOException {

  • String getURL = GET_URL;

  • URL getUrl = new URL(getURL);

  • // 根據拼湊的URL,打開連接,URL.openConnection函數會根據URL的類型,

  • // 返回不同的URLConnection子類的對象,這里URL是一個http,因此實際返回的是HttpURLConnection

  • HttpURLConnection connection = (HttpURLConnection) getUrl

  • .openConnection();

  • // 進行連接,但是實際上get request要在下一句的connection.getInputStream()函數中才會真正發到

  • // 服務器

  • connection.connect();

  • }

  • ?
  • public static String readContentFromPost() throws IOException {

  • // Post請求的url,與get不同的是不需要帶參數

  • URL postUrl = new URL(POST_URL);

  • // 打開連接

  • HttpURLConnection connection = (HttpURLConnection) postUrl

  • .openConnection();

  • // Output to the connection. Default is

  • // false, set to true because post

  • // method must write something to the

  • // connection

  • // 設置是否向connection輸出,因為這個是post請求,參數要放在

  • // http正文內,因此需要設為true

  • connection.setDoOutput(true);

  • // Read from the connection. Default is true.

  • connection.setDoInput(true);

  • // Set the post method. Default is GET

  • connection.setRequestMethod("POST");

  • // Post cannot use caches

  • // Post 請求不能使用緩存

  • connection.setUseCaches(false);

  • // This method takes effects to

  • // every instances of this class.

  • // URLConnection.setFollowRedirects是static函數,作用于所有的URLConnection對象。

  • // connection.setFollowRedirects(true);

  • ?
  • // This methods only

  • // takes effacts to this

  • // instance.

  • // URLConnection.setInstanceFollowRedirects是成員函數,僅作用于當前函數

  • connection.setInstanceFollowRedirects(true);

  • // Set the content type to urlencoded,

  • // because we will write

  • // some URL-encoded content to the

  • // connection. Settings above must be set before connect!

  • // 配置本次連接的Content-type,配置為application/x-www-form-urlencoded的

  • // 意思是正文是urlencoded編碼過的form參數,下面我們可以看到我們對正文內容使用URLEncoder.encode

  • // 進行編碼

  • connection.setRequestProperty("Content-Type",

  • "application/x-www-form-urlencoded");

  • // 連接,從postUrl.openConnection()至此的配置必須要在connect之前完成,

  • // 要注意的是connection.getOutputStream會隱含的進行connect。

  • connection.connect();

  • DataOutputStream out = new DataOutputStream(

  • connection.getOutputStream());

  • // The URL-encoded contend

  • // 正文,正文內容其實跟get的URL中'?'后的參數字符串一致

  • // String content =

  • // "key=j0r53nmbbd78x7m1pqml06u2&type=1&toemail=jiucool@gmail.com" +

  • // "&activatecode=" + URLEncoder.encode("久酷博客", "utf-8");

  • // DataOutputStream.writeBytes將字符串中的16位的unicode字符以8位的字符形式寫道流里面

  • // out.writeBytes(content);

  • out.flush();

  • out.close(); // flush and close

  • BufferedReader reader = new BufferedReader(new InputStreamReader(

  • connection.getInputStream(), "utf-8"));// 設置編碼,否則中文亂碼

  • String line = "";

  • String lines = "";

  • while ((line = reader.readLine()) != null) {

  • // line = new String(line.getBytes(), "utf-8");

  • lines += line.trim();

  • }

  • reader.close();

  • connection.disconnect();

  • return lines;

  • }

  • ?
  • /**

  • * 經緯度

  • *

  • * @param lng

  • * @param lat

  • * @return

  • */

  • public static Map<String, String> getAddressByLatlat(String lng, String lat) {

  • String str = "http://api.map.baidu.com/geocoder?output=json&location="

  • + lat + "," + lng + "&key=37492c0ee6f924cb5e934fa08c6b167";

  • Map<String, String> map = new HashMap<String, String>();

  • try {

  • PostRequest.POST_URL = str;

  • String line = PostRequest.readContentFromPost();

  • JSONObject jsonObj = JSONObject.parseObject(line);

  • String result = jsonObj.getString("result");

  • JSONObject jsonObj2 = JSONObject.parseObject(result);

  • String cityCode = jsonObj2.getString("cityCode");

  • String formattedAddress = jsonObj2.getString("formatted_address");

  • JSONObject jsonObj3 = JSONObject.parseObject(jsonObj2

  • .getString("addressComponent"));

  • String city = jsonObj3.getString("city");

  • map.put("cityCode", cityCode);

  • map.put("formattedAddress", formattedAddress);

  • map.put("city", city);

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • return map;

  • }

  • ?
  • /**

  • * 城市

  • *

  • * @param city

  • * @return

  • */

  • public static Map<String, String> getAddressByCity(String city) {

  • String str = "http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderOption&output=json&address="

  • + city + "&city=" + city;

  • Map<String, String> map = new HashMap<String, String>();

  • try {

  • PostRequest.POST_URL = str;

  • String line = PostRequest.readContentFromPost();

  • JSONObject jsonObj = JSONObject.parseObject(line);

  • String result = jsonObj.getString("result");

  • JSONObject jsonObj2 = JSONObject.parseObject(result);

  • String cityCode = jsonObj2.getString("cityCode");

  • String formattedAddress = jsonObj2.getString("formatted_address");

  • map.put("cityCode", cityCode);

  • map.put("formattedAddress", formattedAddress);

  • map.put("city", city);

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • return map;

  • }

  • ?
  • /**

  • * 城市

  • *

  • * @param city

  • * @return

  • */

  • public static Map<String, String> getQQMessages(String access_token,

  • String openid) {

  • String qqUrl = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=100330589&access_token="

  • + access_token + "&openid=" + openid + "&format=json";

  • Map<String, String> map = new HashMap<String, String>();

  • try {

  • PostRequest.GET_URL = qqUrl;

  • String line = PostRequest.readContentFromGet();

  • JSONObject jsonObj = JSONObject.parseObject(line);

  • String nickname = jsonObj.getString("nickname");

  • String gender = jsonObj.getString("gender");

  • String url = jsonObj.getString("figureurl_qq_1");

  • map.put("nickname", nickname);

  • map.put("gender", gender);

  • map.put("url", url);

  • map.put("openid", openid);

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • return map;

  • }

  • ?
  • public static void main(String[] args) {

  • PostRequest.GET_URL="http://mc-storage.b0.upaiyun.com/song_lib/lrc/20140702/Y2014060133.txt";

  • String line;

  • try {

  • line = PostRequest.readContentFromGet();

  • System.out.println(line);

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • }

  • ?
  • ?
  • /**

  • * 用傳統的URI類進行請求

  • * @param urlStr

  • */

  • public static String post(String urlStr,String xmlInfo) {

  • String line = "";

  • try {

  • URL url = new URL(urlStr);

  • URLConnection con = url.openConnection();

  • con.setDoOutput(true);

  • con.setRequestProperty("Pragma:", "no-cache");

  • con.setRequestProperty("Cache-Control", "no-cache");

  • con.setRequestProperty("Content-Type", "text/xml");

  • ?
  • OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());

  • // System.out.println("xmlInfo=" + xmlInfo);

  • out.write(new String(xmlInfo.getBytes("UTF-8")));

  • out.flush();

  • out.close();

  • BufferedReader br = new BufferedReader(new InputStreamReader(con

  • .getInputStream()));

  • for (line = br.readLine(); line != null; line = br.readLine()) {

  • line+=line;

  • }

  • } catch (Exception e) {

  • e.printStackTrace();

  • }

  • return line;

  • }

  • ?
  • /**

  • * 發送https請求

  • * @param requestUrl 請求地址

  • * @param requestMethod 請求方式(GET、POST)

  • * @param outputStr 提交的數據

  • * @return 返回微信服務器響應的信息

  • */

  • public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {

  • try {

  • // 創建SSLContext對象,并使用我們指定的信任管理器初始化

  • TrustManager[] tm = { new MyX509TrustManager() };

  • SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

  • sslContext.init(null, tm, new java.security.SecureRandom());

  • // 從上述SSLContext對象中得到SSLSocketFactory對象

  • SSLSocketFactory ssf = sslContext.getSocketFactory();

  • URL url = new URL(requestUrl);

  • HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

  • conn.setSSLSocketFactory(ssf);

  • conn.setDoOutput(true);

  • conn.setDoInput(true);

  • conn.setUseCaches(false);

  • // 設置請求方式(GET/POST)

  • conn.setRequestMethod(requestMethod);

  • conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");

  • // 當outputStr不為null時向輸出流寫數據

  • if (null != outputStr) {

  • OutputStream outputStream = conn.getOutputStream();

  • // 注意編碼格式

  • outputStream.write(outputStr.getBytes("UTF-8"));

  • outputStream.close();

  • }

  • // 從輸入流讀取返回內容

  • InputStream inputStream = conn.getInputStream();

  • InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

  • BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

  • String str = null;

  • StringBuffer buffer = new StringBuffer();

  • while ((str = bufferedReader.readLine()) != null) {

  • buffer.append(str);

  • }

  • // 釋放資源

  • bufferedReader.close();

  • inputStreamReader.close();

  • inputStream.close();

  • inputStream = null;

  • conn.disconnect();

  • return buffer.toString();

  • } catch (ConnectException ce) {

  • log.error("連接超時:{}", ce);

  • } catch (Exception e) {

  • log.error("https請求異常:{}", e);

  • }

  • return null;

  • }

  • ?
  • /**

  • * 發送HttpPost請求

  • *

  • * @param strURL

  • * 服務地址

  • * @param params

  • * json字符串,例如: "{ \"id\":\"12345\" }" ;其中屬性名必須帶雙引號<br/>

  • * @return 成功:返回json字符串<br/>

  • */

  • public static String postByJson(String strURL, String params) {

  • System.out.println(strURL);

  • System.out.println(params);

  • try {

  • URL url = new URL(strURL);// 創建連接

  • HttpURLConnection connection = (HttpURLConnection) url

  • .openConnection();

  • connection.setDoOutput(true);

  • connection.setDoInput(true);

  • connection.setUseCaches(false);

  • connection.setInstanceFollowRedirects(true);

  • connection.setRequestMethod("POST"); // 設置請求方式

  • connection.setRequestProperty("Accept", "application/json"); // 設置接收數據的格式

  • connection.setRequestProperty("Content-Type", "application/json"); // 設置發送數據的格式

  • connection.connect();

  • OutputStreamWriter out = new OutputStreamWriter(

  • connection.getOutputStream(), "UTF-8"); // utf-8編碼

  • out.append(params);

  • out.flush();

  • out.close();

  • // 讀取響應

  • int length = (int) connection.getContentLength();// 獲取長度

  • InputStream is = connection.getInputStream();

  • if (length != -1) {

  • byte[] data = new byte[length];

  • byte[] temp = new byte[512];

  • int readLen = 0;

  • int destPos = 0;

  • while ((readLen = is.read(temp)) > 0) {

  • System.arraycopy(temp, 0, data, destPos, readLen);

  • destPos += readLen;

  • }

  • String result = new String(data, "UTF-8"); // utf-8編碼

  • System.out.println(result);

  • return result;

  • }

  • } catch (IOException e) {

  • // TODO Auto-generated catch block

  • e.printStackTrace();

  • }

  • return "error"; // 自定義錯誤信息

  • }

  • ?
  • }

  • ?

    ?
  • package com.naonao.cmall.utils;

  • ?
  • import java.io.IOException;

  • import java.net.URLEncoder;

  • import java.text.SimpleDateFormat;

  • import java.util.Date;

  • import java.util.HashMap;

  • import java.util.Map;

  • import java.util.SortedMap;

  • import java.util.TreeMap;

  • ?
  • import org.jdom.JDOMException;

  • import org.slf4j.Logger;

  • import org.slf4j.LoggerFactory;

  • ?
  • import com.naonao.cmall.utils.http.HttpUtil;

  • import com.naonao.cmall.utils.http.PostRequest;

  • ?
  • public class WeiXinUtils {

  • private static final Logger log = LoggerFactory.getLogger(WeiXinUtils.class);

  • ?
  • /** 微信開發平臺應用appid */

  • public static final String APP_ID = "***";

  • ?
  • /**

  • *

  • */

  • //public static final String noncestr="***";

  • /** 微信開發平臺應用appsecret */

  • public static final String APP_SECRET = "***";

  • /**

  • * 隨機字符串

  • */

  • public static final String nonceStr="***";

  • ?
  • /** 商戶號 */

  • public static final String MCH_ID = "***";

  • ?
  • // 應用對應的密鑰

  • public static final String APP_KEY = "***";

  • ?
  • // 微信公眾號api

  • public static final String REDIRECT_URI = "***"; // 授權回調

  • public static final String PAY_URI = "***";// 支付回調

  • public static final String SCOPE = "snsapi_userinfo";

  • public static String GetOpenIdRequest = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&grant_type=authorization_code";

  • public static String unifiedOrder = "https://api.mch.weixin.qq.com/pay/unifiedorder";

  • ?
  • /**

  • * weixin地址封裝

  • *

  • * @return

  • */

  • public static String getCodeRequest(String url) {

  • String GetCodeRequest = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";

  • ?
  • String result = null;

  • GetCodeRequest = GetCodeRequest.replace("APPID", urlEnodeUTF8(APP_ID));

  • GetCodeRequest = GetCodeRequest.replace("SCOPE", SCOPE);

  • GetCodeRequest = GetCodeRequest.replace("REDIRECT_URI", urlEnodeUTF8(REDIRECT_URI));

  • GetCodeRequest = GetCodeRequest.replace("STATE", url);

  • result = GetCodeRequest;

  • log.info("================================");

  • log.info(url);

  • log.info(GetCodeRequest);

  • log.info("================================");

  • return result;

  • }

  • ?
  • /**

  • * weixin地址封裝

  • *

  • * @return

  • */

  • public static String getOpenIdRequest() {

  • String result = null;

  • GetOpenIdRequest = GetOpenIdRequest.replace("APPID", urlEnodeUTF8(APP_ID));

  • GetOpenIdRequest = GetOpenIdRequest.replace("SECRET", urlEnodeUTF8(APP_SECRET));

  • result = GetOpenIdRequest;

  • return result;

  • }

  • ?
  • /**

  • * 鏈接轉碼

  • *

  • * @param str

  • * @return

  • */

  • public static String urlEnodeUTF8(String str) {

  • String result = str;

  • try {

  • result = URLEncoder.encode(str, "UTF-8");

  • } catch (Exception e) {

  • log.error("WeiXinUtils getCodeRequest urlEnodeUTF8:{}", str);

  • e.printStackTrace();

  • }

  • return result;

  • }

  • ?
  • /**

  • * 通過code獲取openId

  • *

  • * @param codeResult

  • * @return

  • */

  • public static String getOpenId(String codeResult) {

  • String openid = "";

  • try {

  • String openIdUrl = WeiXinUtils.getOpenIdRequest();

  • PostRequest.GET_URL = openIdUrl + "&code=" + codeResult;

  • String s = PostRequest.readContentFromGet();

  • ?
  • HashMap<String, Object> json = JsonUtil.stringToTObj(s, HashMap.class);

  • if (json != null && json.get("openid") != null) {

  • openid = json.get("openid").toString();

  • }

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • return openid;

  • }

  • ?
  • /**

  • * 微信支付

  • *

  • * @param opentId

  • * @param total_fee

  • * @param userIp

  • * @param notifyUrl

  • * @param body

  • * @param orderNumber

  • * @return

  • */

  • public static String getPayOrderByWeiXin(String opentId, String total_fee, String userIp, String notifyUrl, String body, String orderNumber) {

  • SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();

  • parameters.put("appid", APP_ID);

  • System.out.println("appid:"+APP_ID);

  • parameters.put("mch_id", MCH_ID);

  • System.out.println("mch_id:"+MCH_ID);

  • parameters.put("nonce_str", nonceStr);

  • System.out.println("nonce_str:"+"HZNAONAOCOM");

  • parameters.put("body", body);

  • System.out.println("body:"+body);

  • parameters.put("out_trade_no", orderNumber);

  • System.out.println("out_trade_no:"+orderNumber);

  • parameters.put("total_fee", total_fee.substring(0, total_fee.indexOf(".")));

  • System.out.println("total_fee="+total_fee.substring(0, total_fee.indexOf(".")));

  • parameters.put("spbill_create_ip", userIp);

  • System.out.println("spbill_create_ip="+userIp);

  • parameters.put("notify_url",notifyUrl );

  • System.out.println("notify_url="+notifyUrl);

  • parameters.put("trade_type", "JSAPI");

  • System.out.println("trade_type=JSAPI");

  • parameters.put("openid", opentId);

  • System.out.println("openid="+opentId);

  • String sign = Sign.createSign("UTF-8", parameters);

  • System.out.println("sign="+sign);

  • parameters.put("sign", sign);

  • ?
  • String requestXML = Utils.getRequestXml(parameters);

  • System.out.println("requestXML="+requestXML);

  • String result = PostRequest.httpsRequest(unifiedOrder, "POST", requestXML);

  • System.out.println("prepay_id="+result);

  • return getPrepayId(result);

  • }

  • ?
  • ?
  • /*

  • * paySign

  • */

  • public static String getPaySignByWeiXin(String timeStamp, String nonceStr, String _package) {

  • SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();

  • parameters.put("appId", APP_ID);

  • System.out.println("appId="+APP_ID);

  • parameters.put("timeStamp", timeStamp);

  • System.out.println("timeStamp="+timeStamp);

  • parameters.put("nonceStr", nonceStr);

  • System.out.println("nonceStr="+nonceStr);

  • parameters.put("package", _package);

  • System.out.println("package="+_package);

  • parameters.put("signType", "MD5");

  • System.out.println("signType=MD5");

  • //parameters.put("key", APP_KEY);

  • String sign = Sign.paySign("UTF-8", parameters);

  • System.out.println("sign="+sign);

  • return sign;

  • }

  • ?
  • private static String getPrepayId(String xml) {

  • String prepay_id = "";

  • try {

  • Map map = XMLUtil.doXMLParse(xml);

  • prepay_id = map.get("prepay_id").toString();

  • } catch (JDOMException e) {

  • e.printStackTrace();

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • return prepay_id;

  • }

  • ?
  • /**

  • * 微信下載文件

  • *

  • * @param name 本地文件名稱

  • * @param media_id 微信圖片ID

  • * @return

  • */

  • public static String downloadFile(String name,String media_id) {

  • String downloadFile="http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";

  • String token=Sign.getToken();

  • downloadFile=downloadFile.replace("ACCESS_TOKEN", token);

  • downloadFile=downloadFile.replace("MEDIA_ID", media_id);

  • String path=Config.getMediaImgPath();

  • Date now = new Date();

  • SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

  • path+=dateFormat.format(now)+"/"+name;

  • try {

  • HttpUtil.downloadFile(path, downloadFile);

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • return path;

  • }

  • ?
  • ?
  • ?
  • }

  • 6.獲取paysSign(簽名的appId中的'I'大寫,不然會報錯,之前我這里卡了好長時間,getPaySignByWeiXin在WeiXinUtils方法里)
    String paySign=WeiXinUtils.getPaySignByWeiXin(timeStamp, nonceStr, "prepay_id="+getPrepayId);

    ?

    7.程序的入口

    ?

    ?
  • /**

  • * 微信支付

  • */

  • public ModelAndView WeixinPay(String cmd, JSONObject request,HttpServletRequest httprequest, HttpServletResponse response) {

  • //"appId": "<%= appId %>", //公眾號名稱,由商戶傳入

  • //"timeStamp": "<%= timeStamp %>", //時間戳

  • //"nonceStr": "<%= nonceStr %>", //隨機串

  • //"package": "<%= package %>", //擴展包

  • //"signType": "MD5", //微信簽名方式:1.sha1

  • //"paySign": "<%= paySign %>" //微信簽名

  • //String accessToken="";

  • //String ticket="";

  • String body="";

  • String num="";

  • Double sumPrice=0.0;

  • String userIp =Utils.getRemortIP(httprequest);

  • //if(userIp==""||userIp==null)

  • //userIp="127.0.0.1";

  • String timeStamp= Long.toString(new Date().getTime()/1000);

  • String nonceStr=WeiXinUtils.nonceStr; //"HZNAONAOCOM";

  • String openid =request.getString("openid");

  • String url = request.getString("url");

  • JSONArray ordernumlist = request.getJSONArray("ordernum");

  • if(StringUtils.isBlank(openid)||StringUtils.isBlank(url)||ordernumlist==null)

  • return writeNotParameters(cmd);

  • if(openid==""||openid==null)

  • openid="orLhutxu-XEXWPAB-1DewmJ89w8g";

  • if(url==""||url==null)

  • url="http://hznaonao.com/c_mall/pay.jsp";//調用JS接口頁面的完整URL

  • //訂單號

  • String[] numlist=new String[100];

  • for(int i=0;i<ordernumlist.size();i++){

  • Object obj=ordernumlist.get(i);

  • //JSONObject obj = ordernumlist.getJSONObject(i);

  • //String ordernum=obj.getString("ordernum");

  • numlist[i]=obj.toString();

  • num=num+obj;

  • }

  • for(int j=0;j<numlist.length;j++){

  • if(numlist[j]==null)

  • break;

  • TOrder order=orderService.findOrderByNumber(numlist[j]);

  • List<TOrderGoods> ordergoods=orderGoodsService.findOrderGoodsByNumber(numlist[j]);

  • System.out.println(Double.parseDouble(order.getSumPrice()));

  • sumPrice=sumPrice+Double.parseDouble(order.getSumPrice());

  • for(int i=0;i<ordergoods.size();i++){

  • body=body+","+ordergoods.get(i).getGoodsName();

  • }

  • }

  • ?
  • String getPrepayId = WeiXinUtils.getPayOrderByWeiXin(openid,String.valueOf(sumPrice*100),userIp,url,body,num+timeStamp);

  • System.out.println(getPrepayId);

  • ?
  • String paySign=WeiXinUtils.getPaySignByWeiXin(timeStamp, nonceStr, "prepay_id="+getPrepayId);

  • System.out.println(paySign);

  • ?
  • WeiXinVO v =new WeiXinVO();

  • v.setAppId(WeiXinUtils.APP_ID);

  • v.setTimeStamp(timeStamp);

  • v.setNonceStr(nonceStr);

  • v.set_package("prepay_id="+getPrepayId);

  • v.setSignType("MD5");

  • v.setPaySign(paySign);

  • v.setUrl(url);

  • System.out.println("appId="+WeiXinUtils.APP_ID);

  • System.out.println("timeStamp="+timeStamp);

  • System.out.println("nonceStr="+nonceStr);

  • System.out.println("package=prepay_id="+getPrepayId);

  • System.out.println("signType=MD5");

  • System.out.println("paySign="+paySign);

  • ?
  • ?
  • return writeJson(cmd, SUCCESS_CODE, "查詢成功", v);

  • }

  • ?

    ?

    8.注意paySign簽名的timeStamp、nonceStr與最后發送給微信的timeStamp、nonceStr要一致,MD5加密的sign要轉化成大寫。
    ?

    9.調起微信支付,把appId,timeStamp,nonceStr,package,signType,paySign返回給微信,就OK了,另外回調頁面下次再貼代碼。

    總結

    以上是生活随笔為你收集整理的Java开发微信支付流程及容易入坑的点的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产91欧美 | 日韩中文字幕视频在线观看 | 欧美日韩亚洲在线观看 | 成人av电影在线播放 | 在线国产视频一区 | 国产又粗又猛又黄视频 | 中文字幕你懂的 | 国产91精品久久久久久 | 久草久草久草久草 | 婷婷伊人综合 | 久久综合九色综合欧美就去吻 | 国产97色在线 | 18女毛片| 黄色免费观看 | 99性视频 | 国产区精品区 | 亚洲成aⅴ人片久久青草影院 | 亚洲波多野结衣 | 国产精品美女999 | 久热精品国产 | 国产麻豆果冻传媒在线观看 | 91桃色免费观看 | 亚洲精品福利在线 | 麻豆视频免费入口 | 97超碰人人澡人人爱 | 久久国产精品色av免费看 | 超碰97在线资源站 | 欧美极品久久 | 天天爽夜夜爽人人爽一区二区 | 日韩精品高清视频 | 日韩中文字幕免费电影 | 成人av av在线 | 欧美日韩国产网站 | 久久精品国产一区二区三 | 中文视频一区二区 | 久久久国产精华液 | 国产又粗又猛又黄又爽视频 | 亚洲劲爆av| 综合久久影院 | 亚洲三级av | 国产高清视频在线播放一区 | 国产视频中文字幕 | 五月婷婷亚洲 | 中文字幕在线久一本久 | 日韩在线观看a | 91精品爽啪蜜夜国产在线播放 | 就要色综合 | 黄色的视频网站 | 中文字幕高清视频 | 干av在线 | 高清免费在线视频 | 精品国产乱码一区二 | 一区二区精品视频 | 国产福利91精品一区 | 97人人澡人人爽人人模亚洲 | 成人免费xxx在线观看 | 在线中文字幕一区二区 | 在线 国产一区 | 超碰激情在线 | 在线观看午夜 | 久久久国产一区 | 91精品国产综合久久婷婷香蕉 | 久保带人 | 国产精品永久久久久久久久久 | 综合激情av| 99热这里| 天天操夜夜操天天射 | 欧美无极色 | 狠狠操夜夜操 | 免费在线观看成人小视频 | 99精品视频在线观看视频 | 日韩精品一区二区三区在线播放 | 日本天天色 | 涩涩网站在线观看 | a√资源在线| 天天爽夜夜操 | 天天天天色综合 | 中文av字幕在线观看 | 草莓视频在线观看免费观看 | 日日夜夜网| 久久不卡日韩美女 | 久久涩视频| 欧美激情视频一二三区 | 国产精品永久免费观看 | 精品视频在线免费观看 | 黄色av网站在线免费观看 | 中国一级片视频 | 欧洲精品在线视频 | 免费观看国产视频 | 婷婷综合网 | av千婊在线免费观看 | 日本性动态图 | 日韩高清成人 | 久久黄色影视 | 精品久久一区二区 | 黄色小说18 | 久久国产精品二国产精品中国洋人 | 在线观看av中文字幕 | 久久看片网 | 国产精品一区专区欧美日韩 | 亚洲伊人av | www操操| 国产免费成人 | 在线观看亚洲国产精品 | av色综合网| 日韩精品欧美精品 | 国产成在线观看免费视频 | 丁香六月五月婷婷 | 免费亚洲精品 | 激情文学综合丁香 | 亚洲日本在线一区 | 免费福利在线观看 | 欧美日韩免费视频 | 亚洲四虎在线 | 最近中文字幕 | 久久久www免费电影网 | 国产小视频福利在线 | 国产成人综合在线观看 | 日韩综合第一页 | 91九色国产 | 免费成人黄色av | 日本精品视频网站 | 日韩在线免费 | 成人在线播放网站 | 婷婷中文字幕在线观看 | 成人资源在线 | 国产男女爽爽爽免费视频 | 日韩aⅴ视频 | 亚洲精品中文在线观看 | 欧美一区二区三区不卡 | 91大神精品视频在线观看 | 久久久免费高清视频 | 91丨九色丨蝌蚪丰满 | 久久99中文字幕 | 欧美一级片免费播放 | 91刺激视频 | 一区二区三区中文字幕在线观看 | 免费观看xxxx9999片 | 精品视频国产 | 毛片网站观看 | 福利视频网址 | 天堂在线视频免费观看 | 久免费| 美女黄网站视频免费 | 婷婷综合亚洲 | 亚洲涩涩色 | 黄色免费网站下载 | 91精选在线| 亚洲精品国产拍在线 | 97国产情侣爱久久免费观看 | av高清影院 | 粉嫩av一区二区三区四区在线观看 | 69亚洲视频 | 色婷婷www | 亚洲国产理论片 | 中文字幕在线看视频 | 免费看黄在线网站 | 丁香久久激情 | av官网在线 | 免费一级片视频 | 日韩精品2区 | 97成人在线观看 | 国产视频在线观看一区 | 国产一区二区三区免费观看视频 | 中文字幕在线观看网址 | 久草在线视频在线观看 | 成x99人av在线www | 亚洲精品18p | 五月婷婷激情六月 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久不卡国产精品一区二区 | 久久久久女人精品毛片 | 欧美午夜一区二区福利视频 | 亚洲黄色成人网 | 日韩免费播放 | 黄色大全在线观看 | www.com黄| 夜夜视频欧洲 | 久草精品电影 | 国产玖玖在线 | 99精品久久久久久久 | 欧美日韩精品在线视频 | 国产精品不卡在线观看 | 国产精品一二 | 99久久久国产精品免费99 | 久久综合久久综合这里只有精品 | 一级a毛片高清视频 | 精品久久久精品 | 亚洲国产精品va在线 | 天天色天天操综合网 | av高清网站在线观看 | 日韩av一区二区在线影视 | 久久婷婷精品 | 亚洲午夜精品久久久 | 日韩午夜电影 | 亚洲国产精品成人av | 九九热在线免费观看 | 久久成人免费 | 国产亚洲永久域名 | 中文字幕在线观看免费高清电影 | 欧美激情视频久久 | 国产日韩在线观看一区 | 久久精品国产精品亚洲 | 色永久免费视频 | 叶爱av在线 | 精品99999| 日韩免费大片 | 黄色免费观看网址 | 久久avav | 日韩影视大全 | 欧美性直播 | 中文字幕av最新 | 亚洲精品综合欧美二区变态 | 亚洲污视频 | 97国产| 国产九九热 | 日韩综合精品 | 制服丝袜一区二区 | 在线观看成人福利 | 69视频国产 | 国产精品乱码高清在线看 | av三级av | 色网站黄 | 日日夜夜精品免费观看 | 91成人午夜 | 少妇bbbb揉bbbb日本 | 午夜精品一区二区三区免费 | 亚洲 中文 欧美 日韩vr 在线 | 国产精品久久久久久a | 99色在线观看视频 | 顶级欧美色妇4khd | 蜜臀久久99精品久久久酒店新书 | 亚洲一级片免费观看 | 色综合久久综合中文综合网 | 色黄www小说 | 精品视频在线视频 | 久久久精品欧美一区二区免费 | 国产成人一区二区三区影院在线 | 久久国产精品电影 | 国产在线资源 | 久久99久久99精品 | av福利在线| 国产精品成人一区二区 | 久久久久97国产 | jizz欧美性9| 精品少妇一区二区三区在线 | 亚洲四虎 | 狠狠干在线 | 日本丰满少妇免费一区 | 手机av在线不卡 | 亚洲精品国产综合久久 | 极品久久久久久久 | 成人免费看片网址 | 色就是色综合 | 国产一级精品绿帽视频 | 成人免费观看视频网站 | 黄色成年| 精品视频在线播放 | 久久99操 | 国产精品一区在线 | 久久久久久久av麻豆果冻 | 免费午夜网站 | 成人黄色影片在线 | 国产麻豆视频免费观看 | 久久久在线观看 | 黄网av在线 | 狠狠伊人 | 免费久久精品视频 | 日韩理论在线播放 | 日韩精品国产一区 | 人人插人人搞 | www.日日操.com| 久久99影院 | 天天操天天舔天天爽 | 日韩激情一二三区 | 国产在线不卡一区 | 97成人资源 | 亚洲精品视频偷拍 | 欧美一级淫片videoshd | 一区二区三区在线免费观看 | 99久久婷婷国产 | 99精品在线播放 | 日韩视频一区二区三区在线播放免费观看 | 91精彩视频 | 视频福利在线 | 丁香六月婷 | 欧美日韩99 | 人人搞人人爽 | 国产小视频在线观看 | 狠狠躁夜夜躁人人爽视频 | 免费观看www小视频的软件 | 色综合久久88色综合天天人守婷 | 91视频高清免费 | 中文字幕之中文字幕 | 九九交易行官网 | 狠狠干天天色 | 亚洲精品66| 国产97在线观看 | 97超碰伊人 | 一区二区三区免费在线观看视频 | 国产91综合一区在线观看 | 成片人卡1卡2卡3手机免费看 | 亚洲欧洲精品一区二区精品久久久 | 免费日韩av片| 中国精品一区二区 | 日韩欧美精品在线观看视频 | 国产精品视频 | 热久久在线视频 | 一级黄色毛片 | 久久狠狠亚洲综合 | 免费a视频在线 | 九九综合九九综合 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 亚洲一区二区三区毛片 | 最新中文字幕在线观看视频 | 成人一级片视频 | 亚洲国产精品一区二区久久,亚洲午夜 | 国产精品美女久久久 | 国产手机在线观看 | 成人在线电影观看 | 免费看三级网站 | 国产在线不卡一区 | 欧美一区二区三区不卡 | 日韩欧美成 | 在线免费观看涩涩 | 天堂av网站 | 视频在线一区二区三区 | 性日韩欧美在线视频 | 99久久精品无码一区二区毛片 | 国产精品成人国产乱 | 黄在线免费观看 | 国产精品免费久久久久久 | 亚洲乱码精品久久久久 | 超碰大片 | 日韩精品中文字幕av | 日躁夜躁狠狠躁2001 | 又大又硬又黄又爽视频在线观看 | 国产高清av免费在线观看 | 久久精品视频免费观看 | 欧美日韩1区| 99久久精品久久亚洲精品 | 四虎5151久久欧美毛片 | 国产在线播放观看 | 成人av免费 | 免费观看成年人视频 | 激情五月婷婷综合网 | 97视频免费在线 | 精品国产乱码久久久久久三级人 | 日韩欧美在线高清 | 麻豆一区二区 | 成年人在线免费看片 | av观看在线观看 | 中文字幕 第二区 | 久久免费福利 | 最近能播放的中文字幕 | 91视频免费网站 | 国产一区二区免费看 | 中文字幕av一区二区三区四区 | 亚洲第一久久久 | 久久激情视频网 | 国产乱码精品一区二区蜜臀 | 久久精品99久久久久久 | a级国产片 | 一级片免费观看视频 | 色在线免费视频 | 人人爱人人做人人爽 | 久久国产欧美日韩精品 | 久国产在线播放 | 91久久偷偷做嫩草影院 | 97香蕉久久超级碰碰高清版 | 五月婷婷在线视频观看 | 麻豆视频免费在线观看 | 亚洲综合精品视频 | 欧美精品亚洲精品 | 日本bbbb摸bbbb | 激情深爱五月 | 91视频免费国产 | 黄色免费电影网站 | 96看片| 色综合色综合色综合 | 国产精品一区二区三区99 | 国产精品美女久久久久久久 | 日本精油按摩3 | 久久999久久| 亚洲,播放| 日本中文字幕影院 | www.日韩免费 | 色婷婷成人 | 亚洲免费国产视频 | 最新av在线网站 | 不卡的av电影在线观看 | 欧美精品三级 | 亚洲天天在线日亚洲洲精 | 日本中文字幕网 | 久久久久久毛片 | 日韩黄色在线观看 | www.天天色.com| av 一区二区三区四区 | 精品国产成人av在线免 | 中文在线8新资源库 | 色爱区综合激月婷婷 | 综合在线观看 | 久久在线视频在线 | 在线亚州| 免费av网址在线观看 | 欧美在线视频精品 | 国产中文字幕大全 | 偷拍福利视频一区二区三区 | 欧美人体xx| 中文字幕在线观看一区 | 久久久夜色 | 亚洲毛片一区二区三区 | 国产精品欧美久久久久三级 | 四虎在线观看网址 | 夜夜婷婷 | 欧美日韩中文字幕综合视频 | 久草视频免费看 | 亚洲精品在线播放视频 | 精品久久国产精品 | 国产精品女主播一区二区三区 | 国产精品午夜久久久久久99热 | av在线免费观看不卡 | 亚洲精品视频在线观看免费 | 国产高清视频色在线www | 天天操福利视频 | 国产视频在线免费 | 久久97超碰 | 日韩久久精品一区二区 | 国产麻豆剧传媒免费观看 | 久久久久免费网 | 中文字幕一区二区三区四区在线视频 | 女人高潮一级片 | 五月婷婷激情综合 | 亚洲国产精品一区二区久久,亚洲午夜 | www.色爱| 色综合久久五月 | 中文字幕 国产视频 | 婷婷色影院 | 天天视频色版 | av一级片网站 | www.干| 九九免费在线观看 | 中文字幕视频免费观看 | 日日操日日 | 久久精品99视频 | 日产乱码一二三区别在线 | 日韩一级片网址 | 九九综合久久 | 美女视频免费精品 | 日韩在线观看视频在线 | 久久艹国产视频 | 色综合久久综合网 | 午夜视频欧美 | 中文字幕在线观看免费高清电影 | av亚洲产国偷v产偷v自拍小说 | 夜夜躁日日躁狠狠久久88av | 美女视频黄频 | 亚洲爱视频 | 精品国产aⅴ麻豆 | 欧美最猛性xxx | 国产精品一区二区62 | 国产999视频 | 国产一区二区中文字幕 | 国产精品中文久久久久久久 | 91精品区 | 黄色美女免费网站 | 国产精品密入口果冻 | 久久国语露脸国产精品电影 | 麻豆av一区二区三区在线观看 | 中文字幕在线播放第一页 | 91资源在线免费观看 | 久久国产精品色婷婷 | 欧美成人999 | 成人午夜电影久久影院 | 在线只有精品 | 亚洲黄色免费在线看 | 日韩特黄一级欧美毛片特黄 | 91精品导航 | 中文av在线播放 | 超碰在97 | 久久手机精品视频 | 日韩手机视频 | 天天射天天搞 | av免费黄色 | 欧美aa级 | 久久国产精品免费看 | 精品视频在线观看 | 不卡电影免费在线播放一区 | 蜜臀av性久久久久av蜜臀三区 | 色播五月激情综合网 | 成人午夜性影院 | 免费日韩在线 | 在线中文字幕视频 | 国产精品露脸在线 | 麻豆成人小视频 | 四虎成人精品永久免费av | 中文在线a∨在线 | 精品国产一区二 | 国产aa精品 | 国产在线精品区 | 欧美一级片在线观看视频 | 国产日韩欧美网站 | 国产福利不卡视频 | 久久人人插 | 国产精品毛片一区二区在线看 | 久草免费在线视频 | 99久久国产免费免费 | 久久免费观看少妇a级毛片 久久久久成人免费 | 精品美女久久久久 | 欧美成年性 | 久草在线视频网 | 在线视频 你懂得 | avlulu久久精品| 久草国产在线观看 | 色婷婷伊人 | 免费在线国产视频 | 91免费黄视频 | 婷婷国产v亚洲v欧美久久 | 毛片a级片 | 欧美日韩在线免费视频 | 三级黄色a | 91在线91拍拍在线91 | 最近日本字幕mv免费观看在线 | 麻豆一精品传二传媒短视频 | 亚洲视频电影在线 | 亚洲精品在线视频播放 | 97在线影院 | 深爱激情综合 | 在线综合 亚洲 欧美在线视频 | 日韩综合一区二区三区 | 狠狠插狠狠干 | 六月激情 | 成人一区在线观看 | 国产黄色免费看 | 色婷婷色| 深爱婷婷| 国产精品久久久久永久免费看 | 中文字幕在线字幕中文 | 高清久久久 | 国产韩国精品一区二区三区 | 91高清视频 | 成人影片在线播放 | 色狠狠综合 | 久草视频在线新免费 | 久久精品视频3 | 在线视频你懂得 | 日韩免费福利 | 四虎在线视频 | 亚洲在线视频免费 | 全黄网站 | 在线性视频日韩欧美 | 国产xx视频| 久久精品草 | av久久在线 | 手机在线看片日韩 | 国产中文字幕第一页 | 国产精品成人自产拍在线观看 | 97在线观看免费观看高清 | 亚洲在线激情 | 免费不卡中文字幕视频 | 美腿丝袜一区二区三区 | 久久狠狠一本精品综合网 | 99精品久久久久久久久久综合 | 欧女人精69xxxxxx | 亚洲区二区 | 精品国产免费一区二区三区五区 | 久久综合久久久久88 | 欧美视频不卡 | 国产精品video爽爽爽爽 | 天天色天天射综合网 | 99视频在线精品国自产拍免费观看 | 91精品国产99久久久久久久 | 亚洲午夜久久久综合37日本 | 久久精品一二三区白丝高潮 | 色综合久久网 | 亚洲日本中文字幕在线观看 | 久久观看| 一区二区三区免费在线 | 婷婷精品国产一区二区三区日韩 | 久久成人午夜 | 免费日韩 精品中文字幕视频在线 | 国产精品免费麻豆入口 | 福利电影久久 | 精品国产成人av在线免 | 中文av资源站 | 91av原创| 成人a视频在线观看 | 免费在线观看日韩视频 | 日韩欧美在线综合网 | 色婷婷www| 一区二区 精品 | 国产精品一区欧美 | 激情综合色综合久久 | av电影中文字幕在线观看 | 黄色三级网站 | 亚欧日韩av| 日韩欧美在线不卡 | 欧美日韩中文字幕在线视频 | 免费的国产精品 | 天天射天天干天天 | 99精品视频免费全部在线 | 日本久久久久久久久久久 | 毛片网站在线观看 | 久久午夜精品视频 | 国产一线二线三线性视频 | 欧美精品久久久久久久免费 | 欧美 激情 国产 91 在线 | 91黄色成人| 九热精品| 国产亚洲精品久久久久久久久久久久 | 色97在线 | 天天操天天摸天天射 | 五月开心婷婷 | 国产69精品久久app免费版 | 欧美一区二区三区在线视频观看 | 欧美日本一区 | 免费在线播放黄色 | 激情视频区 | 欧美美女激情18p | 高清av不卡 | 亚洲一区欧美精品 | 久久综合成人网 | 亚洲午夜剧场 | 久久久久人人 | 中国一级特黄毛片大片久久 | 日本黄色免费在线观看 | 中文字幕资源网在线观看 | 中国一级片免费看 | 六月激情久久 | 狠狠干,狠狠操 | 亚洲aaa毛片 | 日韩va欧美va亚洲va久久 | 欧美久久久一区二区三区 | 久久狠狠干 | 国产精品视频最多的网站 | 国产一区二区精 | 婷五月激情 | 国产啊v在线观看 | 在线视频在线观看 | 色999精品 | 91视频 - 88av| 中文字幕免费看 | 日本中文在线观看 | 日韩国产高清在线 | 婷婷5月色 | 349k.cc看片app | 中文字幕日本电影 | 国产美女视频网站 | 91精品在线免费 | 成人在线免费观看视视频 | 国产福利免费看 | 欧美成年人在线观看 | 国产一区国产二区在线观看 | 91精品欧美一区二区三区 | 精品uu| avsex| 国产午夜精品一区二区三区 | 久久九九影视网 | 91视频啊啊啊 | 最新中文字幕视频 | 最新中文字幕在线播放 | 亚洲精品乱码久久久久久写真 | 中文字幕av在线不卡 | 日韩三级在线观看 | 亚洲精品视频中文字幕 | 香蕉精品视频在线观看 | 不卡中文字幕av | 丁香婷婷综合激情 | 中文字幕亚洲综合久久五月天色无吗'' | 毛片视频网址 | 狠狠干在线播放 | 91在线操 | 97超碰福利久久精品 | 欧美日韩性视频 | 婷婷色在线播放 | 精品超碰 | 国产91全国探花系列在线播放 | 日本久久成人中文字幕电影 | 4438全国亚洲精品观看视频 | 天堂av网站 | 丁香视频五月 | 国产精品国产三级国产专区53 | av网站在线免费观看 | 国产精品一区在线观看 | 正在播放五月婷婷狠狠干 | 日韩极品视频在线观看 | 超碰国产在线 | 69精品久久 | 四虎最新域名 | 天天爽夜夜爽人人爽一区二区 | 亚洲 欧美 国产 va在线影院 | 成人在线播放网站 | 偷拍精品一区二区三区 | 天天综合久久综合 | 天天搞夜夜骑 | 中文字幕在线一区观看 | 在线观看完整版 | 丁香久久久 | 天天爱天天干天天爽 | 国产精品国产精品 | 狠狠狠狠狠狠天天爱 | 免费在线黄色av | 最近免费在线观看 | 久久精品中文视频 | 精品国产一区二区三区男人吃奶 | 99久久久国产精品免费99 | 在线电影 一区 | 福利视频区 | 日韩91精品 | 夜夜视频 | 在线免费中文字幕 | 国产成人av电影在线 | 日韩在线免费电影 | 国产精品一区二区久久精品 | 天天干亚洲 | 久久狠狠干 | 夜色在线资源 | 色婷婷一| 美女av在线免费 | 在线中文字幕一区二区 | 久久久国产精品网站 | 91精品日韩 | 亚洲码国产日韩欧美高潮在线播放 | 一区二区三区日韩视频在线观看 | 亚洲精品在线观看的 | 九色视频网 | 国产91影视| 国产日韩av在线 | 中文字幕免费高清av | 久久久亚洲国产精品麻豆综合天堂 | 九九视频免费观看视频精品 | 免费99精品国产自在在线 | 99免费在线视频 | 黄色免费看片网站 | 特黄免费av| 日本精品在线视频 | 午夜三级毛片 | 操操操夜夜操 | 国产一级做a | 最近免费中文视频 | 国产精品午夜免费福利视频 | 十八岁以下禁止观看的1000个网站 | 亚洲成av人片一区二区梦乃 | 亚洲综合色丁香婷婷六月图片 | 精品欧美乱码久久久久久 | 国产精品6999成人免费视频 | 美女在线观看网站 | 制服丝袜成人在线 | 91手机视频 | 六月天色婷婷 | av软件在线观看 | 久久视频免费在线观看 | 国产精品免费视频久久久 | 天天伊人网 | 久久夜色精品国产欧美乱极品 | 最近高清中文在线字幕在线观看 | 久久久久综合网 | 91日本在线播放 | 97免费在线观看视频 | av动图| 国产精品18久久久久vr手机版特色 | 日本久久精品视频 | 成人黄色片免费看 | 超碰在线官网 | 在线亚洲精品 | 97超碰人人在线 | 97成人精品视频在线播放 | 国产亚洲欧美精品久久久久久 | 日韩久久久| 韩国av一区二区三区在线观看 | 午夜美女福利直播 | 亚洲一区二区麻豆 | 日韩视频1 | 国产精品每日更新 | 黄色毛片视频免费观看中文 | 樱空桃av | 永久黄网站色视频免费观看w | 在线免费看黄网站 | 99久精品 | 在线观看日韩精品 | 正在播放国产精品 | 精品久久1| 国产精品门事件 | av在线播放亚洲 | 最近中文字幕在线中文高清版 | 日本在线观看中文字幕 | 伊人婷婷色| 日韩三级.com | 草久久久久久久 | 97网| 日韩v在线| 国产一线天在线观看 | 久久久久亚洲精品 | 国产乱码精品一区二区三区介绍 | 亚洲国产成人高清精品 | 人人干人人上 | 欧美日韩三级 | 国产99久久九九精品免费 | www.午夜色.com | 国产精品久久精品国产 | 久久久午夜精品福利内容 | 国产一区福利在线 | 色噜噜日韩精品欧美一区二区 | 伊人婷婷色 | 综合久久久 | 久久久久久电影 | 久久美女电影 | 色噜噜狠狠狠狠色综合久不 | 免费av影视 | 亚洲综合五月天 | 69久久久 | 欧美成人h版在线观看 | 婷婷丁香自拍 | 色综合久久久 | 日韩三区在线 | 日韩极品在线 | 日本视频高清 | 亚洲视频一区二区三区在线观看 | 三级黄色三级 | 欧美日韩在线观看视频 | 五月婷综合网 | 久久深夜 | 91在线观看欧美日韩 | 天天做天天射 | 狠狠做深爱婷婷综合一区 | 成人久久毛片 | 国内久久精品视频 | 久久人人爽人人爽 | 国产三级视频 | 日韩av一区二区三区 | 国产成人精品av在线 | 成人a视频 | 天天插天天干天天操 | 婷婷99| 亚洲高清在线观看视频 | 亚洲一区av | 最新国产在线观看 | 黄污视频网站大全 | 欧美人zozo| 18pao国产成视频永久免费 | 日韩精品视频第一页 | 欧美激情另类 | av成人黄色 | 亚洲欧美日韩不卡 | 国产高清在线视频 | 91福利视频久久久久 | av高清免费 | 中文字幕你懂的 | 99热播精品 | 午夜成人免费电影 | 日韩久久久久久 | 精品国产不卡 | 中文字幕资源站 | 亚洲天天草 | 天堂久久电影网 | 99久久er热在这里只有精品15 | 天天草天天色 | 91成人免费 | 好看av在线 | 麻豆传媒视频在线免费观看 | www.久久久.cum | 深爱开心激情 | 国产又粗又猛又爽又黄的视频先 | 天天要夜夜操 | 国产精品99久久久精品免费观看 | 欧美日一级片 | 天天操婷婷 | 久久久久成人精品免费播放动漫 | 国产成人亚洲精品自产在线 | 在线黄网站 | 欧美精品一区二区三区一线天视频 | 网站在线观看你们懂的 | 麻豆国产露脸在线观看 | 久久久久国产精品免费网站 | 国产黄色av网站 | 中文一区二区三区在线观看 | 成年人在线播放视频 | 在线观看av网 | 日韩在线国产 | 911精品视频 | 性色av香蕉一区二区 | 国产精品久久久久久久久久久杏吧 | 午夜aaaa | 色国产精品一区在线观看 | 黄色小网站免费看 | 91精品国产91久久久久久三级 | 99日韩精品 | 国产黄在线播放 | 国产成人精品不卡 | 精品久久一区 | 成人国产一区二区 | 欧美精品在线观看一区 | 久草在线视频网 | 一区二区三区www | 国产精品嫩草在线 | www..com黄色片 | 国产在线999 | 91麻豆精品 | 亚洲精品自在在线观看 | 久久久免费播放 | 亚洲四虎在线 | 激情影音先锋 | 欧美午夜剧场 | 国产中文字幕在线观看 | 337p西西人体大胆瓣开下部 | 日韩av一区二区在线播放 | 日日夜精品 | 婷婷网站天天婷婷网站 | 日韩免费在线 | 久久不卡日韩美女 | 97在线公开视频 | 亚洲第一区在线播放 | 国产午夜精品一区二区三区在线观看 | 久久精品婷婷 | 色综合久久88色综合天天免费 | 国产综合在线观看视频 | 99精品国自产在线 | 91丨九色丨高潮丰满 | 久久香蕉一区 | 久久99偷拍视频 | 亚洲精品午夜久久久久久久久久久 | 在线 国产一区 | 六月婷色 | 天天干天天想 | 天天爱天天干天天爽 | 91香蕉国产在线观看软件 | 亚洲精品国精品久久99热 | 国产在线国偷精品产拍免费yy | 中文字幕视频一区二区 | 999久久久欧美日韩黑人 | 伊人宗合网| 久久精品爱爱视频 | aaaaaa毛片| 激情av网 | 久久久 精品 | 国精产品一二三线999 | 九九精品视频在线看 | 久久精品一区二 | 在线视频一区二区 | 在线观看亚洲专区 | 国产专区在线 | 亚洲免费在线播放视频 | 亚洲最新精品 | 国产高清免费在线观看 | 久久久久激情电影 | 久久久国产毛片 | 天天操天天干天天综合网 | 国产成人av电影在线 | av超碰在线观看 | 日本久久高清视频 | 国产日韩在线视频 | 中文字幕在线高清 | 日韩小视频网站 | 91探花国产综合在线精品 | 国产字幕在线看 | 97视频在线看 | 激情图片qvod| 黄网站色成年免费观看 | 日本动漫做毛片一区二区 | 91在线在线观看 | 91精品1区2区 | 午夜国产福利在线 | 五月婷婷在线播放 | 国内精品免费久久影院 | 日韩高清国产精品 | 在线观看视频福利 | 国产黄色看片 | 婷婷六月天天 | 国产成人精品999在线观看 | 精品黄色在线 | 亚洲精品99久久久久中文字幕 | 亚洲在线观看av | 精品一区二区在线免费观看 | 狠狠狠狠狠干 | 91在线看视频免费 | 一本一本久久a久久精品牛牛影视 | 久久激情视频 久久 | 久久精品视 | 综合色婷婷 | 国产一级片网站 | 日本中文字幕在线 | 黄色片软件网站 | 欧美精品亚州精品 | 免费av成人在线 | 国产精品青草综合久久久久99 | 99国产在线视频 | 精品久久久久久亚洲综合网站 | 高潮毛片无遮挡高清免费 | 二区三区毛片 | 国产最新精品视频 | 国产色视频123区 | 中文免费观看 | 97在线观 | 久久久电影网站 | 青青视频一区 | 91网在线| 国产亚洲精品女人久久久久久 | 国产99久久精品一区二区永久免费 |