午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > golang實現微信支付v3版本的方法

golang實現微信支付v3版本的方法

熱門標簽:地圖標注免費定制店 上海極信防封電銷卡價格 重慶慶云企業400電話到哪申請 仙桃400電話辦理 不封卡外呼系統 宿遷便宜外呼系統代理商 鄭州智能語音電銷機器人價格 湛江crm外呼系統排名 寧波語音外呼系統公司

一、準備階段

 獲取私鑰

官方文檔 https://kf.qq.com/faq/161222N...

獲取私鑰證書的序列號 https://pay.weixin.qq.com/wik...

openssl x509 -in 1900009191_20180326_cert.pem -noout -serial
serial=1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C

私鑰獲取后有三個文件

apiclient_key.p12 
apiclient_cert.pem 
apiclient_key.pem

本次示例程序中,使用的是文件 apiclient_key.pem內容

獲取公鑰(平臺證書)

官方文檔

更新證書 https://pay.weixin.qq.com/wik...

平臺證書會提前10天生成新證書,微信官方推薦在舊證書過期前5-10天部署新證書

獲取證書API文檔 https://pay.weixin.qq.com/wik...

身份證認證信息生成文檔 https://pay.weixin.qq.com/wik...

常量

const appId = ""   // 小程序或者公眾號的appid
const mchId = ""   // 微信支付的商戶id
const privateSerialNo = "" // 私鑰證書號
const aesKey = ""   // 微信支付aes key

生成數字簽名

// 對消息的散列值進行數字簽名
func signPKCS1v15(msg, privateKey []byte, hashType crypto.Hash) ([]byte, error) {
 block, _ := pem.Decode(privateKey)
 if block == nil {
  return nil, errors.New("private key decode error")
 }
 pri, err := x509.ParsePKCS8PrivateKey(block.Bytes)
 if err != nil {
  return nil, errors.New("parse private key error")
 }
 key, ok := pri.(*rsa.PrivateKey)
 if ok == false {
  return nil, errors.New("private key format error")
 }
 sign, err := rsa.SignPKCS1v15(cryptoRand.Reader, key, hashType, msg)
 if err != nil {
  return nil, errors.New("sign error")
 }
 return sign, nil
}
// base編碼
func base64EncodeStr(src []byte) string {
 return base64.StdEncoding.EncodeToString(src)
}

生成身份認證信息

func authorization(method string, paramMap map[string]interface{}, rawUrl string) (token string, err error) {
 var body string
 if len(paramMap) != 0 {
  paramJsonBytes, err := json.Marshal(paramMap)
  if err != nil {
   return token, err
  }
  body = string(paramJsonBytes)
 }
 urlPart, err := url.Parse(rawUrl)
 if err != nil {
  return token, err
 }
 canonicalUrl := urlPart.RequestURI()
 timestamp := time.Now().Unix()
 nonce := getRandomString(32)
 message := fmt.Sprintf("%s\n%s\n%d\n%s\n%s\n", method, canonicalUrl, timestamp, nonce, body)
 open, err := os.Open("/Users/apple/data/www/go/work/src/study/testwechantpay/private.pem")
 if err != nil {
  return token, err
 }
 defer open.Close()
 privateKey, err := ioutil.ReadAll(open)
 if err != nil {
  return token, err
 }
 signBytes, err := signPKCS1v15(hasha256(message), privateKey, crypto.SHA256)
 if err != nil {
  return token, err
 }
 sign := base64EncodeStr(signBytes)
 token = fmt.Sprintf("mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\"",
  mchId, nonce, timestamp, privateSerialNo, sign)
 return token, nil
}

報文解密

func decryptGCM(aesKey, nonceV, ciphertextV, additionalDataV string) ([]byte, error) {
 key := []byte(aesKey)
 nonce := []byte(nonceV)
 additionalData := []byte(additionalDataV)
 ciphertext, err := base64.StdEncoding.DecodeString(ciphertextV)
 if err != nil {
  return nil, err
 }
 block, err := aes.NewCipher(key)
 if err != nil {
  return nil, err
 }
 aesGCM, err := cipher.NewGCM(block)
 if err != nil {
  return nil, err
 }
 plaintext, err := aesGCM.Open(nil, nonce, ciphertext, additionalData)
 if err != nil {
  return nil, err
 }
 return plaintext, err
}

獲取平臺證書

// 獲取公鑰
const publicKeyUrl = "https://api.mch.weixin.qq.com/v3/certificates"
type TokenResponse struct {
 Data []TokenResponseData `json:"data"`
}
type TokenResponseData struct {
 EffectiveTime  string    `json:"effective_time"`
 EncryptCertificate EncryptCertificate `json:"encrypt_certificate"`
 ExpireTime   string    `json:"expire_time"`
 SerialNo   string    `json:"serial_no"`
}
type EncryptCertificate struct {
 Algorithm  string `json:"algorithm"`
 AssociatedData string `json:"associated_data"`
 Ciphertext  string `json:"ciphertext"`
 Nonce   string `json:"nonce"`
}
var publicSyncMap sync.Map
// 獲取公鑰
func getPublicKey() (key string, err error) {
 var prepareTime int64 = 24 * 3600 * 3 // 證書提前三天過期舊證書,獲取新證書
 nowTime := time.Now().Unix()
 // 讀取公鑰緩存數據
 cacheValueKey := fmt.Sprintf("app_id:%s:public_key:value", appId)
 cacheExpireTimeKey := fmt.Sprintf("app_id:%s:public_key:expire_time", appId)
 cacheValue, keyValueOk := publicSyncMap.Load(cacheValueKey)
 cacheExpireTime, expireTimeOk := publicSyncMap.Load(cacheExpireTimeKey)
 if keyValueOk  expireTimeOk {
  // 格式化時間
  local, _ := time.LoadLocation("Local")
  location, _ := time.ParseInLocation(time.RFC3339, cacheExpireTime.(string), local)
  // 判斷是否過期,證書沒有過期直接返回
  if location.Unix()-prepareTime > nowTime {
   return cacheValue.(string), nil
  }
 }
 token, err := authorization(http.MethodGet, nil, publicKeyUrl)
 if err != nil {
  return key, err
 }
 request, err := http.NewRequest(http.MethodGet, publicKeyUrl, nil)
 if err != nil {
  return key, err
 }
 request.Header.Add("Authorization", "WECHATPAY2-SHA256-RSA2048 "+token)
 request.Header.Add("User-Agent", "用戶代理(https://zh.wikipedia.org/wiki/User_agent)")
 request.Header.Add("Content-type", "application/json;charset='utf-8'")
 request.Header.Add("Accept", "application/json")
 client := http.DefaultClient
 response, err := client.Do(request)
 if err != nil {
  return key, err
 }
 defer response.Body.Close()
 bodyBytes, err := ioutil.ReadAll(response.Body)
 if err != nil {
  return key, err
 }
 //fmt.Println(string(bodyBytes))
 var tokenResponse TokenResponse
 if err = json.Unmarshal(bodyBytes, tokenResponse); err != nil {
  return key, err
 }
 for _, encryptCertificate := range tokenResponse.Data {
  // 格式化時間
  local, _ := time.LoadLocation("Local")
  location, err := time.ParseInLocation(time.RFC3339, encryptCertificate.ExpireTime, local)
  if err != nil {
   return key, err
  }
  // 判斷是否過期,證書沒有過期直接返回
  if location.Unix()-prepareTime > nowTime {
   decryptBytes, err := decryptGCM(aesKey, encryptCertificate.EncryptCertificate.Nonce, encryptCertificate.EncryptCertificate.Ciphertext,
    encryptCertificate.EncryptCertificate.AssociatedData)
   if err != nil {
    return key, err
   }
   key = string(decryptBytes)
   publicSyncMap.Store(cacheValueKey, key)
   publicSyncMap.Store(cacheExpireTimeKey, encryptCertificate.ExpireTime)
   return key, nil
  }
 }
 return key, errors.New("get public key error")
}

二、發起微信支付

jsapi 發起支付

調用統一下單接口

統一下單接口文檔 https://pay.weixin.qq.com/wik...

// 統一下單接口
func commonPay() (payResMap map[string]string, err error) {
 payResMap = make(map[string]string)
 amount := 10
 paramMap := make(map[string]interface{})
 paramMap["appid"] = appId
 paramMap["mchid"] = mchId
 paramMap["description"] = fmt.Sprintf("微信充值:¥%d", amount)
 paramMap["out_trade_no"] = fmt.Sprintf("test%s%s", time.Now().Format("20060102150405"), randNumber())
 paramMap["notify_url"] = "http://tools.localhost/notify"
 paramMap["amount"] = map[string]interface{}{"total": amount * 100, "currency": "CNY"}
 paramMap["payer"] = map[string]string{"openid": "opCO05utXkPQh3Vje13WjEdQpAZ4"}
 token, err := authorization(http.MethodPost, paramMap, commonPayUrl)
 if err != nil {
  return payResMap, err
 }
 marshal, _ := json.Marshal(paramMap)
 request, err := http.NewRequest(http.MethodPost, commonPayUrl, bytes.NewReader(marshal))
 if err != nil {
  return payResMap, err
 }
 request.Header.Add("Authorization", "WECHATPAY2-SHA256-RSA2048 "+token)
 request.Header.Add("User-Agent", "用戶代理(https://zh.wikipedia.org/wiki/User_agent)")
 request.Header.Add("Content-type", "application/json;charset='utf-8'")
 request.Header.Add("Accept", "application/json")
 client := http.DefaultClient
 response, err := client.Do(request)
 if err != nil {
  return payResMap, err
 }
 defer func() {
  response.Body.Close()
 }()
 bodyBytes, err := ioutil.ReadAll(response.Body)
 if err != nil {
  return payResMap, err
 }
 if err = json.Unmarshal(bodyBytes, payResMap); err != nil {
  return payResMap, err
 }
 if payResMap["prepay_id"] == "" {
  return payResMap, errors.New("code:" + payResMap["code"] + "err:" + payResMap["message"])
 }
 return payResMap, nil
}

生成jsapi發起支付

JSAPI 調起支付接口文檔 https://pay.weixin.qq.com/wik...

func jsApi(payResMap map[string]string) (payJson string, err error) {
 payMap := make(map[string]string)
 timeStamp := time.Now().Unix()
 nonce := getRandomString(32)
 packageStr := "prepay_id=" + payResMap["prepay_id"]
 payMap["appId"] = appId
 payMap["timeStamp"] = fmt.Sprintf("%v", timeStamp)
 payMap["nonceStr"] = nonce
 payMap["package"] = packageStr
 // 簽名
 message := fmt.Sprintf("%s\n%s\n%s\n%s\n", appId, fmt.Sprintf("%v", timeStamp), nonce, packageStr)
 open, err := os.Open("/Users/apple/data/www/go/work/src/study/testwechantpay/private.pem")
 if err != nil {
  return payJson, err
 }
 defer open.Close()
 privateKey, err := ioutil.ReadAll(open)
 if err != nil {
  return payJson, err
 }
 signBytes, err := signPKCS1v15(hasha256(message), privateKey, crypto.SHA256)
 if err != nil {
  return payJson, err
 }
 sign := base64EncodeStr(signBytes)
 payMap["signType"] = sign
 payMap["paySign"] = "RSA"
 payJsonBytes, err := json.Marshal(payMap)
 if err != nil {
  return payJson, err
 }
 payJson = string(payJsonBytes)
 return payJson, nil
}

前臺發起支付js

需要加載微信js http://res.wx.qq.com/open/js/jweixin-1.6.0.js

調用微信js需要在微信支付平臺,設置支付目錄

指引文檔 https://pay.weixin.qq.com/wik...

script type="text/javascript" src="__STATIC__/frontend/js/jquery.min.js">/script>
script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js">/script>
script> 
 $(function () {
  $(".am-btn").click(function () {
   var score = $(".score div input:checked").val();
   $.post("發起微信支付后端接口URL", {"score": score}, function (res) {
    if (res.status === 500) {
     alert(res.message);
     return;
    }
    if (typeof WeixinJSBridge == "undefined") {
     if (document.addEventListener) {
      document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
     } else if (document.attachEvent) {
      document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
      document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
     }
    } else {
     onBridgeReady(res);
    }
   })
  })
  function onBridgeReady(param) {
   var orderId = param.data.orderId;
   WeixinJSBridge.invoke('getBrandWCPayRequest', {
     "appId": param.data.appId,
     "timeStamp": param.data.timeStamp,
     "nonceStr": param.data.nonceStr,
     "package": param.data.package,
     "signType": param.data.signType,
     "paySign": param.data.paySign
    },
    function (res) {
     if (res.err_msg === "get_brand_wcpay_request:ok") {
      window.location.href = "{:url('index/order/successful')}?order_id=" + orderId;
     }
    });
  }
 })
 /script>

三、異步通知

簽名校驗

文檔 https://pay.weixin.qq.com/wik...

驗證簽名

//驗證數字簽名
func VerifyRsaSign(msg []byte, sign []byte, publicStr []byte, hashType crypto.Hash) bool {
 //pem解碼
 block, _ := pem.Decode(publicStr)
 //x509解碼
 publicKeyInterface, err := x509.ParseCertificate(block.Bytes)
 if err != nil {
  panic(err)
 }
 publicKey := publicKeyInterface.PublicKey.(*rsa.PublicKey)
 //驗證數字簽名
 err = rsa.VerifyPKCS1v15(publicKey, hashType, msg, sign) //crypto.SHA1
 return err == nil
}
// 驗證簽名
func notifyValidate(timeStamp ,nonce,rawPost,signature string) (bool, error) {
 signature = base64DecodeStr(signature)
 message := fmt.Sprintf("%s\n%s\n%s\n", timeStamp, nonce, rawPost)
 publicKey, err := getPublicKey()
 if err != nil {
  return false, err
 }
 return VerifyRsaSign(hasha256(message), []byte(signature), []byte(publicKey), crypto.SHA256), nil
}

報文解密

type NotifyResponse struct {
 CreateTime string   `json:"create_time"`
 Resource NotifyResource `json:"resource"`
}
type NotifyResource struct {
 Ciphertext  string `json:"ciphertext"`
 AssociatedData string `json:"associated_data"`
 Nonce   string `json:"nonce"`
}
func notifyDecrypt(rawPost string) (decrypt string, err error) {
 var notifyResponse NotifyResponse
 if err = json.Unmarshal([]byte(rawPost), notifyResponse); err != nil {
  return decrypt, err
 }
 decryptBytes, err := decryptGCM(aesKey, notifyResponse.Resource.Nonce, notifyResponse.Resource.Ciphertext,
  notifyResponse.Resource.AssociatedData)
 if err != nil {
  return decrypt, err
 }
 decrypt = string(decryptBytes)
 return decrypt, nil
}

四、查詢訂單

文檔 https://pay.weixin.qq.com/wik...

查詢訂單

const searchTradeUrl = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s?mchid=%s"
// 查詢交易
func searchTrade(orderId string) (trade string, err error) {
 rawUrl := fmt.Sprintf(searchTradeUrl, orderId, mchId)
 token, err := authorization(http.MethodGet, nil, rawUrl)
 if err != nil {
  return trade, err
 }
 request, err := http.NewRequest(http.MethodGet, rawUrl, nil)
 if err != nil {
  return trade, err
 }
 request.Header.Add("Authorization", "WECHATPAY2-SHA256-RSA2048 "+token)
 request.Header.Add("User-Agent", "用戶代理(https://zh.wikipedia.org/wiki/User_agent)")
 request.Header.Add("Content-type", "application/json;charset='utf-8'")
 request.Header.Add("Accept", "application/json")
 client := http.DefaultClient
 response, err := client.Do(request)
 if err != nil {
  return trade, err
 }
 defer response.Body.Close()
 bodyBytes, err := ioutil.ReadAll(response.Body)
 if err != nil {
  return trade, err
 }
 return string(bodyBytes), nil
}

五、申請退款

文檔 https://pay.weixin.qq.com/wik...

申請退款

const refundUrl = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"
func refundTrade(orderId string, amount float64) (trade string, err error) {
 paramMap := make(map[string]interface{})
 paramMap["out_trade_no"] = orderId
 paramMap["out_refund_no"] = orderId + "-1"
 paramMap["amount"] = map[string]interface{}{"refund": amount * 100, "total": amount * 100, "currency": "CNY"}
 token, err := authorization(http.MethodPost, paramMap, refundUrl)
 if err != nil {
  return trade, err
 }
 marshal, _ := json.Marshal(paramMap)
 request, err := http.NewRequest(http.MethodPost, refundUrl, bytes.NewReader(marshal))
 if err != nil {
  return trade, err
 }
 request.Header.Add("Authorization", "WECHATPAY2-SHA256-RSA2048 "+token)
 request.Header.Add("User-Agent", "用戶代理(https://zh.wikipedia.org/wiki/User_agent)")
 request.Header.Add("Content-type", "application/json;charset='utf-8'")
 request.Header.Add("Accept", "application/json")
 client := http.DefaultClient
 response, err := client.Do(request)
 if err != nil {
  return trade, err
 }
 defer func() {
  response.Body.Close()
 }()
 bodyBytes, err := ioutil.ReadAll(response.Body)
 if err != nil {
  return trade, err
 }
 return string(bodyBytes), nil
}

到此這篇關于golang實現微信支付v3版本的方法的文章就介紹到這了,更多相關golang實現微信支付內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Django1.11配合uni-app發起微信支付的實現
  • Django實現支付寶付款和微信支付的示例代碼
  • python采用django框架實現支付寶即時到帳接口

標簽:遼寧 儋州 海南 電子產品 物業服務 安康 青海 西雙版納

巨人網絡通訊聲明:本文標題《golang實現微信支付v3版本的方法》,本文關鍵詞  golang,實現,微信,支付,版本,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang實現微信支付v3版本的方法》相關的同類信息!
  • 本頁收集關于golang實現微信支付v3版本的方法的相關信息資訊供網民參考!
  • 推薦文章
    激情小说欧美色图| 国产一区二区三区在线观看免费| 日韩av成人在线| 国内精品久久久久久久久久久| 成人在线激情视频| 国产成人午夜精品影院观看视频| 免费极品av一视觉盛宴| 一级女性全黄久久生活片免费| 色哟哟免费视频| 日韩av在线不卡| 日本免费一二三区| 国产精品极品美女粉嫩高清在线| 麻豆精品一区二区| 欧美日韩视频免费| 狠狠躁夜夜躁人人躁婷婷91| 日本二区在线观看| 欧美激情一级欧美精品| 奇米色777欧美一区二区| 最新欧美日韩亚洲| 一本色道久久综合亚洲91| 国产综合精品久久久久成人av| 美女福利精品视频| 久久亚洲精品伦理| 污污污污污污www网站免费| 日本韩国欧美国产| 久久久久亚洲av无码专区| 国产高清视频一区三区| 成人免费黄色大片| 国产色视频在线播放| 亚洲第一视频网站| 99久久国产热无码精品免费| 少妇精品久久久久久久久久| 第一福利永久视频精品| 久久精品一区二区三| 国产日产欧美a一级在线| 成人精品免费网站| 一区二区三区视频网| 亚洲欧美福利视频| 精品二区在线观看| 青青草综合视频| 日韩一卡二卡三卡| 国产男女无套免费网站| 美女黄色片网站| 69精品人人人人| 在线免费看91| 影音先锋亚洲视频| 欧美精品久久99| 国产精品露脸视频| 少妇免费毛片久久久久久久久 | 波多野结衣天堂| 亚洲免费福利视频| 日韩精品一二三四| 在线观看免费视频高清游戏推荐| www.亚洲男人天堂| 粉嫩蜜臀av国产精品网站| 可以看的av网址| 国内精品免费午夜毛片| 91香蕉视频污在线| 亚洲午夜久久久久久久国产| 国产精品网红福利| 一区二区三区.www| 国产福利拍拍拍| 日韩欧美在线电影| 日韩欧美在线网站| 亚洲欧美日韩动漫| 五月天激情播播| 久久久久久久久久久国产| 久久综合九色综合久久久精品综合| 中文字幕高清视频| 3d动漫啪啪精品一区二区免费| 亚洲妇女屁股眼交7| 国产精品久久久久久久久久久久久久久久久| 欧美 日韩 国产在线| 在线成人午夜影院| 无码国产伦一区二区三区视频| 国产精品视频黄色| 久久久久久久久久久亚洲| 国产人成一区二区三区影院| 欧美精品一级片| 亚洲精品国产精品国自产观看| 日韩美女主播在线视频一区二区三区| 日本加勒比一区| 91网址在线观看精品| 91av在线免费观看视频| 亚洲精品一二三区| 成人黄色三级视频| 亚洲 高清 成人 动漫| 久久福利视频网| 久久久久久久久久久电影| 欧美黑吊大战白妞| 椎名由奈jux491在线播放| 国产视频精品久久久| 丁香婷婷深情五月亚洲| 一本一本久久a久久| 亚洲高清乱码| 中文字幕精品在线| 欧美国产在线观看| 国产主播第一页| 国产综合免费视频| 日本a级片电影一区二区| 亚洲福利视频导航| 韩国中文字幕hd久久精品| 97人人模人人爽人人澡| 亚洲在线视频观看| 欧美一卡2卡3卡4卡| 国产精品一区二区不卡| 婷婷社区五月天| 亚洲自拍偷拍一区二区三区| 久久成年人视频| 亚洲自拍与偷拍| 亚洲精品视频网| 免费a在线观看播放| 国产日韩一区二区| 亚洲欧洲黄色网| 国产精品免费看片| 99久久久国产精品无码免费| 成人啪啪18免费游戏链接| 国产日本一区二区三区| 亚洲人成免费电影| 国产精品久久久久精k8 | 免费观看的毛片| 超碰男人的天堂| 日韩精品久久一区| 久久偷看各类女兵18女厕嘘嘘| 日韩理论在线观看| 黄色成人一级片| 88久久精品无码一区二区毛片| 日韩av图片| 久久国产精品久久国产精品| 欧美视频在线观看免费| 美日韩精品视频| 免费在线观看a视频| 久久精品在线免费视频| 欧洲美女7788成人免费视频| 欧美唯美清纯偷拍| 成人网页在线观看| 探花国产精品一区二区| 国产大尺度视频| 日本一区免费观看| 久久久久久国产精品美女| 色999日韩国产欧美一区二区| 久久99精品国产| 日本免费在线播放| www.久久久精品| 国产精品一级久久久| 亚洲欧洲午夜一线一品| 成人看片黄a免费看在线| 日韩在线一区二区三区免费视频| 亚洲精品成人在线播放| 99久久综合精品| 国产999精品视频| 日本wwww视频| 久久婷婷五月综合| 午夜一级黄色片| 色老头在线视频| 中文字幕人妻一区二区在线视频| 日韩激情视频网站| 色噜噜亚洲精品中文字幕| 国产精品99久久久久久久女警 | 亚洲综合成人av| 成人在线观看一区二区| 狠狠干视频网站| 亚洲xxxx18| 久久精品一偷一偷国产| 欧美嫩在线观看| 欧美77777| 亚洲电影成人av99爱色| 上原亚衣av一区二区三区| 麻豆一区二区三| 亚洲av综合一区| 三年中国中文观看免费播放| 激情网站五月天| 日韩成人在线资源| 国产精品久久久久久久久粉嫩av| 亚洲视频精品在线| 欧美日韩亚州综合| 亚洲精品国产一区二区精华液| 韩国女主播成人在线| 国产又粗又黄又爽| 免看一级a毛片一片成人不卡| 国产无套精品一区二区三区| 国产毛片视频网站| 日本不卡高清视频一区| 国产日韩精品在线| 久久久久久欧美| 国产丝袜一区二区三区| 欧美中文字幕一区| 亚洲精品欧美在线| k8久久久一区二区三区| 视频在线在亚洲| 在线视频不卡一区二区| 欧美激情乱人伦| 日韩欧美在线观看一区二区三区| 国产精品国产三级国产aⅴ中文| 日韩电影网1区2区| 亚洲综合免费视频| 麻豆一区二区三区在线观看| 一级在线免费视频| 亚洲天堂一区在线| 国产香蕉在线观看| 久久精品一区四区| 亚洲精品电影网站| 日本大片免费看| 久久久成人网| 亚洲欧美中文日韩在线v日本| 日韩欧美激情一区二区| 国产成人精品一区二区三区在线观看| 国产激情无码一区二区三区| aa级大片欧美| 日韩精品免费在线观看| 日韩中文不卡| 黄色片在线观看免费| 天堂av资源网| 国产精品视频第一区| 欧美高清视频一二三区| 91精品国产乱码久久久久久蜜臀| 中文字幕99| 日韩成年人视频| 欧美美女一级片| 干日本少妇首页| 成人短视频在线观看免费| 日韩一本精品| 精品一区二区三区日本| 91免费在线视频网站| 日韩免费观看视频| 欧美激情视频一区二区| 久久成人18免费网站| 色七七影院综合| 亚洲天堂av在线播放| 亚洲另类xxxx| 亚洲免费电影在线观看| 亚洲精品99999| 亚洲第一网站男人都懂| 欧美成人精品1314www| 欧美一激情一区二区三区| 欧美精品丝袜中出| 51午夜精品国产| 91精品国产黑色紧身裤美女| 91精品国产色综合久久不卡电影| 欧美日韩国产综合草草| 欧美日韩国产小视频在线观看| 欧美唯美清纯偷拍| 欧美一级生活片| 精品免费99久久| 亚洲精品黄网在线观看| 日韩精品一区二区三区第95| 日韩成人在线播放| 亚洲区在线播放| 视频在线观看一区二区| 色婷婷成人综合| 成人97在线观看视频| 欧美激情久久久| 国产精品av电影| 91中文在线观看| 精品国产乱码久久久久久蜜柚| 欧美日韩免费高清| 中文字幕一区综合| 久久久久久久午夜| 一道本在线免费视频| 无码国产精品一区二区高潮| 国产乱了高清露脸对白| 少妇无套高潮一二三区| 欧美毛片在线观看| 久草热在线观看| 囯产精品一品二区三区| 久久成人羞羞网站| 99在线热播精品免费| 国产精品国产成人国产三级| 亚洲国产精品久久人人爱| 在线视频一区二区免费| 精品福利av导航| 一个人www欧美| 欧美精品激情在线观看| 国产福利精品在线| 国产精品一区二区欧美黑人喷潮水| 欧美专区一二三| 美女扒开大腿让男人桶| 羞羞的视频在线| 国产中年熟女高潮大集合| 久久久久久久久97| 国产一区二区三区四区视频 | 日本精品一区二区| 一本二本三本亚洲码| 亚洲精品无码久久久久久| 午夜影院免费观看视频| 99精品全国免费观看| 91美女免费看| 亚洲欧美高清视频| 国产成人精品aa毛片| 国产精品久久久久久久裸模 | 好吊视频一区二区三区| 国产一区二区三区久久久 | 国产精品稀缺呦系列在线| 国新精品乱码一区二区三区18| 久久精品在线免费视频| www.国产视频.com| 特黄一区二区三区| 亚洲精品国产精品国自产网站按摩| 亚洲三级中文字幕| 久久久久国产精品免费免费搜索 | 精品呦交小u女在线| 午夜精品久久久久久久男人的天堂| 亚洲自拍偷拍网址| 韩国无码av片在线观看网站| 午夜影院免费版| 免费在线视频观看| 黄色三级网站在线观看| 91一区在线观看| 色屁屁一区二区| 中文字幕不卡在线视频极品| 国产欧美一区二区三区久久人妖| 亚洲三区在线观看| 91网址在线观看精品| 免费中文字幕视频| 蜜桃av一区| 国产精品久久久久久久岛一牛影视 | 亚洲精品国产综合区久久久久久久| 欧美国产日本高清在线| 激情成人中文字幕| 少妇高潮在线观看| 久久99精品久久久久久琪琪| 国产偷人爽久久久久久老妇app | 欧美激情论坛| 亚洲中文字幕无码专区| 精品人妻无码一区| 中文字幕精品无码亚| 精品一区二区免费| 亚洲蜜臀av乱码久久精品| 日韩欧美国产系列| 欧美中文字幕视频在线观看| 天堂va久久久噜噜噜久久va| www.日本久久| 无码人妻丰满熟妇精品| 国产一区二区三区日韩| 亚洲高清在线精品| 中文国产亚洲喷潮| 国产一区二区免费电影| 国产天堂在线播放| 久一区二区三区| 老汉av免费一区二区三区| 亚洲国产视频在线| 伊人青青综合网站| 国产九色91| 不卡中文字幕在线观看| 成人激情五月天| 91aaaa| 欧美在线播放高清精品| 九九热视频精品| 91国产在线免费观看| av在线不卡网| 久久久久久久穴| 欧美精品久久久久久久免费观看| 久久久com| jjzz黄色片| 国产精品自拍电影| 国产精品视频看| 一区二区三区四区在线观看视频| 国产青春久久久国产毛片| 宇都宫紫苑在线播放| 中文字幕一区二区免费| 国产亚洲精品7777| 亚洲情综合五月天| 欧美日韩国产精品一区二区| a天堂视频在线观看| 亚洲AV无码成人片在线观看| 亚洲视频一区二区免费在线观看| 亚洲一级片在线看| 涩涩涩999| 婷婷丁香综合网| 久久精品久久精品| 欧美精品777| 成人久久18免费网站图片| 一区二区三区 日韩| 在线中文字幕网站| 亚洲品质自拍视频| 欧美成aaa人片在线观看蜜臀| 黄色网zhan| 亚洲国产精一区二区三区性色| 成人v精品蜜桃久久一区| 精品国产三级a在线观看| 国产在线精品一区二区三区| 亚洲综合自拍网| 日本sm残虐另类| 91精品在线观看入口| 国产精品亚洲不卡a| 精品人妻无码一区二区三区 | 亚洲午夜未删减在线观看| 日韩高清国产精品| av网在线播放| 国产美女在线观看一区| 精品国偷自产国产一区| 蜜桃免费一区二区三区| 999福利视频| 91伊人久久大香线蕉| 日日骚久久av| 我的公把我弄高潮了视频| 久久精品视频2| 亚洲黄色片在线观看| 青青a在线精品免费观看| 日本中文字幕二区| 天天干,夜夜爽| 91麻豆精品国产91久久久资源速度 | 日韩一卡二卡三卡四卡| 国产一区二区高清不卡| 国产主播av在线| 久久综合色婷婷| 久久99亚洲精品| 日韩av卡一卡二| 青青草97国产精品免费观看 | 国产精品美女午夜av|