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

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

微信小程序支付接口的案例詳細說明

微信小程序支付接口的案例詳細說明

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

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。

微信小程序支付

  • list

  • -paddingleft-2">

  • 微信提供文檔的業務流程時序圖

  • 第一步
    進入小程序,下單,請求下單支付,調用小程序登錄API來獲取Openid,生成商戶訂單,這些都是在小程序端完成的業務。

小程序端代碼

// pages/pay/pay.jsvar app = getApp();
Page({
    data: {},
    onLoad: function (options) {
        // 頁面初始化 options為頁面跳轉所帶來的參數
    },    /* 微信支付 */
    wxpay: function () {
        var that = this
        //登陸獲取code
        wx.login({
            success: function (res) {
                console.log(res.code)                //獲取openid
                that.getOpenId(res.code)
            }
        });
    },
    getOpenId: function (code) {
        var that = this;
        wx.request({
            url: "https://api.weixin.qq.com/sns/jscode2session?appid=wxa142513e524e496c&secret=5d6a7d86048884e7c60f84f7aa85253c&js_code=" + code + "&grant_type=authorization_code",
            data: {},
            method: 'GET',
            success: function (res) {
                console.log('返回openId')
                console.log(res.data)
                that.generateOrder(res.data.openid)
            },
            fail: function () {
                // fail
            },
            complete: function () {
                // complete
            }
        })
    },    /**生成商戶訂單 */
    generateOrder: function (openid) {
        var that = this
        //統一支付
        wx.request({
            url: 'http://localhost:8070/RMS/pay_pay.action',
            method: 'GET',
            data: {
                total_fee: '5',
                body: '支付測試',
                attach:'真假酒水'
            },
            success: function (res) {
                console.log(res)                var pay = res.data                //發起支付
                var timeStamp = pay[0].timeStamp;
                console.log("timeStamp:"+timeStamp)                var packages = pay[0].package;
                console.log("package:"+packages)                var paySign = pay[0].paySign;
                console.log("paySign:"+paySign)                var nonceStr = pay[0].nonceStr;
                 console.log("nonceStr:"+nonceStr)                var param = { "timeStamp": timeStamp, "package": packages, "paySign": paySign, "signType": "MD5", "nonceStr": nonceStr };
                that.pay(param)
            },
        })
    },    /* 支付   */
    pay: function (param) {
        console.log("支付")
        console.log(param)
        wx.requestPayment({
            timeStamp: param.timeStamp,
            nonceStr: param.nonceStr,
            package: param.package,
            signType: param.signType,
            paySign: param.paySign,
            success: function (res) {
                // success
                console.log("支付")
                console.log(res)
                wx.navigateBack({
                    delta: 1, // 回退前 delta(默認為1) 頁面
                    success: function (res) {
                        wx.showToast({
                            title: '支付成功',
                            icon: 'success',
                            duration: 2000
                        })
                    },
                    fail: function () {
                        // fail

                    },
                    complete: function () {
                        // complete
                    }
                })
            },
            fail: function (res) {
                // fail
                console.log("支付失敗")
                console.log(res)
            },
            complete: function () {
                // complete
                console.log("pay complete")
            }
        })
    }
})
  • 第二步
    調用支付統一下單API來獲取prepay_id,并將小程序調起支付數據需要簽名的字段appId,timeStamp,nonceStr,package再次簽名

后臺代碼

package cn.it.shop.action;import java.io.ByteArrayInputStream;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import cn.it.shop.util.MessageUtil;import cn.it.shop.util.PayUtil;import cn.it.shop.util.PaymentPo;import cn.it.shop.util.UUIDHexGenerator;import net.sf.json.JSONArray;import net.sf.json.JSONObject;/** 
* @author 
* @version 創建時間:2017年1月21日 下午4:59:03 
* 小程序端請求的后臺action,返回簽名后的數據傳到前臺
*/public class PayAction {    private String total_fee;//總金額
    private String body;//商品描述
    private String detail;//商品詳情    
    private String attach;//附加數據
    private String time_start;//交易起始時間
    private String time_expire;//交易結束時間 
    private String openid;//用戶標識

    private JSONArray jsonArray=new JSONArray();    public String pay() throws UnsupportedEncodingException, DocumentException{

         body = new String(body.getBytes("UTF-8"),"ISO-8859-1");  
        String appid = "替換為自己的小程序ID";//小程序ID
        String mch_id = "替換為自己的商戶號";//商戶號
        String nonce_str = UUIDHexGenerator.generate();//隨機字符串
        String today = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());        String code = PayUtil.createCode(8);        String out_trade_no = mch_id+today+code;//商戶訂單號
        String spbill_create_ip = "替換為自己的終端IP";//終端IP
        String notify_url = "http://www.weixin.qq.com/wxpay/pay.php";//通知地址
        String trade_type = "JSAPI";//交易類型  
        String openid="替換為用戶的openid";//用戶標識

        /**/
        PaymentPo paymentPo = new PaymentPo();

        paymentPo.setAppid(appid);
        paymentPo.setMch_id(mch_id);
        paymentPo.setNonce_str(nonce_str);        String newbody=new String(body.getBytes("ISO-8859-1"),"UTF-8");//以utf-8編碼放入paymentPo,微信支付要求字符編碼統一采用UTF-8字符編碼
        paymentPo.setBody(newbody);
        paymentPo.setOut_trade_no(out_trade_no);
        paymentPo.setTotal_fee(total_fee);
        paymentPo.setSpbill_create_ip(spbill_create_ip);
        paymentPo.setNotify_url(notify_url);
        paymentPo.setTrade_type(trade_type);
        paymentPo.setOpenid(openid);        // 把請求參數打包成數組
        Map<String, String> sParaTemp = new HashMap<String, String>();
        sParaTemp.put("appid", paymentPo.getAppid());
        sParaTemp.put("mch_id", paymentPo.getMch_id());
        sParaTemp.put("nonce_str", paymentPo.getNonce_str());
        sParaTemp.put("body",  paymentPo.getBody());
        sParaTemp.put("out_trade_no", paymentPo.getOut_trade_no());
        sParaTemp.put("total_fee",paymentPo.getTotal_fee());
        sParaTemp.put("spbill_create_ip", paymentPo.getSpbill_create_ip());
        sParaTemp.put("notify_url",paymentPo.getNotify_url());
        sParaTemp.put("trade_type", paymentPo.getTrade_type());
        sParaTemp.put("openid", paymentPo.getOpenid());        // 除去數組中的空值和簽名參數
        Map<String, String> sPara = PayUtil.paraFilter(sParaTemp);        String prestr = PayUtil.createLinkString(sPara); // 把數組所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串
        String key = "&key=替換為商戶支付密鑰"; // 商戶支付密鑰
        //MD5運算生成簽名
        String mysign = PayUtil.sign(prestr, key, "utf-8").toUpperCase();
        paymentPo.setSign(mysign);        //打包要發送的xml
        String respXml = MessageUtil.messageToXML(paymentPo);        // 打印respXml發現,得到的xml中有“”不對,應該替換成“_”
        respXml = respXml.replace(, "_");        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//統一下單API接口鏈接
        String param = respXml;        //String result = SendRequestForUrl.sendRequest(url, param);//發起請求
        String result =PayUtil.httpRequest(url, "POST", param);        // 將解析結果存儲在HashMap中
        Map<String, String> map = new HashMap<String, String>();
         InputStream in=new ByteArrayInputStream(result.getBytes());  
        // 讀取輸入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(in);        // 得到xml根元素
        Element root = document.getRootElement();        // 得到根元素的所有子節點
        @SuppressWarnings("unchecked")        List<Element> elementList = root.elements();
        for (Element element : elementList) {            map.put(element.getName(), element.getText());
        }        // 返回信息
        String return_code = map.get("return_code");//返回狀態碼
        String return_msg = map.get("return_msg");//返回信息
        System.out.println("return_msg"+return_msg);
        JSONObject JsonObject=new JSONObject() ;        if(return_code=="SUCCESS"||return_code.equals(return_code)){            // 業務結果
            String prepay_id = map.get("prepay_id");//返回的預付單信息
            String nonceStr=UUIDHexGenerator.generate();
            JsonObject.put("nonceStr", nonceStr);
            JsonObject.put("package", "prepay_id="+prepay_id);
            Long timeStamp= System.currentTimeMillis()/1000;
            JsonObject.put("timeStamp", timeStamp+"");            String stringSignTemp = "appId="+appid+"&nonceStr=" + nonceStr + "&package=prepay_id=" + prepay_id+ "&signType=MD5&timeStamp=" + timeStamp;            //再次簽名
            String paySign=PayUtil.sign(stringSignTemp, "&key=替換為自己的密鑰", "utf-8").toUpperCase();
            JsonObject.put("paySign", paySign);
            jsonArray.add(JsonObject);
        }        return "pay";

    }    public String getTotal_fee() {        return total_fee;
    }    public void setTotal_fee(String total_fee) {
        this.total_fee = total_fee;
    }    public String getBody() {        return body;
    }    public void setBody(String body) {
        this.body = body;
    }    public JSONArray getJsonArray() {        return jsonArray;
    }    public void setJsonArray(JSONArray jsonArray) {
        this.jsonArray = jsonArray;
    }    public String getDetail() {        return detail;
    }    public void setDetail(String detail) {
        this.detail = detail;
    }    public String getAttach() {        return attach;
    }    public void setAttach(String attach) {
        this.attach = attach;
    }    public String getTime_start() {        return time_start;
    }    public void setTime_start(String time_start) {
        this.time_start = time_start;
    }    public String getTime_expire() {        return time_expire;
    }    public void setTime_expire(String time_expire) {
        this.time_expire = time_expire;
    }    public String getOpenid() {        return openid;
    }    public void setOpenid(String openid) {
        this.openid = openid;
    }
}
  • 后臺業務邏輯涉及到的工具類及參數封裝類

MessageUtil 
package cn.it.shop.util;import java.io.IOException;import java.io.Writer;import java.util.HashMap;import java.util.List;import javax.servlet.http.HttpServletRequest;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.core.util.QuickWriter;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;import com.thoughtworks.xstream.io.xml.XppDriver;public class MessageUtil {

    public static HashMap<String,String> parseXML(HttpServletRequest request) throws Exception, IOException{
        HashMap<String,String> map=new HashMap<String,String>();        // 通過IO獲得Document
        SAXReader reader = new SAXReader();
        Document doc = reader.read(request.getInputStream());        //得到xml的根節點
        Element root=doc.getRootElement();
        recursiveParseXML(root,map);        return map;
    }    private static void recursiveParseXML(Element root,HashMap<String,String> map){        //得到根節點的子節點列表
        List<Element> elementList=root.elements();        //判斷有沒有子元素列表
        if(elementList.size()==0){
            map.put(root.getName(), root.getTextTrim());
        }        else{            //遍歷
            for(Element e:elementList){
                recursiveParseXML(e,map);
            }
        }
    }    private static XStream xstream = new XStream(new XppDriver() {        public HierarchicalStreamWriter createWriter(Writer out) {            return new PrettyPrintWriter(out) {                // 對所有xml節點都增加CDATA標記
                boolean cdata = true;                public void startNode(String name, Class clazz) {                    super.startNode(name, clazz);
                }                protected void writeText(QuickWriter writer, String text) {                    if (cdata) {
                        writer.write("<![CDATA[");
                        writer.write(text);
                        writer.write("]]>");
                    } else {
                        writer.write(text);
                    }
                }
            };
        }
    });    public static String messageToXML(PaymentPo paymentPo){
        xstream.alias("xml",PaymentPo.class);        return xstream.toXML(paymentPo);
    }
}

PaymentPo//封裝支付參數實體package cn.it.shop.util;/** 
* @author * @version 創建時間:2017年1月21日 下午4:20:52 
* 類說明 
*/public class PaymentPo {
    private String appid;//小程序ID
    private String mch_id;//商戶號
    private String device_info;//設備號
    private String nonce_str;//隨機字符串
    private String sign;//簽名
    private String body;//商品描述  
    private String detail;//商品詳情    
    private String attach;//附加數據
    private String out_trade_no;//商戶訂單號
    private String fee_type;//貨幣類型
    private String spbill_create_ip;//終端IP
    private String time_start;//交易起始時間
    private String time_expire;//交易結束時間 
    private String goods_tag;//商品標記
    private String total_fee;//總金額
    private String notify_url;//通知地址    
    private String trade_type;//交易類型    
    private String limit_pay;//指定支付方式
    private String openid;//用戶標識
    public String getAppid() {        return appid;
    }    public void setAppid(String appid) {        this.appid = appid;
    }    public String getMch_id() {        return mch_id;
    }    public void setMch_id(String mch_id) {        this.mch_id = mch_id;
    }    public String getNonce_str() {        return nonce_str;
    }    public void setNonce_str(String nonce_str) {        this.nonce_str = nonce_str;
    }    public String getSign() {        return sign;
    }    public void setSign(String sign) {        this.sign = sign;
    }    public String getBody() {        return body;
    }    public void setBody(String body) {        this.body = body;
    }    public String getOut_trade_no() {        return out_trade_no;
    }    public void setOut_trade_no(String out_trade_no) {        this.out_trade_no = out_trade_no;
    }    public String getTotal_fee() {        return total_fee;
    }    public void setTotal_fee(String total_fee) {        this.total_fee = total_fee;
    }    public String getNotify_url() {        return notify_url;
    }    public void setNotify_url(String notify_url) {        this.notify_url = notify_url;
    }    public String getTrade_type() {        return trade_type;
    }    public void setTrade_type(String trade_type) {        this.trade_type = trade_type;
    }    public String getOpenid() {        return openid;
    }    public void setOpenid(String openid) {        this.openid = openid;
    }    public String getSpbill_create_ip() {        return spbill_create_ip;
    }    public void setSpbill_create_ip(String spbill_create_ip) {        this.spbill_create_ip = spbill_create_ip;
    }    public String getDevice_info() {        return device_info;
    }    public void setDevice_info(String device_info) {        this.device_info = device_info;
    }    public String getDetail() {        return detail;
    }    public void setDetail(String detail) {        this.detail = detail;
    }    public String getAttach() {        return attach;
    }    public void setAttach(String attach) {        this.attach = attach;
    }    public String getFee_type() {        return fee_type;
    }    public void setFee_type(String fee_type) {        this.fee_type = fee_type;
    }    public String getTime_start() {        return time_start;
    }    public void setTime_start(String time_start) {        this.time_start = time_start;
    }    public String getTime_expire() {        return time_expire;
    }    public void setTime_expire(String time_expire) {        this.time_expire = time_expire;
    }    public String getGoods_tag() {        return goods_tag;
    }    public void setGoods_tag(String goods_tag) {        this.goods_tag = goods_tag;
    }    public String getLimit_pay() {        return limit_pay;
    }    public void setLimit_pay(String limit_pay) {        this.limit_pay = limit_pay;
    }

}
PayUtilpackage cn.it.shop.util;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.commons.codec.digest.DigestUtils;/**
 * @author 
 * @version 創建時間:2017年1月17日 下午7:46:29 類說明
 */public class PayUtil {
    /**
     * 簽名字符串
     * @param text需要簽名的字符串
     * @param key 密鑰
     * @param input_charset編碼格式
     * @return 簽名結果
     */
    public static String sign(String text, String key, String input_charset) {
        text = text + key;        return DigestUtils.md5Hex(getContentBytes(text, input_charset));
    }    /**
     * 簽名字符串
     *  @param text需要簽名的字符串
     * @param sign 簽名結果
     * @param key密鑰
     * @param input_charset 編碼格式
     * @return 簽名結果
     */
    public static boolean verify(String text, String sign, String key, String input_charset) {
        text = text + key;
        String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));        if (mysign.equals(sign)) {            return true;
        } else {            return false;
        }
    }    /**
     * @param content
     * @param charset
     * @return
     * @throws SignatureException
     * @throws UnsupportedEncodingException
     */
    public static byte[] getContentBytes(String content, String charset) {        if (charset == null || "".equals(charset)) {            return content.getBytes();
        }        try {            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {            throw new RuntimeException("MD5簽名過程中出現錯誤,指定的編碼集不對,您目前指定的編碼集是:" + charset);
        }
    }    /**
     * 生成6位或10位隨機數 param codeLength(多少位)
     * @return
     */
    public static String createCode(int codeLength) {
        String code = "";        for (int i = 0; i < codeLength; i++) {
            code += (int) (Math.random() * 9);
        }        return code;
    }    private static boolean isValidChar(char ch) {        if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))            return true;        if ((ch >= 0x4e00 && ch <= 0x7fff) || (ch >= 0x8000 && ch <= 0x952f))            return true;// 簡體中文漢字編碼
        return false;
    }    /**
     * 除去數組中的空值和簽名參數
     * @param sArray 簽名參數組
     * @return 去掉空值與簽名參數后的新簽名參數組
     */
    public static Map<String, String> paraFilter(Map<String, String> sArray) {
        Map<String, String> result = new HashMap<String, String>();        if (sArray == null || sArray.size() <= 0) {            return result;
        }        for (String key : sArray.keySet()) {
            String value = sArray.get(key);            if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
                    || key.equalsIgnoreCase("sign_type")) {                continue;
            }
            result.put(key, value);
        }        return result;
    }    /**
     * 把數組所有元素排序,并按照“參數=參數值”的模式用“&”字符拼接成字符串
     * @param params 需要排序并參與字符拼接的參數組
     * @return 拼接后字符串
     */
    public static String createLinkString(Map<String, String> params) {
        List<String> keys = new ArrayList<String>(params.keySet());
        Collections.sort(keys);

        String prestr = "";        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);            if (i == keys.size() - 1) {// 拼接時,不包括最后一個&字符
                prestr = prestr + key + "=" + value;
            } else {
                prestr = prestr + key + "=" + value + "&";
            }
        }        return prestr;
    }    /**
     * 
     * @param requestUrl請求地址
     * @param requestMethod請求方法
     * @param outputStr參數
     */
    public static String httpRequest(String requestUrl,String requestMethod,String outputStr){        // 創建SSLContext
        StringBuffer buffer=null;        try{
        URL url = new URL(requestUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(requestMethod);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.connect();        //往服務器端寫內容
        if(null !=outputStr){
            OutputStream os=conn.getOutputStream();
            os.write(outputStr.getBytes("utf-8"));
            os.close();
        }        // 讀取服務器端返回的內容
        InputStream is = conn.getInputStream();
        InputStreamReader isr = new InputStreamReader(is, "utf-8");
        BufferedReader br = new BufferedReader(isr);
        buffer = new StringBuffer();
        String line = null;        while ((line = br.readLine()) != null) {
                      buffer.append(line);
        }
        }catch(Exception e){
            e.printStackTrace();
        }        return buffer.toString();
        }   
    public static String urlEncodeUTF8(String source){
        String result=source;        try {
            result=java.net.URLEncoder.encode(source, "UTF-8");
        } catch (UnsupportedEncodingException e) {            // TODO Auto-generated catch block
            e.printStackTrace();
        }        return result;
    }
}
UUIDHexGeneratorpackage cn.it.shop.util;import java.net.InetAddress;/**
 * @author 
 * @version 創建時間:2017年1月17日 下午7:45:06 類說明
 */public class UUIDHexGenerator {
    private static String sep = "";    private static final int IP;    private static short counter = (short) 0;    private static final int JVM = (int) (System.currentTimeMillis() >>> 8);    private static UUIDHexGenerator uuidgen = new UUIDHexGenerator();    static {        int ipadd;        try {
            ipadd = toInt(InetAddress.getLocalHost().getAddress());
        } catch (Exception e) {
            ipadd = 0;
        }
        IP = ipadd;
    }    public static UUIDHexGenerator getInstance() {        return uuidgen;
    }    public static int toInt(byte[] bytes) {        int result = 0;        for (int i = 0; i < 4; i++) {
            result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];
        }        return result;
    }    protected static String format(int intval) {
        String formatted = Integer.toHexString(intval);
        StringBuffer buf = new StringBuffer("00000000");
        buf.replace(8 - formatted.length(), 8, formatted);        return buf.toString();
    }    protected static String format(short shortval) {
        String formatted = Integer.toHexString(shortval);
        StringBuffer buf = new StringBuffer("0000");
        buf.replace(4 - formatted.length(), 4, formatted);        return buf.toString();
    }    protected static int getJVM() {        return JVM;
    }    protected synchronized static short getCount() {        if (counter < 0) {
            counter = 0;
        }        return counter++;
    }    protected static int getIP() {        return IP;
    }    protected static short getHiTime() {        return (short) (System.currentTimeMillis() >>> 32);
    }    protected static int getLoTime() {        return (int) System.currentTimeMillis();
    }    public static String generate() {        return new StringBuffer(36).append(format(getIP())).append(sep).append(format(getJVM())).append(sep)
                .append(format(getHiTime())).append(sep).append(format(getLoTime())).append(sep)
                .append(format(getCount())).toString();
    }    /**
     * @param args
     */
    public static void main(String[] args) {
        String id="";
        UUIDHexGenerator uuid = UUIDHexGenerator.getInstance();        /*
        for (int i = 0; i < 100; i++) {
            id = uuid.generate();

        }*/
        id = uuid.generate();
        System.out.println(id);
    }
}

第一次寫,寫的不是太完整,希望同大家多多交流,一起進步。

以上就是微信小程序支付接口的實例詳解的詳細內容,更多請關注php中文網其它相關文章!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

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

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 一级片免费在线观看视频| 国产1区2区3区中文字幕| 国产3p露脸普通话对白| 毛片在线视频观看| 中文字幕在线中文| 欧美另类videosbestsex日本| 国产在线观看中文字幕| 特级西西444www| 亚洲国产欧美91| 天天综合成人网| 成人高清dvd| 欧美高清中文字幕| www一区二区www免费| 红桃av在线播放| 免费涩涩18网站入口| 蜜桃福利午夜精品一区| 国内av免费观看| 又大又硬又爽免费视频| 三上悠亚久久精品| 成人久久久久久久久| 国产精品视频黄色| 亚洲图片 自拍偷拍| 久久久久久久9| 国产视频一区二区视频| 亚洲激情在线看| av在线观看地址| 中文字幕第80页| 成人毛片100部免费看| 男人日女人下面视频| 青青草原国产在线视频| 大荫蒂性生交片| 少妇性饥渴无码a区免费| 日韩av自拍偷拍| 成人午夜免费在线| 红桃视频 国产| 日本少妇高潮喷水视频| а 天堂 在线| 日批视频在线免费看| 香蕉精品视频在线| 国产一级不卡毛片| 和岳每晚弄的高潮嗷嗷叫视频| 免费高清在线观看免费| 伊人成人免费视频| 国产精品69页| 蜜臀av无码一区二区三区| 中文字幕亚洲影院| 88av.com| 欧美日韩性生活片| 小泽玛利亚av在线| 中文字幕成人免费视频| 黄色片久久久久| 蜜臀av无码一区二区三区| 欧美又黄又嫩大片a级| 亚洲不卡视频在线| 三级4级全黄60分钟| 免费看毛片的网址| 亚洲高潮无码久久| 特级黄色录像片| 一本之道在线视频| theporn国产精品| 污污网站免费观看| 国产高清视频网站| 91制片厂毛片| 国产三级国产精品国产专区50| 男女av免费观看| www..com日韩| 国产日本在线播放| 大j8黑人w巨大888a片| 欧美三级在线观看视频| 日韩a∨精品日韩在线观看| 白白操在线视频| 免费一级特黄毛片| 91视频最新入口| 成人免费xxxxx在线视频| 日本精品一区二区三区四区| 久久久久久久久久久视频| 浮妇高潮喷白浆视频| 亚洲国产精品久久久久爰色欲| 女人天堂av手机在线| 少妇性l交大片| 在线一区二区不卡| 99久热在线精品视频| 国产精品国产亚洲精品看不卡| 青青青免费在线| 五月婷婷深爱五月| 经典三级在线视频| 国内少妇毛片视频| 五月婷婷狠狠操| 亚洲自拍偷拍一区二区三区| 青青在线免费观看| 手机看片福利日韩| 欧美日韩一级在线| 国产日产欧美视频| 在线视频观看91| 国产特级淫片高清视频| 欧美一级特黄a| 韩日视频在线观看| 国模私拍视频在线观看| 久草视频国产在线| 天天干天天操天天做| 国产综合中文字幕| 国产精品嫩草影院8vv8| 黄色免费福利视频| 日韩最新中文字幕| 亚洲黄色a v| 日本福利视频在线| 蜜臀av.com| 视频免费1区二区三区| 丝袜人妻一区二区三区| 日韩av自拍偷拍| 另类小说第一页| 欧美这里只有精品| 婷婷视频在线播放| 波多野结衣xxxx| 国产99久久九九精品无码| 艳母动漫在线免费观看| 91人人澡人人爽人人精品| 黄色一级在线视频| 毛片av在线播放| 老司机av福利| 欧美一级特黄aaa| youjizzxxxx18| 日av中文字幕| 欧美一区二区三区爽大粗免费 | 久久久久久久免费视频| 国内自拍视频网| 激情综合网婷婷| 久久综合九色综合88i| 17c丨国产丨精品视频| 一级特黄妇女高潮| 中文字幕55页| 五月天男人天堂| 91制片厂免费观看| 乱子伦一区二区| 高清无码一区二区在线观看吞精| 亚洲精品永久视频| 中文字幕日韩久久| 肉色超薄丝袜脚交| 亚洲欧美日韩一二三区| 日本特级黄色大片| 中文国产在线观看| 樱空桃在线播放| 欧美国产视频一区| 欧洲黄色一级视频| 欧美自拍小视频| 污污视频网站在线| 国产精品8888| 91国视频在线| 成人亚洲免费视频| 日韩专区第三页| 动漫av网站免费观看| 欧美性猛交xxx乱久交| 男人的天堂最新网址| 久久久久久久久影视| 亚洲人成无码网站久久99热国产| 91九色在线观看视频| www.激情小说.com| 日韩欧美色视频| 久久久久久久久久久99| 久久久久久久久久久久久久国产| 91女神在线观看| 成人短视频在线观看免费| 人妻夜夜添夜夜无码av| 午夜激情av在线| 米仓穗香在线观看| 免费男同深夜夜行网站| 午夜探花在线观看| 日本成人黄色网| www.xxx麻豆| 中文字幕第38页| 久操网在线观看| 波多野结衣国产精品| 精品久久一二三| 在线成人免费av| www.欧美日本| 每日在线观看av| 麻豆md0077饥渴少妇| 人人爽人人av| 欧美日韩国产精品激情在线播放| 福利视频999| 国产又大又黄又粗的视频| 亚洲中文字幕无码av永久| 五月天婷婷影视| 天天操天天爽天天射| avav在线看| 久久久999免费视频| 久久久久久久久网| 成年人三级黄色片| 热久久精品免费视频| 久久无码高潮喷水| 久久久性生活视频| av在线观看地址| 2019日韩中文字幕mv| 国产女主播av| 91看片淫黄大片91| 日韩最新中文字幕| 国产精品无码乱伦| 特色特色大片在线| 国产免费内射又粗又爽密桃视频| 午夜探花在线观看|