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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java开发微信支付实践

發(fā)布時(shí)間:2023/12/20 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java开发微信支付实践 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前提條件

1、認(rèn)證的微信公眾號和微信小程序號(http://mp.weixin.qq.com/)

2、微信商戶號(http://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F)

3、帶有公網(wǎng)ip的VPS? 【端口映射用】,也可以使用其他方式映射

4、解析到公網(wǎng)ip的域名(公眾號里面用到JS接口安全域名和網(wǎng)頁授權(quán)域名)

5、映射知識參考這里:利用VPS服務(wù)器搭建一個(gè)FRP內(nèi)網(wǎng)穿透服務(wù)和Web服務(wù)穿透

開發(fā)工具:微信開發(fā)者工具、Intellij?idea

注冊商戶:

(注冊過程比較繁瑣,自行百度,需要營業(yè)執(zhí)照)

需要設(shè)置的地方在商戶平臺? 產(chǎn)品中心->AppID管理設(shè)置公眾號對應(yīng)的AppID

然后去?產(chǎn)品中心->開發(fā)配置? 里面將支付目錄設(shè)置為項(xiàng)目訪問的根目錄即可

(文檔地址:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3)

1.小程序里面的JSAPI支付

流程:

1、先下載官方的支付demo(http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)

其中需要注意的地方是WXPay.java里面的這里:

默認(rèn)加密方式用反了,需要修改成相反的方式。

2、賦值以下工具類和配置:

#######application.properties配置 ################ #小程序 keyAppID=wx*************** AppSecret=************************ #商戶id MchID=********* #商戶key(在微信支付商戶網(wǎng)站自定義的32個(gè)字符的mchkey) MchKey=************************ #終端ip,支持IPV4和IPV6兩種格式的IP地址。調(diào)用微信支付API的機(jī)器IP(這里提供的是VPS的公網(wǎng)ip,其他映射方式需要自己試驗(yàn)) spbill_create_ip=*.*.*.* #異步接收微信支付結(jié)果通知的回調(diào)地址,通知url必須為外網(wǎng)可訪問的url,不能攜帶參數(shù) notifyUrl=http://www.xxx.com/payment/receiveResultOfPay /** * @Description 統(tǒng)一返回類 **/public class ResultUtil implements Serializable {private String code;private String msg;private Object data;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public ResultUtil() {}public ResultUtil(String code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}} /** * @Description 請求和返回的參數(shù)封裝 **/public class ResParamsUtil {public static JSONObject getBodyParamsJSON(httpervletRequest request) {BufferedReader br = null;try {br = request.getReader();String line = br.readLine();if (line == null) {return null;} else {StringBuilder ret = new StringBuilder();ret.append(line);while((line = br.readLine()) != null) {ret.append('\n').append(line);}return JSONObject.parseObject(ret.toString());}} catch (IOException var4) {throw new RuntimeException(var4);}}public static String getBodyParamsXML(httpervletRequest request) {BufferedReader br = null;try {br = request.getReader();String line = br.readLine();line= URLDecoder.decode(line,"UTF-8");if (line == null) {return null;} else {StringBuilder ret = new StringBuilder();ret.append(line);while((line = br.readLine()) != null) {ret.append('\n').append(line);}return ret.toString();}} catch (IOException var4) {throw new RuntimeException(var4);}}}

3、小程序端調(diào)用微信登錄接口,返回code后,再用code發(fā)送到后臺的接口,讓后臺去請求微信官方的接口換取帶有openid的認(rèn)證session(即authsession)

/* app.js */ App({onLaunch: function () {this.startLogin();//調(diào)用登錄 },startLogin:function(){//登錄wx.login({timeout:30000,success: login_res =>{//發(fā)送請求到后臺wx.request({url: this.globalData.baseHost+'/user/getAuthSession',method:'POST',data:{formData:JSON.stringify({code:login_res.code,})},success:function(codesession_res){console.log("登錄Code換取Session結(jié)果:",codesession_res)if(codesession_res.data.code=='200'){wx.setStorage({ key: 'openId', data: codesession_res.data.data });//存儲到本地內(nèi)存中}else{wx.setStorage({ key: 'opanId', data: null });}}}) }})}, globalData: {baseHost:'http://blogs.johngene.cn',}})

Java后臺的用code換取authsession接口:

import com.alibaba.fastjson.JSONObject; import com.hongtai.clientapi.utils.ResParamsUtil; import com.hongtai.clientapi.utils.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.httpervletRequest; @Controller@RequestMapping("/user")public class UserController {@Autowiredprivate RestTemplateBuilder restTemplateBuilder;@Value("${AppID}")private String appId; @Value("${AppSecret}")private String appSecret;/*** 根據(jù)前臺調(diào)用的登錄接口返回的code再次請求查詢帶有openid的authSession登錄信息**/@PostMapping("/getAuthSession")@ResponseBodypublic ResultUtil getAuthSession(httpervletRequest request){JSONObject formData= ResParamsUtil.getBodyParamsJSON(request).getJSONObject("formData");String code=formData.getString("code");if(code==null){return new ResultUtil("1","失敗",null);//返回自定義登錄態(tài)}String url="http://api.weixin.qq.com/sns/jscode2session?appid="+appId+"&secret="+appSecret+"&js_code="+code+"&grant_type=authorization_code";ResponseEntity responseEntity=restTemplateBuilder.build().getForEntity(url, String.class);//sessionJson帶有openid和session_key,安全起見session_key不可返回給小程序if(responseEntity.getStatusCodeValue()==200){JSONObject entityJSON=JSONObject.parseObject(responseEntity.getBody().toString());//獲取到的兩個(gè)有用的東西:openId和sessionKey,其中我只用到openIdString openId=entityJSON.getString("openid");String sessionKey=entityJSON.getString("session_key"); if(openId!=null){return new ResultUtil("200","登錄成功",openId);//返回自定義登錄態(tài)(openId理論上講應(yīng)存在后臺,不返回給前端,只需要返回給前端一個(gè)自定義的userId,讓前端使用userId查詢openId)}else{return new ResultUtil("201","保存用戶信息失敗",null);//返回自定義登錄態(tài)}}else{return new ResultUtil("500","查詢的登錄信息失敗",null);//返回自定義登錄態(tài)}}}

4、調(diào)用支付的頁面index.wxml代碼:

<!-- index.wxml --> <view><button type="primary" bindtap="startPay" style="margin-bottom:15px;">調(diào)用支付</button> </view>

只有一個(gè)按鈕:

index.js代碼:

/* index.js */ const app = getApp() Page({//頁面的初始數(shù)據(jù)data: {},//自定義:支付按鈕事件startPay:function(){/*小程序支付開發(fā)流程:1、小程序內(nèi)調(diào)用登錄接口,獲取到用戶的openid,api參見公共api【小程序登錄API】2、商戶server調(diào)用支付統(tǒng)一下單,api參見公共api【統(tǒng)一下單API】3、商戶server調(diào)用再次簽名,api參見公共api【再次簽名】4、商戶server接收支付通知,api參見公共api【支付結(jié)果通知API】5、商戶server查詢支付結(jié)果,api參見公共api【查詢訂單API】*/let openId=wx.getStorageSync("openId") || [];wx.request({url: app.globalData.baseHost + '/payment/doUnifiedOrder',header: {"Content-Type": "application/json;charset=UTF-8"},data: {formData:JSON.stringify({openId : openId})},method: 'POST',dataType: 'json',responseType: 'text',success: function(res) {console.log("服務(wù)端返回:",res);var c=res.data;wx.requestPayment({timeStamp: res.data.data.timeStamp,nonceStr: res.data.data.nonceStr,package: res.data.data.package,signType: res.data.data.signType,paySign: res.data.data.paySign,success(res) {console.log("統(tǒng)一下單接口成功:",res);},fail(res) {console.log("統(tǒng)一下單接口失敗:",res);}});},fail: function(res) {console.log("請求服務(wù)失敗:",res);},complete: function(res) {},});},//生命周期函數(shù)--監(jiān)聽頁面加載onLoad: function (options) {},//生命周期函數(shù)--監(jiān)聽頁面初次渲染完成onReady: function () {},//生命周期函數(shù)--監(jiān)聽頁面顯示onShow: function () {},//生命周期函數(shù)--監(jiān)聽頁面隱藏onHide: function () {},//生命周期函數(shù)--監(jiān)聽頁面卸載onUnload: function () {},//頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作onPullDownRefresh: function () {},//頁面上拉觸底事件的處理函數(shù)onReachBottom: function () {},//用戶點(diǎn)擊右上角分享onShareAppMessage: function () {} })

自定義微信支付配置類MyConfig.java,繼承自微信支付API Demo 中的WxPayConfig.java

import java.io.ByteArrayInputStream; import java.io.InputStream;/*** 微信支付配置類*/ public class MyConfig extends WXPayConfig {private String appid;private String mch_id;private String mch_key;private byte[] certData;public MyConfig() throws Exception {}public MyConfig(String appid, String mch_id, String mch_key) {this.appid = appid;this.mch_id = mch_id;this.mch_key = mch_key;}@Overridepublic String getAppID() {return this.appid;}@Overridepublic String getMchID() {return this.mch_id;}@Overridepublic String getKey() {return this.mch_key;}@Overridepublic InputStream getCertStream() {ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);return certBis;}@Overridepublic int getHttpConnectTimeoutMs() {return 8000;}@Overridepublic int getHttpReadTimeoutMs() {return 10000;}@OverrideIWXPayDomain getWXPayDomain() {return new IWXPayDomain() {@Overridepublic void report(String domain, long elapsedTimeMillis, Exception ex) {}@Overridepublic DomainInfo getDomain(WXPayConfig config) {return new DomainInfo("api.mch.weixin.qq.com", false);}};} }

小程序JSAPI支付后臺接口WxPayController.java:

import com.alibaba.fastjson.JSONObject; import com.hongtai.clientapi.utils.ResParamsUtil; import com.hongtai.clientapi.utils.ResultUtil; import com.hongtai.clientapi.utils.wxpay.MyConfig; import com.hongtai.clientapi.utils.wxpay.WXPay; import com.hongtai.clientapi.utils.wxpay.WXPayConstants; import com.hongtai.clientapi.utils.wxpay.WXPayUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;import javax.servlet.http.httpervletRequest; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map;/*** 小程序JSAPI支付**/ @Controller @RequestMapping("/payment") public class WxPayController {/**支付流程1、小程序內(nèi)調(diào)用登錄接口,獲取到用戶的openid,api參見公共api【小程序登錄API】2、商戶server調(diào)用支付統(tǒng)一下單,api參見公共api【統(tǒng)一下單API】3、商戶server調(diào)用再次簽名,api參見公共api【再次簽名】4、商戶server接收支付通知,api參見公共api【支付結(jié)果通知API】5、商戶server查詢支付結(jié)果,api參見公共api【查詢訂單API】*/@Value("${AppID}")private String appid;@Value("${AppSecret}")private String appsecret;@Value("${MchID}")private String mch_id;@Value("${MchKey}")private String mch_key;@Value("${notifyUrl}")private String notifyUrl;@Value("${spbill_create_ip}")private String spbill_create_ip;/*** 后臺下單接口(里面自動調(diào)用了微信統(tǒng)一下單接口)**/@RequestMapping(value = "/doUnifiedOrder", method = RequestMethod.POST)@ResponseBodypublic ResultUtil doUnifiedOrder(httpervletRequest request) {JSONObject formData= ResParamsUtil.getBodyParamsJSON(request).getJSONObject("formData");String openId=formData.getString("openId");MyConfig config = null;WXPay wxpay =null;try {config = new MyConfig(appid,mch_id,mch_key);wxpay= new WXPay(config);} catch (Exception e) {e.printStackTrace();}//獲取客戶端的ip地址//獲取本機(jī)的ip地址InetAddress addr = null;try {addr = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}String spbill_create_ip = addr.getHostAddress();//終端ip,支持IPV4和IPV6兩種格式的IP地址。調(diào)用微信支付API的機(jī)器IPint total_fee=1;//支付金額,需要使用字符串類型,否則后面的簽名會失敗,微信支付提交的金額是不能帶小數(shù)點(diǎn)的,且是以分為單位String body = "費(fèi)用支付";//商品描述String out_trade_no= WXPayUtil.generateNonceStr();//商戶訂單號String nonceStr=WXPayUtil.generateNonceStr();//獲取隨機(jī)字符串//統(tǒng)一下單接口參數(shù)HashMap<String, String> data = new HashMap<>();data.put("body", body);//商品描述data.put("out_trade_no",out_trade_no);//商戶訂單號(隨機(jī)生成)data.put("total_fee", String.valueOf(total_fee));//支付金額data.put("spbill_create_ip", spbill_create_ip);//終端ip,支持IPV4和IPV6兩種格式的IP地址。調(diào)用微信支付API的機(jī)器IPdata.put("notify_url", notifyUrl);//異步接收微信支付結(jié)果通知的回調(diào)地址,通知url必須為外網(wǎng)可訪問的url,不能攜帶參數(shù)data.put("trade_type","JSAPI");//交易類型data.put("openid", openId);//用戶openid,trade_type=JSAPI,此參數(shù)必傳data.put("nonce_str",nonceStr);try {Map<String, String> rMap = wxpay.unifiedOrder(data);//調(diào)用統(tǒng)一下單apiSystem.out.println("統(tǒng)一下單接口返回: " + rMap);String return_code = rMap.get("return_code");String result_code = rMap.get("result_code");Long timeStamp = System.currentTimeMillis() / 1000;//獲取時(shí)間戳if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {Map resultMap=new HashMap();String prepayid = rMap.get("prepay_id");resultMap.put("appId",appid);//appId,再次簽名中的appId的i要大寫不能寫成appidresultMap.put("timeStamp", timeStamp + "");//這邊要將返回的時(shí)間戳轉(zhuǎn)化成字符串,不然小程序端調(diào)用wx.requestPayment方法會報(bào)簽名錯(cuò)誤resultMap.put("nonceStr", nonceStr);//隨機(jī)字符串必須和統(tǒng)一下單接口使用的隨機(jī)字符串相同resultMap.put("package", "prepay_id="+prepayid);resultMap.put("signType", WXPayConstants.MD5);//MD5或者HMAC-SHA256String sign = WXPayUtil.generateSignature(resultMap, mch_key);//再次簽名,這個(gè)簽名用于小程序端調(diào)用wx.requesetPayment方法String xml=WXPayUtil.generateSignedXml(resultMap,mch_key);resultMap.put("paySign", sign);System.out.println("生成的簽名paySign : "+ sign);return new ResultUtil("200","",resultMap);}else{return new ResultUtil("500","",null);}} catch (Exception e) {e.printStackTrace();return new ResultUtil("500","",null);}}/*** @Author zj* @Description 接收成功后返回的支付結(jié)果* @Date 2020/07/17 15:13:01* @Param []* @return void**/@RequestMapping(value = "/receiveResultOfPay")@ResponseBodypublic void receiveResultOfPay(httpervletRequest request){System.out.println("支付成功!!!");String xmlData=ResParamsUtil.getBodyParamsXML(request);System.out.println(xmlData);Map<String,String> map=null;try {map=WXPayUtil.xmlToMap(xmlData);} catch (Exception e) {e.printStackTrace();}//此處map就是接收到的支付成功的結(jié)果,同樣的通知可能會多次,發(fā)送給商戶系統(tǒng)。商戶系統(tǒng)必須能夠正確處理重復(fù)的通知} }

2.公眾號里面的JSAPI支付

公眾號調(diào)用該支付與小程序調(diào)用支付的不同之處在于小程序直接可以調(diào)用登錄api獲取code然后利用code去后臺調(diào)用統(tǒng)一下單接口,而公眾號的網(wǎng)頁無法直接調(diào)用,需要通過JSSDK調(diào)用。

微信JSSDK開發(fā)文檔地址:http://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

微信支付文檔地址:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1

步驟如下:1、公眾號開發(fā)配置

需要點(diǎn)擊一下重置來獲取AppSecret和ip白名單,白名單需要設(shè)置成測試環(huán)境下的公網(wǎng)ip(百度ip地址即可查看公網(wǎng)ip)和服務(wù)器對應(yīng)的ip(上線后用到)

2、網(wǎng)頁授權(quán)配置

在接口權(quán)限目錄中找到? 網(wǎng)頁服務(wù)->網(wǎng)頁授權(quán)->點(diǎn)擊后面的修改按鈕

3、關(guān)聯(lián)商戶號

關(guān)聯(lián)成功后可以看到如下界面:

?

進(jìn)入重點(diǎn):

思路

? 先獲取到微信的網(wǎng)頁授權(quán),利用網(wǎng)頁授權(quán)接口返回的code和state,用后臺再次請求通過code換取網(wǎng)頁授權(quán)access_token接口,完成授權(quán)后重定向到支付頁面并將openid、appId等信息帶過去,支付頁面中用appid等信息獲取簽名后初始化JSSDK,請求后臺的支付接口,利用后臺的支付接口請求微信統(tǒng)一下單接口進(jìn)行支付操作,后臺等待支付成功消息。

簡化思路

? 網(wǎng)頁授權(quán):

第一步:用戶同意授權(quán),獲取code

第二步:通過code換取網(wǎng)頁授權(quán)access_token

? 調(diào)用JSSDK:

直接初始化JSSDK

? 調(diào)用支付:

直接調(diào)用后臺支付接口,讓后臺完成操作

開始寫代碼:

工具類和上面小程序JSAPI支付里面的兩個(gè)工具類以外還有一個(gè)簽名用的工具類WxUtil.java

application.properties配置類如下:

#商戶id MchID=******** #商戶key MchKey=********#終端ip,支持IPV4和IPV6兩種格式的IP地址。調(diào)用微信支付API的機(jī)器IP(要與實(shí)際調(diào)用的機(jī)器相同) spbill_create_ip=*.*.*.*#異步接收微信支付結(jié)果通知的回調(diào)地址,通知url必須為外網(wǎng)可訪問的url,不能攜帶參數(shù) notifyUrl=http://www.xxx.com/payment/receiveResultOfPay#公眾號Token token=**********#公眾號appid app_id=********** app_secret=**********

簽名工具類:WxUtil.java

import org.springframework.http.ResponseEntity;import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Iterator; import java.util.Map; import java.util.TreeMap;/** * @Description 公眾號的weixin工具類 * @Date 2020/07/28 15:05:25 * @Param * @return **/ public class WxUtils {/*** @Description 將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串* @Date 2020/07/27 19:38:02* @Param [mByte]* @return java.lang.String**/public static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}/*** @Description 將數(shù)組中的內(nèi)容進(jìn)行字典排序也可以直接使用Arrays.sort(arr);* @Date 2020/07/27 19:37:40* @Param [a]* @return void**/public static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}}/*** @Description 將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串* @Date 2020/07/27 19:38:39* @Param [byteArray]* @return java.lang.String**/public static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** @Description 轉(zhuǎn)換頁面的code為session信息(session中帶有openid等信息)* @Date 2020/07/29 17:45:38* @Param [code, appId, appSecret]* @return org.springframework.http.ResponseEntity**/public static ResponseEntity code2Session(String code,String appId,String appSecret){System.out.println("code2Session----appId:"+appId+",appSecret:"+appSecret);return HttpUtil.getFormRequest("http://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId+"&secret="+appSecret+"&code="+code+"&grant_type=authorization_code");}/*** @Description 獲取JSSDKd 簽名* @Date 2020/07/29 17:46:52* @Param []* @return java.lang.String**/public static String getJsSDKSignature(String noncestr,String jsapi_ticket,Long timestamp,String url){/*簽名生成規(guī)則如下:參與簽名的字段包括:noncestr(隨機(jī)字符串),有效的jsapi_ticket, timestamp(時(shí)間戳),url(當(dāng)前網(wǎng)頁的URL,不包含#及其后面部分) 。步驟如下:1)對所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序),2)使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數(shù)名均為小寫字符。3)對string1作sha1加密,字段名和字段值都采用原始值,不進(jìn)行URL 轉(zhuǎn)義注意事項(xiàng)簽名用的noncestr和timestamp必須與前端的wx.config中的nonceStr和timestamp相同。簽名用的url必須是調(diào)用JS接口頁面的完整URL。出于安全考慮,開發(fā)者必須在服務(wù)器端實(shí)現(xiàn)簽名的邏輯*///利用TreeMap 默認(rèn)排序規(guī)則:按照key的字典順序來排序(升序)TreeMap<String,Object> treeMap=new TreeMap<>();treeMap.put("noncestr",noncestr);treeMap.put("jsapi_ticket",jsapi_ticket);treeMap.put("timestamp",timestamp);treeMap.put("url",url);StringBuffer stringBuffer=new StringBuffer();Iterator<Map.Entry<String, Object>> it = treeMap.entrySet().iterator();while(it.hasNext()) {Map.Entry<String, Object> entry = it.next();stringBuffer.append(entry.getKey()).append("=").append(entry.getValue()).append("&");}String string1=stringBuffer.substring(0,stringBuffer.length()-1);String signature = null;MessageDigest md=null;try {md = MessageDigest.getInstance("SHA-1");// 將字符串string1進(jìn)行sha1加密byte[] digest = md.digest(string1.getBytes());signature = WxUtils.byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return signature;} }

其中用到的HttpUtil.java

import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate;import java.util.Map;/** * @Description Http工具類 * @Date 2020/07/03 10:50:55 * @Param * @return **/ @Component public class HttpUtil {private static RestTemplate getRestTemplate() {return new RestTemplateBuilder().build();}private static HttpHeaders getHttpHeaders(){return new HttpHeaders();}/*** @Description POST的方式發(fā)送json格式的請求* @Date 2020/07/03 10:43:32* @Param [url, params]* @return java.lang.String**/public static String postJsonRequest(String url, Map<String,Object> params){RestTemplate restTemplate=getRestTemplate();HttpHeaders httpHeaders=getHttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(params, httpHeaders);ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity,String.class);return responseEntity.getBody();}/*** @Description POST的方式發(fā)送表單格式的請求* @Date 2020/07/03 10:49:37* @Param [url, params]* @return java.lang.String**/public static String postFormRequest(String url, MultiValueMap<String,Object> params){RestTemplate restTemplate=getRestTemplate();HttpHeaders httpHeaders=getHttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, httpHeaders);ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity,String.class);return responseEntity.getBody();}/*** @Description get的方式發(fā)送表達(dá)格式的請求* @Date 2020/07/03 10:50:20* @Param [url]* @return java.lang.String**/public static ResponseEntity getFormRequest(String url){RestTemplate restTemplate = getRestTemplate();ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);return responseEntity;} }

程序入口類:IndexController.java

import com.alibaba.fastjson.JSONObject; import com.hongtai.driverapi.utils.WxUtils; import com.sun.deploy.net.URLEncoder; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.httpervletRequest; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays;/** * @Description 程序入口 * @Date 2020/08/31 17:19:38 **/ @Controller public class IndexController {@Value("${app_id}")private String app_id;@Value("${app_secret}")private String app_secret;/*** @Description 跳轉(zhuǎn)到授權(quán)頁* @Date 2020/07/28 15:40:27* @Param [model]* @return java.lang.String**/@RequestMapping("/")public String auth(Model model){model.addAttribute("app_id",app_id);System.out.println("app_id:"+app_id);try {String url="http://blogs.johngene.cn/authCallBack";String redirect_uri= URLEncoder.encode(url,"UTF-8");System.out.println("redirect_uri:"+redirect_uri);model.addAttribute("redirect_uri",redirect_uri);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return "auth";}/*** @Description 跳轉(zhuǎn)到微信支付測試頁面* @Date 2020/07/19 18:15:25* @Param []* @return java.lang.String**/@RequestMapping("/authCallBack")public String authCallBack(String code, String state, httpervletRequest request){System.out.println("網(wǎng)頁授權(quán)獲得:code:"+code+",state:"+state);//code換取Session信息,應(yīng)保留在服務(wù)器,需要時(shí)查詢,過期時(shí)重新獲取ResponseEntity responseEntity= WxUtils.code2Session(code,app_id,app_secret);String openid="";String access_token="";JSONObject entityJSON=null;if(responseEntity.getStatusCodeValue()==200) {entityJSON = JSONObject.parseObject(responseEntity.getBody().toString());access_token = entityJSON.getString("access_token");//這里的access_token是網(wǎng)頁的access_token并不是公眾號的基本access_tokenString expires_in = entityJSON.getString("expires_in");String refresh_token = entityJSON.getString("refresh_token");openid = entityJSON.getString("openid");String scope = entityJSON.getString("scope");System.out.println("根據(jù)網(wǎng)頁授權(quán)獲取的code再次請求換取的session信息,access_token:"+access_token+",expires_in:"+expires_in+"" +",refresh_token:"+refresh_token+",openid:"+openid+",scope:"+scope);}else if(responseEntity.getStatusCodeValue()==40029){System.out.println("網(wǎng)頁授權(quán)獲得的code無效!");}request.getSession().setAttribute("openid",openid);//attr.addAttribute("access_token",access_token);//網(wǎng)頁授權(quán)獲取的access_token只為進(jìn)一步獲取用戶信息,別無他用return "redirect:/toWxPay";}/*** @Description 跳轉(zhuǎn)到微信JSAPI支付頁面* @Date 2020/07/28 23:01:38* @Param [code, state, model]* @return java.lang.String**/@RequestMapping("/toWxPay")public String wxPay(Model model,httpervletRequest request){String openid=request.getSession().getAttribute("openid")+"";model.addAttribute("openid",openid);model.addAttribute("app_id",app_id);System.out.println("已經(jīng)重定向到了wx_pay頁面,openid:"+openid);return "wx_pay";}/*** @Description JS接口安全域名和網(wǎng)頁安全域名驗(yàn)證* @Date 2020/07/26 09:50:37* @Param []* @return java.lang.String**/@RequestMapping("/MP_verify_xJwVNVyXJG2YvgOj.txt")@ResponseBodypublic String validateDomainName(){//根據(jù)MP_verify_xJwVNVyXJG2YvgOj.txt的文件內(nèi)容返回,這里是按照文件內(nèi)容造假,直接返回return "******";//這里需要復(fù)制出根據(jù)MP_verify_xJwVNVyXJG2YvgOj.txt文件內(nèi)容,我用*號代替了}//----------------分割線,下面的是用來驗(yàn)證服務(wù)器配置的,和支付無關(guān)-----------------@Value("${token}")private String token;/*** @Description 服務(wù)器配置對應(yīng)的接口:檢驗(yàn)微信公眾號Token的地址(接入微信后臺的驗(yàn)證器)這里暫時(shí)用不到* signature:微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。* timestamp:時(shí)間戳* nonce:隨機(jī)數(shù)* echostr:隨機(jī)字符串* @Date 2020/07/27 19:17:49* @Param [signature, timestamp, nonce, echostr]* @return java.lang.String**/@RequestMapping("/checkToken")@ResponseBodypublic String checkToken(String signature,String timestamp,String nonce,String echostr){// 1)將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序// 2)將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密// 3)開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信// 4)成功則將echostr原樣返回,失敗則不返回或返回其他String[] arr = new String[] { token, timestamp, nonce };// 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序Arrays.sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = WxUtils.byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 將sha1加密后的字符串可與signature對比Boolean result=tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;System.out.println("Token驗(yàn)證結(jié)果:"+result);//通過檢驗(yàn)signature對請求進(jìn)行校驗(yàn),若校驗(yàn)成功則原樣返回echostr,表示接入成功,否則接入失敗if(result){return echostr;}else{return "";}} }

后臺支付接口和獲取初始化JSSDK所需要的signature簽名接口

import com.alibaba.fastjson.JSONObject; import com.github.wxpay.sdk.WXPayConstants; import com.hongtai.driverapi.service.WxTokenService; import com.hongtai.driverapi.utils.*; import com.hongtai.driverapi.utils.wxpay.MyConfig; import com.hongtai.driverapi.utils.wxpay.WXPay; import com.hongtai.driverapi.utils.wxpay.WXPayUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.httpervletRequest; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map;/** * 公眾號JSAPI支付 **/ @Controller @RequestMapping("/payment") public class WxPayOfficialController {/*1、商戶server調(diào)用統(tǒng)一下單接口請求訂單,api參見公共api【統(tǒng)一下單API】2、商戶server接收支付通知,api參見公共api【支付結(jié)果通知API】3、商戶server查詢支付結(jié)果,api參見公共api【查詢訂單API】*/@Value("${app_id}")private String app_id;@Value("${app_secret}")private String app_secret;@Value("${MchID}")private String mch_id;@Value("${MchKey}")private String mch_key;@Value("${notifyUrl}")private String notifyUrl;@Value("${spbill_create_ip}")private String spbill_create_ip;/*** @Description 公眾號統(tǒng)一下單接口* 注意:需要公眾號設(shè)置的地方:ip白名單、JS接口安全域名、網(wǎng)頁授權(quán)域名* @Date 2020/07/27 22:14:29**/@RequestMapping(value = "/doUnifiedOrder", method = RequestMethod.POST)@ResponseBodypublic ResultUtil doUnifiedOrder(httpervletRequest request) {JSONObject formData=ResParamsUtil.getBodyParamsJSON(request);String openid=formData.getString("openid");MyConfig config = null;WXPay wxpay =null;try {config = new MyConfig(app_id,mch_id,mch_key);wxpay= new WXPay(config);} catch (Exception e) {e.printStackTrace();}//獲取客戶端的ip地址//獲取本機(jī)的ip地址InetAddress addr = null;try {addr = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}String spbill_create_ip = addr.getHostAddress();//終端ip,支持IPV4和IPV6兩種格式的IP地址。調(diào)用微信支付API的機(jī)器IP//支付金額,需要使用字符串類型,否則后面的簽名會失敗,微信支付提交的金額是不能帶小數(shù)點(diǎn)的,且是以分為單位int total_fee=1;//商品描述String body = "費(fèi)用支付";//商戶訂單號String out_trade_no= WXPayUtil.generateNonceStr();String nonceStr=WXPayUtil.generateNonceStr();//統(tǒng)一下單接口參數(shù)HashMap<String, String> data = new HashMap<>();data.put("nonce_str",nonceStr);//隨機(jī)字符串data.put("body",body);//商品描述data.put("out_trade_no",out_trade_no);//商戶訂單號(隨機(jī)生成)data.put("total_fee", String.valueOf(total_fee));//支付金額data.put("spbill_create_ip", spbill_create_ip);//終端ip,支持IPV4和IPV6兩種格式的IP地址。調(diào)用微信支付API的機(jī)器IPdata.put("notify_url", notifyUrl);//異步接收微信支付結(jié)果通知的回調(diào)地址,通知url必須為外網(wǎng)可訪問的url,不能攜帶參數(shù)data.put("trade_type","JSAPI");//交易類型data.put("openid", openid);//用戶openid,trade_type=JSAPI,此參數(shù)必傳try {Map<String, String> rMap = wxpay.unifiedOrder(data);//調(diào)用統(tǒng)一下單apiSystem.out.println("統(tǒng)一下單接口返回: " + rMap);String return_code = rMap.get("return_code");String result_code = rMap.get("result_code");Long timeStamp = System.currentTimeMillis() / 1000;//獲取時(shí)間戳if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {Map resultMap=new HashMap();String prepayid = rMap.get("prepay_id");resultMap.put("appId",app_id);//appIdresultMap.put("timeStamp", timeStamp + "");//這邊要將返回的時(shí)間戳轉(zhuǎn)化成字符串,不然小程序端調(diào)用wx.requestPayment方法會報(bào)簽名錯(cuò)誤resultMap.put("nonceStr", nonceStr);//隨機(jī)字符串必須和統(tǒng)一下單接口使用的隨機(jī)字符串相同resultMap.put("package", "prepay_id="+prepayid);resultMap.put("signType", WXPayConstants.MD5);//MD5或者HMAC-SHA256String sign = WXPayUtil.generateSignature(resultMap, mch_key);//再次簽名,這個(gè)簽名用于小程序端調(diào)用wx.requesetPayment方法String xml=WXPayUtil.generateSignedXml(resultMap,mch_key);resultMap.put("paySign", sign);System.out.println("生成的簽名paySign : "+ sign);return new ResultUtil("200","",resultMap);}else{return new ResultUtil("500","",null);}} catch (Exception e) {e.printStackTrace();return new ResultUtil("500","",null);}}/*** @Description 接收支付結(jié)果* @Date 2020/07/17 15:13:01* @Param []* @return void**/@RequestMapping(value = "/receiveResultOfPay")@ResponseBodypublic void receiveResultOfPay(httpervletRequest request){System.out.println("支付成功!!!");String xmlData=ResParamsUtil.getBodyParamsXML(request);System.out.println(xmlData);Map<String,String> map=null;try {map=WXPayUtil.xmlToMap(xmlData);} catch (Exception e) {e.printStackTrace();}//此處map就是接收到的支付成功的結(jié)果,同樣的通知可能會多次(經(jīng)過測試為13次左右)發(fā)送給商戶系統(tǒng)。商戶系統(tǒng)必須能夠正確處理重復(fù)的通知}@Autowiredprivate WxTokenService wxAccessTokenService;/*** @Description 使用JSSDK前需要獲取的signature簽名數(shù)據(jù)* @Date 2020/07/29 16:00:03* @Param []**/@RequestMapping(value = "/getSignature")@ResponseBodypublic ResultUtil getSignature(String url){//url是頁面完整的url(請?jiān)诋?dāng)前頁面alert(location.href.split('#')[0])確認(rèn)),包括'http(s)://'部分,以及'?'后面的GET參數(shù)部分,但不包括'#'hash后面的部分。if(url.indexOf("#")>0){url=url.split("#")[0];}Map<String,Object> map=new HashMap<>();JSONObject accessTokenJson=wxAccessTokenService.findAccessToken();String access_token=accessTokenJson.getString("access_token");JSONObject jsapiTicketJson=wxAccessTokenService.findJsAPITicket(access_token);String jsapi_ticket=jsapiTicketJson.getString("ticket");String noncestr=WXPayUtil.generateNonceStr();Long timestamp = System.currentTimeMillis() / 1000;//獲取時(shí)間戳String signature= WxUtils.getJsSDKSignature(noncestr,jsapi_ticket,timestamp,url);if(StringTools.isNotEmpty(signature)){map.put("timestamp",timestamp);map.put("noncestr",noncestr);map.put("signature",signature);//map.put("jsapi_ticket",jsapi_ticket);//map.put("url",url);return new ResultUtil("200","",map);}else{return new ResultUtil("500","",null);}} }

下面來寫頁面

第一個(gè)入口頁面代碼:auth.html?只是用來直接跳轉(zhuǎn)以獲取微信的授權(quán),這里采用靜默授權(quán)snsapi_base,另一種授權(quán)snsapi_userinfo參考官網(wǎng):http://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0

<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head><meta charset="UTF-8"> </head> <body> <div id="app"></div> </body> <script>/* 直接跳轉(zhuǎn)到微信靜默授權(quán) */let app_id='[[${app_id}]]';let redirect_uri="[[${redirect_uri}]]";let url='http://open.weixin.qq.com/connect/oauth2/authorize?' +'appid='+app_id+'&redirect_uri='+redirect_uri+'&response_type=code' +'&scope=snsapi_base' +'&state=STATE#wechat_redirect';console.log(url);window.location.href=url; </script> </html>

支付測試頁面:wx_pay.html

<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head><meta charset="UTF-8"><title>微信JSAPI支付測試</title><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0,user-scalable=no"><!-- mintui --><link rel="stylesheet" href="http://unpkg.com/mint-ui/lib/style.css"> </head> <body> <div id="app"><mt-button size="normal" type="primary" @click.native="startPay">發(fā)起支付</mt-button> </div> </body> <!-- jquery --> <script src="/js/jquery.js"></script> <!-- vue --> <script src="http://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!-- mintui --> <script src="http://unpkg.com/mint-ui/lib/index.js"></script> <!-- 引入js-sdk --> <script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script>let vue=new Vue({el:'#app',data(){return {openid:'',appid:'',}},mounted(){this.openid="[[${openid}]]";this.appid="[[${app_id}]]";console.log("openid:",this.openid,",appid:"+this.appid);this.initJSSDK();},methods:{//初始化jssdkinitJSSDK(){let _this=this;$.ajax({//請求服務(wù)器進(jìn)行簽名type:'post',dataType:'json',url:'/payment/getSignature',data:{url:window.location.href,},success:function(res){console.log("initJSSDK:",res);if(res.code==200){wx.config({debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時(shí)才會打印。appId: _this.appid, // 必填,公眾號的唯一標(biāo)識timestamp: res.data.timestamp, // 必填,生成簽名的時(shí)間戳nonceStr: res.data.noncestr, // 必填,生成簽名的隨機(jī)串signature: res.data.signature,// 必填,簽名jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表});}else{}},error:function(res){console.error(res);}});},//發(fā)起支付startPay(){console.log("發(fā)起支付");let _this=this;$.ajax({//調(diào)用統(tǒng)一下單接口type:'post',dataType:'json',url:'/payment/doUnifiedOrder',data:JSON.stringify({openid : _this.openid}),success:function(res){console.log(res)if(res.code==200){wx.chooseWXPay({//開始支付timestamp: res.data.timeStamp, // 支付簽名時(shí)間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付后臺生成簽名使用的timeStamp字段名需大寫其中的S字符nonceStr: res.data.nonceStr, // 支付簽名隨機(jī)串,不長于 32 位package: res.data.package, // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=\*\*\*)signType: 'MD5', // 簽名方式,默認(rèn)為'SHA1',使用新版支付需傳入'MD5'paySign: res.data.paySign, // 支付簽名success: function (res) {// 支付成功后的回調(diào)函數(shù)console.log("支付成功:",res);}});}else{}},error:function(res){console.error(res)}});},}}) </script> </html>

最后用手機(jī)測試支付就可以了,有什么不正確的地方或者缺少的工具類歡迎到評論區(qū)提醒!

總結(jié)

以上是生活随笔為你收集整理的Java开发微信支付实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

日韩一区二区三区在线看 | 国内免费久久久久久久久久久 | 日本在线观看一区 | 国产精品 国内视频 | 国产精品九九久久99视频 | 国产视频黄 | 伊人射| av免费电影在线观看 | 久久久国产毛片 | 日韩影片在线观看 | 一本一道久久a久久综合蜜桃 | 亚洲韩国一区二区三区 | 中文字幕乱码在线播放 | 久精品视频 | 日韩精品在线视频免费观看 | 久久在线免费视频 | 国产精品成人av电影 | 天天射天天操天天 | 免费观看日韩 | 久热av在线 | 日韩视频一区二区在线观看 | 日韩高清精品免费观看 | 欧美日韩精品免费观看视频 | 四虎在线免费观看 | 国产精品成人在线 | 久久精品亚洲 | 在线99 | 激情影音 | av先锋影音少妇 | 欧美激情亚洲综合 | 91人人射| 91精品国产一区 | 去看片 | 一区二区中文字幕在线 | 精品国产乱码久久久久久浪潮 | 二区在线播放 | 国产二级视频 | 欧美精品一二三 | 免费看黄电影 | 国产裸体bbb视频 | 射九九 | 免费在线观看污网站 | 最近免费观看的电影完整版 | 日韩亚洲欧美中文字幕 | 中文字幕在线日亚洲9 | 成人一级片视频 | 久久九九久久精品 | 天天操天天色天天射 | 亚洲丁香久久久 | 亚洲精品国久久99热 | 国产极品尤物在线 | 国内精品久久久久久久97牛牛 | 午夜视频播放 | 狠狠色噜噜狠狠狠狠2021天天 | 最新中文字幕 | 久久黄色小说视频 | 亚洲欧美va | 欧美视频www | 成年人视频免费在线 | 久久久久久高潮国产精品视 | www.av小说 | 日韩剧情 | va视频在线观看 | 中文字幕精品一区二区三区电影 | 日韩av成人 | 国产小视频免费在线观看 | 国产亚洲精品久久久久动 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久精品艹 | 91视频 - 88av | 久久精品国产精品亚洲精品 | 亚洲人人网| 999久久久久久久久 69av视频在线观看 | 波多野结衣一区三区 | www免费在线观看 | 免费在线成人 | 在线av资源 | 日韩精品中文字幕在线 | 9999亚洲| 日韩精品极品视频 | 波多野结衣精品视频 | 狠狠躁夜夜a产精品视频 | 蜜桃视频日韩 | 日韩高清在线观看 | 色网站中文字幕 | 欧美最爽乱淫视频播放 | 亚洲精品国产精品国 | 国产手机精品视频 | 日韩av高清在线观看 | 激情综合网婷婷 | 亚洲人xxx| 成人免费在线看片 | 欧美日韩在线视频一区 | 天天综合网久久 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 精品久久九九 | 91视频免费播放 | 精品一区二区三区四区在线 | 久久99亚洲精品 | www.com黄 | 在线看一区 | 天天草天天干天天射 | 久久艹国产视频 | www.五月婷婷 | 国产精品mv在线观看 | 91看片淫黄大片91 | 亚洲精品自在在线观看 | 又大又硬又黄又爽视频在线观看 | 久久草在线精品 | 69av视频在线观看 | 国产精品久久久久久久久久久久午 | 精品色综合 | 久久久久久久久毛片精品 | 成人在线观看影院 | 国产精品久久久久久高潮 | 97视频播放 | 91人人插 | 久久久男人的天堂 | 久久8精品| 亚洲一区精品人人爽人人躁 | 婷婷色在线观看 | 在线91网 | 日韩一区二区免费播放 | 一级免费片 | 涩涩色亚洲一区 | 亚洲经典视频 | 在线观看91久久久久久 | 国产一区二区精品 | 亚洲综合视频网 | 精品xxx| 久久国产精品一区二区三区四区 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 亚洲欧美少妇 | 免费情缘| 国产精品女人网站 | 在线免费高清一区二区三区 | 亚洲国产日韩一区 | 精品国产aⅴ麻豆 | 97av色| 狠狠做深爱婷婷综合一区 | 久久黄色片 | 91免费网 | 五月天色丁香 | 久久爱资源网 | 午夜久久成人 | 免费一级特黄录像 | 视频一区在线免费观看 | 999久久久 | 国产成视频在线观看 | a电影在线观看 | 在线亚洲激情 | 97成人在线观看 | www.啪啪.com| 色婷婷九月 | 天天操操操操操 | 天天射天天艹 | 亚洲精品在线播放视频 | 国产精品99久久久久久久久 | 国产精品美女久久久网av | 亚洲国产网站 | 国产成人专区 | 91超碰免费在线 | 性日韩欧美在线视频 | 91香蕉视频色版 | 日韩美女黄色片 | 免费在线观看国产精品 | 欧美片一区二区三区 | 香蕉精品视频在线观看 | 97超碰在线人人 | 人人爽人人av | 美女在线免费观看视频 | 三级黄色免费 | 高清国产午夜精品久久久久久 | 精品在线一区二区三区 | 亚洲在线视频播放 | 福利一区二区三区四区 | 999视频在线播放 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 精品婷婷 | 奇米影视在线99精品 | 伊人色综合久久天天网 | 日韩精品不卡在线 | 日韩在线第一区 | 二区三区在线 | 亚洲日本激情 | 久久精选视频 | 久久久久久久久免费 | 精品91久久久久 | 欧美一级性 | 午夜精品一区二区三区免费视频 | 91福利国产在线观看 | 一本一道波多野毛片中文在线 | 黄网av在线 | 超级碰碰碰免费视频 | 99久久精品免费 | 日韩国产精品久久久久久亚洲 | 久久精品com| 久久婷亚洲五月一区天天躁 | 午夜精品久久久久久久99 | 91黄色在线看 | 美女视频久久久 | 亚洲视频h| 97视频免费在线 | 黄色小视频在线观看免费 | 亚洲专区 国产精品 | 久久一区国产 | 精品国产不卡 | 亚洲精品国产精品国自 | 91最新在线 | 亚洲国产成人av网 | 丁五月婷婷 | 天天操天天干天天操天天干 | 久久人人97超碰精品888 | 国产精品99久久免费观看 | 日韩午夜网站 | 99爱爱| 伊人久久av | 色九九视频 | 日韩欧美综合视频 | 亚州精品天堂中文字幕 | 日韩欧美一区二区三区视频 | 九九久久影院 | 丁香资源影视免费观看 | 91视频在线免费 | 在线观看一级视频 | 精品999久久久 | 天天av资源 | 国产高清av免费在线观看 | 黄色在线观看www | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 日韩一级黄色大片 | 成人在线视频网 | 91在线视频观看免费 | 另类五月激情 | 久久老司机精品视频 | 国产一级片网站 | 婷婷成人亚洲综合国产xv88 | 就色干综合 | 国产美女视频网站 | 中文字幕第一页在线视频 | 亚洲欧美视频 | 国产91九色视频 | 国产精品久久精品国产 | a天堂最新版中文在线地址 久久99久久精品国产 | 黄色aaa毛片 | 区一区二在线 | 精品欧美一区二区精品久久 | 最近日本中文字幕a | 日躁夜躁狠狠躁2001 | 中文亚洲欧美日韩 | 欧美在线观看视频一区二区三区 | 免费福利影院 | 日韩电影一区二区三区在线观看 | 999免费视频| 久久久久久久久免费视频 | 人人揉人人揉人人揉人人揉97 | 毛片基地黄久久久久久天堂 | 日韩在线第一 | 国产99区| 九色在线视频 | 97精品国产91久久久久久久 | 国产色网 | 91av电影在线观看 | 17婷婷久久www | 久久成人午夜视频 | 欧美日本国产在线观看 | 国产精品久久久久影院 | 中文字幕首页 | 精品国偷自产在线 | 国产精品欧美久久 | 国产手机视频 | 日韩欧美综合精品 | 国产精品久久久久久久免费大片 | 午夜精品999 | 在线观看国产区 | 丁香六月婷婷综合 | 国产精品美女久久久久aⅴ 干干夜夜 | 免费a v网站 | 国产999精品久久久影片官网 | 一区二区三区在线看 | 狂野欧美激情性xxxx欧美 | 国内视频| 国产成人av免费在线观看 | 欧美日韩久久一区 | 成人综合婷婷国产精品久久免费 | 玖玖视频| 97在线公开视频 | 91免费高清视频 | 激情视频在线高清看 | 一区二区三区中文字幕在线观看 | 91精品在线免费观看 | 国产美腿白丝袜足在线av | 免费在线观看亚洲视频 | 亚洲人视频在线 | 亚洲一二三区精品 | 中文字幕在线视频一区 | 亚洲精品成人av在线 | 国产一级片免费播放 | 菠萝菠萝在线精品视频 | 日韩精品久久久久久久电影竹菊 | 97色资源 | 日韩激情免费视频 | 一区二三国产 | 日日干,天天干 | 国产第一页在线播放 | 五月婷婷.com | 81国产精品久久久久久久久久 | 永久中文字幕 | 波多野结衣资源 | 日本久久高清视频 | 亚洲精品中文在线观看 | 国产一区二区三区午夜 | 久久久久久久久久久高潮一区二区 | 成人av免费在线看 | 欧美做受xxx | 亚洲精品乱码久久久久久蜜桃动漫 | 超碰97人人在线 | 欧美另类美少妇69xxxx | 在线一区二区三区 | 亚洲人天堂| 精品久久久久久久久久国产 | 亚洲欧洲中文日韩久久av乱码 | 亚洲高清在线精品 | 国产精久久久久久妇女av | 久99久在线视频 | 久久久久久久久影院 | 国产视频一区在线 | 超碰97网站 | 国产丝袜 | 成年美女黄网站色大片免费看 | 日韩av不卡在线 | 欧美少妇18p| 日日碰狠狠添天天爽超碰97久久 | 人人爱人人爽 | 99国产精品视频免费观看一公开 | 日韩欧美在线播放 | 国产色秀视频 | 少妇性bbb搡bbb爽爽爽欧美 | 日韩av片无码一区二区不卡电影 | 成年人免费观看国产 | 69视频在线 | 色婷婷丁香 | 国内精品久久久久影院优 | 成人三级av | 欧洲精品亚洲精品 | 国产亚洲va综合人人澡精品 | 丁香六月婷婷开心婷婷网 | 欧美va电影 | 日韩一区二区三 | av中文在线观看 | 91福利国产在线观看 | 国产精品中文字幕在线观看 | 精品久久久久久久久亚洲 | 亚洲区精品 | av在线免费播放网站 | 米奇影视7777| 亚洲乱码国产乱码精品天美传媒 | 中文字幕高清有码 | 懂色av懂色av粉嫩av分享吧 | 欧美精品乱码久久久久久 | 玖玖爱国产在线 | 久久综合狠狠综合久久激情 | 天天人人| 久久久网址 | 久草五月| 一级黄色电影网站 | 免费亚洲视频 | 精品一区二区影视 | 国产一级大片在线观看 | 在线国产日韩 | 日本99久久 | 狠狠色香婷婷久久亚洲精品 | 亚洲国产手机在线 | 久久久午夜电影 | 成人在线免费视频观看 | 一区二区三区免费在线播放 | 韩国一区二区av | 91一区啪爱嗯打偷拍欧美 | 丰满少妇对白在线偷拍 | 激情五月网站 | 亚洲高清色综合 | 亚洲理论电影 | 亚洲成人精品在线 | 色香蕉在线视频 | 免费av观看 | 国产精品久久久久免费观看 | 视频在线亚洲 | 国产视| 精品免费观看 | 国产免费视频一区二区裸体 | 81国产精品久久久久久久久久 | 成人黄色av网站 | 不卡国产在线 | 欧美性色网站 | 色精品视频 | 国产午夜精品理论片在线 | 日韩中文字幕免费在线观看 | 日韩剧| 成人小视频在线 | 国产黄色片免费 | 欧美成人精品三级在线观看播放 | 国产专区在线视频 | 中文字幕在线资源 | 国产96精品| 国产精品久久久一区二区三区网站 | 日韩欧美在线观看 | 久久精品99国产精品日本 | 成人精品亚洲 | 欧美在线资源 | 久草在线这里只有精品 | 久久线视频| 久久综合爱 | 91麻豆精品91久久久久同性 | 久草在线 | 九九久| 天天色棕合合合合合合 | 天天色天天射天天干 | 欧美在线观看视频一区二区三区 | 免费高清在线一区 | 日韩动漫免费观看高清完整版在线观看 | 99久久99热这里只有精品 | 在线精品视频在线观看高清 | 999久久| 日本午夜在线亚洲.国产 | 日韩免费在线观看网站 | 精品中文字幕在线观看 | 亚洲视频一区二区三区在线观看 | 免费黄色在线播放 | 精品欧美小视频在线观看 | 开心婷婷色 | 天天干天天插 | 久久久国产精品一区二区中文 | 人操人 | 黄色官网在线观看 | 久久精品99| 日韩在线观看av | 久久精品视频在线观看 | www免费 | 亚洲国产精品500在线观看 | 少妇bbbb搡bbbb桶 | 欧美福利片在线观看 | 欧美日韩高清一区二区三区 | 又黄又爽的视频在线观看网站 | 日本mv大片欧洲mv大片 | 久久中文字幕在线视频 | 欧美aaaxxxx做受视频 | 视频国产精品 | 精品在线99| 国产aaa毛片 | 久久中文字幕视频 | 91视频在线看 | 综合婷婷 | 黄色三级免费网址 | 天天插天天干 | 国产 日韩 欧美 中文 在线播放 | 国产一级黄色免费看 | 亚洲国产精久久久久久久 | 成人综合日日夜夜 | 丝袜美腿在线视频 | 日韩大片免费在线观看 | 狠狠狠狠狠狠天天爱 | 视频直播国产精品 | 少妇精69xxtheporn | 久久精品xxx | 91高清免费在线观看 | 久久婷婷五月综合色丁香 | 久久久精品国产免费观看一区二区 | 91视频啪| 欧美一区视频 | 国产最新福利 | 久久精品96| 最新91在线视频 | 亚洲1区 在线 | 成人免费看电影 | 久久精品国产精品亚洲 | 91视频高清完整版 | 日韩欧美xxx | 国产成人精品综合久久久久99 | av成人免费在线 | 国产永久免费 | 色综合激情久久 | 国产精品国产三级国产aⅴ入口 | 婷婷丁香久久五月婷婷 | 色综合天天射 | 欧美一级在线观看视频 | 国产亚洲综合在线 | 狠狠色狠狠色综合日日92 | 久久91久久久久麻豆精品 | 欧美性生爱 | av动态图片 | 中文字幕字幕中文 | 亚洲午夜久久久久久久久电影网 | 九九热在线播放 | 日本mv大片欧洲mv大片 | 国产一区二区三精品久久久无广告 | 九色精品在线 | 亚洲 欧洲 国产 日本 综合 | 久久精品免费看 | 97国产小视频 | 久久久av免费 | 婷婷丁香花五月天 | 夜夜澡人模人人添人人看 | 亚洲视频精选 | 狂野欧美激情性xxxx欧美 | 插综合网 | 伊人伊成久久人综合网小说 | 国产一级黄 | 韩国一区二区三区视频 | 在线视频亚洲 | 久久国产精品一区二区 | 国产黄色片久久 | 经典三级一区 | 92中文资源在线 | 亚洲成人av电影 | 92精品国产成人观看免费 | 日韩高清免费在线观看 | 992tv在线观看 | 黄色大全免费观看 | 97国产在线视频 | 日本老少交 | 中文字幕色在线视频 | 国产一线二线三线在线观看 | 黄污网站在线观看 | 国产精品专区在线 | 成人av.com| 欧美大香线蕉线伊人久久 | 国产中文字幕一区二区三区 | 久久公开视频 | 免费日韩 | 在线观看免费日韩 | 精品久久久免费 | 中文字幕av全部资源www中文字幕在线观看 | 国产精品手机看片 | 丁香六月在线观看 | 中文在线www| 国产一级性生活视频 | 97理论片| www.狠狠操| 91香蕉视频在线下载 | 日韩久久精品 | 五月天九九 | 国内精品视频久久 | 伊人亚洲精品 | 国产一区二区在线视频观看 | 五月激情av | 亚洲国产精品99久久久久久久久 | 日日日日日 | 在线不卡中文字幕播放 | 日韩在线观看网址 | 欧美中文字幕久久 | 一本一本久久a久久精品综合 | 青青河边草观看完整版高清 | 久久99精品久久久久蜜臀 | 午夜视频欧美 | 一级黄色片在线观看 | 久久公开免费视频 | 99精品国产免费久久 | 99在线视频精品 | 亚洲精品中文在线观看 | 天堂在线视频中文网 | 99精品视频一区二区 | 久久高清av | av网站大全免费 | 精品久久网| 日韩啪啪小视频 | 中文字幕在线一区观看 | 日韩黄色在线电影 | 最近高清中文字幕在线国语5 | 98涩涩国产露脸精品国产网 | 日韩视频中文字幕 | 久久久久亚洲最大xxxx | 久久伊99综合婷婷久久伊 | 国产成年免费视频 | 久久久亚洲电影 | 久久免费电影 | 久久综合成人 | 国产又粗又长又硬免费视频 | 久久激情久久 | av黄色一级片 | 日韩成人在线免费观看 | 中文字幕亚洲精品日韩 | 五月婷婷狠狠 | 欧美精品一二 | 久精品视频在线观看 | 国产夫妻av在线 | 最新成人av | 99久久综合精品五月天 | 男女激情麻豆 | 成人精品一区二区三区电影免费 | 国产黄色大全 | 在线v片免费观看视频 | 亚洲一区视频在线播放 | 日韩av高清 | 三上悠亚一区二区在线观看 | 欧美天天射 | 国产一级特黄毛片在线毛片 | 粉嫩一区二区三区粉嫩91 | 91麻豆精品国产91久久久无需广告 | 69成人在线 | 免费观看一级视频 | 成人免费影院 | 国产第页 | 久久成人麻豆午夜电影 | 日本在线观看一区二区 | 久久99久久久久久 | 色综合久久88色综合天天 | 亚洲午夜精品久久久 | 九九亚洲精品 | 日日夜夜天天综合 | 亚洲精品字幕在线观看 | 久久久官网 | 成人网在线免费视频 | 黄色免费av | 日韩av影视 | 粉嫩av一区二区三区四区五区 | 日批在线观看 | 蜜臀av.com | 黄色av成人在线观看 | 麻豆果冻剧传媒在线播放 | 欧美一级免费黄色片 | 亚洲国产日韩av | 亚洲专区欧美专区 | www黄色av| 国产小视频你懂的 | 中文一二区 | 在线黄频 | 久久久男人的天堂 | 欧亚久久 | 亚洲精品视频免费看 | 久久免费观看视频 | 国产日韩欧美在线看 | 99九九99九九九视频精品 | 超碰在线免费97 | 在线观看理论 | 久久久久国产一区二区 | 午夜精品婷婷 | 亚洲永久国产精品 | av高清在线| 在线成人小视频 | 一本一道波多野毛片中文在线 | 久精品视频免费观看2 | 香蕉在线观看视频 | 美女视频黄频大全免费 | 中文字幕亚洲综合久久五月天色无吗'' | 亚洲天堂网在线观看视频 | 日韩精品黄 | 黄色在线网站噜噜噜 | av黄色免费在线观看 | 国产成人在线免费观看 | 国产精品专区在线观看 | 精品久久久久久亚洲综合网 | a国产精品 | 97成人精品 | 久色婷婷 | 日韩高清一| 免费看片成年人 | 97人人人人| 午夜色站| 欧美一级视频免费看 | 正在播放国产一区 | 久久精品专区 | 国产精品入口a级 | 五月婷婷伊人网 | 97综合在线 | 亚洲日韩欧美一区二区在线 | 久久久精品国产免费观看一区二区 | 最近高清中文在线字幕在线观看 | 手机av网站 | 中文超碰字幕 | 黄色的视频| 日日夜夜婷婷 | 高清不卡毛片 | 在线观看免费色 | 欧美性性网 | 亚洲精品五月 | 最近日韩免费视频 | 欧美日韩免费观看一区二区三区 | 视频成人永久免费视频 | 狠狠伊人| 丝袜美女在线 | 国产精品区在线观看 | 日韩av中文在线 | 91自拍91 | 国产在线91在线电影 | 久草新在线 | 免费亚洲黄色 | 日本少妇高清做爰视频 | 亚洲免费国产 | 一级黄色片在线观看 | 一区二区三区手机在线观看 | 欧美福利久久 | 免费成人av | 国产人成一区二区三区影院 | 波多野结衣动态图 | 91精品视频在线观看免费 | 久久久精品福利视频 | 91精品一区二区三区蜜桃 | 中文字幕色网站 | 精品国精品自拍自在线 | 激情黄色av | 中文字幕免费不卡视频 | 中文字幕av播放 | 毛片激情永久免费 | 欧美成a人片在线观看久 | 97爱爱爱| 国产黄色大片 | 国产激情电影综合在线看 | 日韩在线观看 | 国产精品久久久久久久久毛片 | 国产成人免费网站 | 婷婷六月天在线 | 欧洲激情在线 | 久久视讯| 天天做天天爽 | 一级性视频 | 久久经典国产视频 | 美女视频久久黄 | 欧美成年网站 | 69亚洲视频 | 99亚洲精品| 韩国精品一区二区三区六区色诱 | 在线三级av | 96国产在线 | 国产日韩精品一区二区 | 激情网在线视频 | 欧美不卡视频在线 | 中文在线中文a | jizz欧美性9 国产一区高清在线观看 | 精品视频在线播放 | 日韩美女av在线 | 亚洲国产精品激情在线观看 | 国产理论免费 | 视频二区在线 | 国产一区视频在线观看免费 | 91天堂素人约啪 | 日韩在线影视 | 久久人人爽人人爽人人片 | 91毛片在线 | 五月开心综合 | 成人毛片在线观看 | 成年人国产视频 | 天天干天天操天天干 | 欧美激情精品久久久久久 | 一区二区三区四区在线 | av解说在线| 丁香 久久 综合 | 在线小视频你懂的 | 4hu视频| 免费网站污 | 香蕉久久久久久久 | 久久久久久久国产精品视频 | 成人在线播放视频 | 成人黄色电影免费观看 | 国产资源免费在线观看 | 日韩性色 | 国产91精品看黄网站在线观看动漫 | 国产精品岛国久久久久久久久红粉 | 成人午夜毛片 | 国产精品欧美久久 | 国产色道 | 91精品资源 | 国产成人av网址 | 精品国产一区二区三区av性色 | 久久精品播放 | 亚洲国产中文字幕 | 色婷婷综合久久久中文字幕 | 国产成人精品三级 | 国产小视频在线观看 | 97超碰免费在线观看 | 狠狠的干 | 五月天中文字幕 | 亚洲精品乱码久久久久久久久久 | 久久国产成人午夜av影院潦草 | 99精品久久久久久久久久综合 | 国产一级二级视频 | 久久视频在线视频 | 国模视频一区二区三区 | 免费观看www7722午夜电影 | 黄色软件在线看 | 日韩理论电影在线观看 | 国产高清综合 | 四虎成人精品 | 国产精品麻豆果冻传媒在线播放 | 日韩一区精品 | 91重口视频| 视频一区二区在线 | 国产精品大尺度 | 国产精品女视频 | 超碰97公开| 人人爽人人射 | 日韩美女久久 | 国内精品福利视频 | 久久涩涩网站 | 人人澡人摸人人添学生av | 久久久久看片 | 激情www| 337p日本欧洲亚洲大胆裸体艺术 | 日韩成人高清在线 | 美女免费视频一区二区 | 久久不射电影网 | 日韩中文字幕电影 | 在线观看中文字幕av | 97天天综合网 | 久久久久久久久久影视 | av免费在线观看1 | 国产精品 9999 | 免费观看mv大片高清 | av免费在线免费观看 | 婷婷丁香在线视频 | 99久久99久久精品国产片果冰 | 中文资源在线观看 | 欧美一级性视频 | 香蕉视频在线免费 | 91中文在线观看 | 国产18精品乱码免费看 | 国产成人综合在线观看 | 在线免费看黄网站 | 黄色福利网站 | 一区二区三区在线播放 | 日日夜夜艹 | 久久久伊人网 | 国产精品一区二区吃奶在线观看 | 99精品视频免费看 | 色婷婷国产 | 日本特黄一级 | 青春草免费在线视频 | 狠狠躁夜夜躁人人爽超碰91 | 日本深夜福利视频 | 亚洲爱爱视频 | 在线观看网站你懂的 | 91精品久久久久久粉嫩 | 涩涩网站在线 | 99热在线这里只有精品 | 久久国语露脸国产精品电影 | 欧亚日韩精品一区二区在线 | 男女视频久久久 | 亚洲欧美国产日韩在线观看 | 中文字幕乱码视频 | 久久激情久久 | 97电院网手机版 | 激情五月在线观看 | 99在线精品视频在线观看 | 欧美在线资源 | 国产精选在线观看 | 不卡的av在线播放 | 欧美日韩视频在线观看免费 | 在线国产激情视频 | 亚洲理论片在线观看 | 久久久69| sm免费xx网站 | 午夜999 | 丰满少妇在线观看网站 | 欧美男男激情videos | 国产不卡一区二区视频 | 免费亚洲视频在线观看 | 911香蕉视频 | 成人a视频在线观看 | 97人人模人人爽人人喊网 | 亚洲人成人在线 | 亚洲精品在线二区 | 久久人人97超碰国产公开结果 | 色偷偷88欧美精品久久久 | 亚洲精品1234区 | 91麻豆高清视频 | 久久久久久久99精品免费观看 | 国产理论一区二区三区 | 久久久久 免费视频 | 91精品国产网站 | 国产高清av免费在线观看 | 国产精品 日韩精品 | 国产亚洲人 | 欧美性色综合网 | 中文字幕在线视频网站 | 欧美日本啪啪无遮挡网站 | 99热这里只有精品免费 | 久久高视频 | 成人国产综合 | 91av成人 | 在线观看亚洲国产 | 狠狠干成人 | av中文字幕亚洲 | 婷婷综合导航 | 国产成人精品av久久 | 国内精品久久久久久久影视简单 | 五月天中文字幕mv在线 | 精品国产中文字幕 | 国内丰满少妇猛烈精品播 | 免费高清在线视频一区· | 精品免费一区 | 国产精品久久久久久久久软件 | 综合久久精品 | 精品理论片 | 伊人电影天堂 | 天天色综合三 | 日日日操操 | 8090yy亚洲精品久久 | 中文字幕av最新更新 | 国产资源精品在线观看 | 18女毛片| 国产一区久久 | 在线一区电影 | 成人h电影 | 91av免费观看 | 黄网站免费看 | 国内视频在线观看 | 天天爽夜夜爽精品视频婷婷 | 91精品91| 不卡的av在线 | www日 | 久久视频在线观看中文字幕 | 99热99re6国产在线播放 | 日韩午夜一级片 | 69av视频在线| 亚洲精品资源在线观看 | 日韩视频一区二区三区在线播放免费观看 | 国产高清视频免费在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产小视频在线看 | 99久久久成人国产精品 | 国产网站av | 精品99久久久久久 | 亚洲国产成人久久综合 | 久久久黄色 | 国产视频欧美视频 | 九九视频网站 | 国产午夜一区 | 中文字幕在线视频国产 | 欧美一区二区在线刺激视频 | 国产精品精品 | 国产午夜精品久久 | 精品国产成人在线影院 | 欧美精品久久人人躁人人爽 | 欧美天天射 | 一区视频在线 | 国产精品一区二区三区电影 | 亚洲精品456在线播放乱码 | 99热九九这里只有精品10 | 久久精品视频免费观看 | 91亚洲激情 | 国内视频在线 | aaa毛片视频 | 国产精品成人一区二区三区 | 99re国产 | 亚洲色图激情文学 | 日韩国产在线观看 | 久久天天操 | 三级黄色网址 | 日韩久久久久久久久久 | 中日韩欧美精彩视频 | 成人av免费在线播放 | 日韩免费一级a毛片在线播放一级 | 久草在线资源免费 | 成人黄大片视频在线观看 | 国产精品一区一区三区 | 麻豆国产精品va在线观看不卡 | 欧美视屏一区二区 | 在线精品在线 | 丝袜av一区 | 亚洲在线高清 | 波多野结衣在线播放一区 | 91av资源在线| ,午夜性刺激免费看视频 | 婷婷激情网站 | 成人蜜桃 | 成年人视频在线观看免费 | 玖玖在线免费视频 | 国产色婷婷 | 国产精品9999久久久久仙踪林 | 99热在 | 亚洲国产精品第一区二区 | 婷婷色亚洲 | 成年人视频在线免费播放 | 韩日在线一区 | 天天色视频 | 日韩一级成人av | 久草电影在线 | 国产欧美精品一区二区三区四区 | 91日本在线播放 | 国产成人综合精品 | 国产免费亚洲高清 | 五月天堂色 | 99精品视频在线免费观看 | a黄色片在线观看 | 久草影视在线观看 | 人人射人人澡 | 激情视频一区二区三区 | 97香蕉视频| 一区二区三区四区影院 | 国产盗摄精品一区二区 | www.狠狠操.com | 91新人在线观看 | 日韩精品中文字幕在线观看 | 久久久久久久久久久久国产精品 | 激情在线网 | 日韩网 | 精品视频123区在线观看 | 欧美一二三视频 | 免费日韩 精品中文字幕视频在线 |