免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

PHP微信支付V3生產(chǎn)級(jí)封裝:認(rèn)證、請(qǐng)求、冪等與驗(yàn)簽全解析

PHP微信支付V3生產(chǎn)級(jí)封裝:認(rèn)證、請(qǐng)求、冪等與驗(yàn)簽全解析 簡介本資源是一份面向PHP中高級(jí)開發(fā)者的微信支付與退款功能實(shí)現(xiàn)方案聚焦電商及在線服務(wù)類網(wǎng)站的支付閉環(huán)需求無需集成微信官方SDK即可快速接入JSAPI支付與原路退款。壓縮包共3個(gè)PHP文件總大小僅7KB精簡實(shí)用核心為wxpay.class.php封裝統(tǒng)一下單、簽名生成、退款請(qǐng)求等邏輯wxpay.php提供調(diào)用示例notify.php專用于處理支付與退款異步回調(diào)代碼結(jié)構(gòu)清晰、注釋完整便于理解簽名機(jī)制、參數(shù)組裝及狀態(tài)校驗(yàn)等關(guān)鍵環(huán)節(jié)。目前已有1008人學(xué)習(xí)下載適合希望避開SDK復(fù)雜配置、深入掌握微信支付底層交互流程的開發(fā)者可直接復(fù)用核心類并結(jié)合業(yè)務(wù)調(diào)整訂單號(hào)、密鑰等參數(shù)快速集成到現(xiàn)有項(xiàng)目中。1. 為什么你寫的“PHP微信支付和退款類”上線三天就被商戶投訴資金異常這不是一個(gè)講SDK怎么安裝的入門教程。某開發(fā)者在交付一個(gè)本地生活SaaS系統(tǒng)時(shí)用網(wǎng)上抄來的“通用PHP微信支付類”直接接入微信V3接口結(jié)果退款到賬延遲超2小時(shí)、部分訂單重復(fù)扣款、回調(diào)驗(yàn)簽頻繁失敗——不是代碼跑不通而是類的設(shè)計(jì)邏輯和微信V3真實(shí)業(yè)務(wù)流嚴(yán)重脫節(jié)。這個(gè)標(biāo)題里的“類”本質(zhì)是一套可維護(hù)、可審計(jì)、可灰度、能扛住微信支付網(wǎng)關(guān)抖動(dòng)與冪等邊界條件的業(yè)務(wù)封裝層不是把curl包一層function就叫“類”。它面向的是需要對(duì)接微信支付含JSAPI/H5/小程序、處理原路退款、同步查單、異步通知驗(yàn)簽、敏感字段加密解密、錯(cuò)誤重試退避、日志可追溯的中后臺(tái)PHP服務(wù)。適合正在用ThinkPHP/Laravel/Swoole或純原生PHP搭建支付中臺(tái)、SAAS計(jì)費(fèi)模塊、會(huì)員系統(tǒng)且已申請(qǐng)好微信商戶號(hào)、配置好APIv3密鑰、開通了退款權(quán)限的工程師。別急著復(fù)制粘貼先看清微信支付V3接口和PHP生態(tài)的真實(shí)水位線它不接受裸curl、不信任$_POST、不兼容PHP 7.2以下、對(duì)時(shí)間戳/隨機(jī)串/簽名頭格式零容忍。下面帶你從零手寫一個(gè)真正能進(jìn)生產(chǎn)環(huán)境的WechatPayService類。2. 從微信支付V3接口規(guī)范反推類結(jié)構(gòu)為什么必須拆成4個(gè)核心組件微信支付V3接口不是“調(diào)個(gè)API就行”它是一套強(qiáng)契約、高安全、多狀態(tài)的金融級(jí)協(xié)議。直接寫一個(gè)WechatPay::pay()方法必然崩盤。我一般會(huì)按微信官方文檔的能力域隔離原則把整個(gè)類拆成四個(gè)不可拆分的組件認(rèn)證器Auth、請(qǐng)求器Request、響應(yīng)處理器Response、業(yè)務(wù)門面Facade。這不是炫技是為后續(xù)加監(jiān)控、換日志、切流量、做AB測試留出縫。2.1 認(rèn)證器用APIv3密鑰生成Authorization頭不是拼接字符串微信V3要求每個(gè)請(qǐng)求頭帶Authorization: WECHATPAY2-SHA256-RSA2048 ...其值由timestampnonce_strbody三者SHA256哈希后再用商戶私鑰RSA2048簽名。很多人卡在這一步——用openssl_sign()但沒設(shè)OPENSSL_ALGO_SHA256或body沒做JSON標(biāo)準(zhǔn)化空格、換行、鍵序錯(cuò)亂導(dǎo)致簽名不一致。?php class WechatPayAuth { private $mchId; private $serialNo; private $privateKey; public function __construct(string $mchId, string $serialNo, string $privateKeyPath) { $this-mchId $mchId; $this-serialNo $serialNo; $this-privateKey file_get_contents($privateKeyPath); if (!$this-privateKey) { throw new InvalidArgumentException(Failed to load private key from {$privateKeyPath}); } } public function generateAuthHeader(string $method, string $url, string $body ): array { $timestamp (string)time(); $nonceStr bin2hex(random_bytes(16)); // 必須每次請(qǐng)求新生成 $message $method . \n . parse_url($url, PHP_URL_PATH) . \n . $timestamp . \n . $nonceStr . \n . $body . \n; $signature ; $privateKey openssl_pkey_get_private($this-privateKey); openssl_sign($message, $signature, $privateKey, OPENSSL_ALGO_SHA256); openssl_free_key($privateKey); $authHeader sprintf( WECHATPAY2-SHA256-RSA2048 mchid%s,nonce_str%s,signature%s,timestamp%s,serial_no%s, $this-mchId, $nonceStr, base64_encode($signature), $timestamp, $this-serialNo ); return [ Authorization $authHeader, Wechatpay-Serial $this-serialNo, Wechatpay-Timestamp $timestamp, Wechatpay-Nonce $nonceStr, ]; } }參數(shù)說明$method必須大寫如POST$url必須是完整路徑不含域名如/v3/pay/transactions/jsapi$body必須是未格式化JSON字符串無空格、無換行、鍵名按字典序排列——微信校驗(yàn)嚴(yán)格。$privateKeyPath指向你從微信商戶平臺(tái)下載的apiclient_key.pem文件路徑。注意openssl_sign()返回的是二進(jìn)制簽名必須base64_encode()后填入header。2.2 請(qǐng)求器用cURL而非file_get_contents必須控制超時(shí)與重試微信支付網(wǎng)關(guān)有明確SLA支付下單99%請(qǐng)求300ms退款95%1s。但網(wǎng)絡(luò)抖動(dòng)、DNS解析失敗、連接池耗盡時(shí)裸curl會(huì)卡死。必須設(shè)置CURLOPT_TIMEOUT_MS非CURLOPT_TIMEOUT并實(shí)現(xiàn)指數(shù)退避重試最多2次。?php class WechatPayRequest { private $baseUrl https://api.mch.weixin.qq.com; private $httpClient; public function __construct() { $this-httpClient curl_init(); curl_setopt_array($this-httpClient, [ CURLOPT_RETURNTRANSFER true, CURLOPT_HEADER false, CURLOPT_FOLLOWLOCATION false, CURLOPT_SSL_VERIFYPEER true, // 必須開啟證書校驗(yàn) CURLOPT_SSL_VERIFYHOST 2, CURLOPT_CONNECTTIMEOUT_MS 3000, CURLOPT_TIMEOUT_MS 10000, // 總超時(shí)10秒微信要求最長15秒 CURLOPT_HTTPHEADER [Content-Type: application/json; charsetutf-8], ]); } public function send(string $method, string $path, array $headers [], string $body ): array { $url $this-baseUrl . $path; $attempts 0; $maxAttempts 2; do { curl_setopt_array($this-httpClient, [ CURLOPT_URL $url, CURLOPT_CUSTOMREQUEST $method, CURLOPT_HTTPHEADER array_merge([Content-Type: application/json; charsetutf-8], $headers), CURLOPT_POSTFIELDS $body, ]); $response curl_exec($this-httpClient); $httpCode curl_getinfo($this-httpClient, CURLINFO_HTTP_CODE); $error curl_error($this-httpClient); if ($response false || $httpCode 0) { if ($attempts $maxAttempts) { usleep((int)pow(2, $attempts) * 100000); // 指數(shù)退避100ms, 200ms continue; } throw new RuntimeException(cURL failed after {$maxAttempts} attempts: {$error}); } $responseBody json_decode($response, true); if (json_last_error() ! JSON_ERROR_NONE) { throw new RuntimeException(Invalid JSON response: . substr($response, 0, 200)); } return [ code $httpCode, body $responseBody, headers $this-parseHeaders(curl_getinfo($this-httpClient, CURLINFO_HEADER_OUT)), ]; } while (false); throw new RuntimeException(Unexpected flow in request); } private function parseHeaders(string $rawHeaders): array { $headers []; foreach (explode(\r\n, trim($rawHeaders)) as $line) { if (strpos($line, :) ! false) { [$key, $value] explode(:, $line, 2); $headers[trim($key)] trim($value); } } return $headers; } }關(guān)鍵點(diǎn)CURLOPT_SSL_VERIFYPEER必須為true微信強(qiáng)制HTTPSCURLOPT_TIMEOUT_MS設(shè)為10000毫秒是平衡成功率與用戶體驗(yàn)的血淚經(jīng)驗(yàn)——設(shè)太短丟單設(shè)太長用戶等不及。usleep()退避時(shí)間按2^n * 100ms計(jì)算這是微信官方推薦的客戶端重試策略。parseHeaders()用于調(diào)試時(shí)打印原始請(qǐng)求頭生產(chǎn)環(huán)境可刪。3. 支付與退款的核心業(yè)務(wù)方法如何讓unifiedOrder()和refund()真正冪等微信支付V3的“冪等”不是靠傳out_trade_no就能解決的。它要求同一筆訂單多次調(diào)用下單接口必須返回相同prepay_id同一筆退款多次調(diào)用退款接口必須返回相同refund_id且不重復(fù)扣款。這需要你在類里內(nèi)置狀態(tài)機(jī)和本地緩存哪怕只是Redis而不是把責(zé)任全甩給微信。3.1 下單接口JSAPI支付必須帶openid且notify_url要帶商戶號(hào)參數(shù)微信JSAPI支付要求payer.openid字段且notify_url必須是HTTPS、可公網(wǎng)訪問、且不能帶?參數(shù)微信不支持帶query的回調(diào)地址。常見翻車點(diǎn)用$_SERVER[HTTP_REFERER]拼notify_url或把測試域名寫死在代碼里。?php class WechatPayService { private $auth; private $request; private $cache; // PSR-16 cache interface, e.g. Redis public function __construct(WechatPayAuth $auth, WechatPayRequest $request, $cache null) { $this-auth $auth; $this-request $request; $this-cache $cache ?: new ArrayCache(); // fallback } public function unifiedOrder(array $params): array { // 1. 強(qiáng)校驗(yàn)必填字段 $required [appid, mchid, description, out_trade_no, amount, payer, notify_url]; foreach ($required as $field) { if (!isset($params[$field])) { throw new InvalidArgumentException(Missing required field: {$field}); } } // 2. 構(gòu)建請(qǐng)求體微信要求鍵名小寫、順序固定 $body [ appid $params[appid], mchid $params[mchid], description $params[description], out_trade_no $params[out_trade_no], amount [ total (int)$params[amount][total], currency $params[amount][currency] ?? CNY, ], payer $params[payer], // 必須含 openid notify_url $params[notify_url], // 必須HTTPS且不能帶?參數(shù) ]; // 3. 冪等控制檢查本地是否已存在該out_trade_no的prepay_id $cacheKey wxpay:order: . $params[out_trade_no]; $cached $this-cache-get($cacheKey); if ($cached isset($cached[prepay_id]) $cached[status] success) { return $cached; } // 4. 發(fā)起請(qǐng)求 $headers $this-auth-generateAuthHeader(POST, /v3/pay/transactions/jsapi, json_encode($body)); $result $this-request-send(POST, /v3/pay/transactions/jsapi, $headers, json_encode($body)); if ($result[code] ! 200) { throw new RuntimeException(Wechat pay failed: . json_encode($result[body])); } // 5. 提取prepay_id并緩存TTL 2小時(shí)覆蓋微信預(yù)支付有效期 $prepayId $result[body][prepay_id] ?? null; if (!$prepayId) { throw new RuntimeException(No prepay_id in response); } $this-cache-set($cacheKey, [ prepay_id $prepayId, status success, created_at time(), ], 7200); return [ prepay_id $prepayId, timestamp (string)time(), nonce_str bin2hex(random_bytes(16)), package prepay_id{$prepayId}, sign_type RSA, ]; } }參數(shù)說明$params[payer]必須是[openid xxx]格式$params[amount]必須是整數(shù)分如100代表1元$params[notify_url]建議用路由生成器動(dòng)態(tài)拼例如https://yourdomain.com/api/wechat/notify?mchid123456789然后在回調(diào)入口里用$_GET[mchid]區(qū)分多商戶。緩存TTL7200是硬性要求——微信prepay_id2小時(shí)過期緩存比它短會(huì)導(dǎo)致重復(fù)下單。3.2 退款接口必須校驗(yàn)原訂單狀態(tài)且out_refund_no要全局唯一微信退款要求1原訂單必須是SUCCESS狀態(tài)2退款金額≤原訂單金額3同一out_refund_no只能成功一次。很多人忽略第1條直接調(diào)退款結(jié)果微信返回ORDERNOTEXIST或REFUNDAMOUNTERROR。?php public function refund(array $params): array { // 1. 校驗(yàn)參數(shù) $required [out_trade_no, out_refund_no, amount]; foreach ($required as $field) { if (!isset($params[$field])) { throw new InvalidArgumentException(Missing refund field: {$field}); } } // 2. 查詢原訂單狀態(tài)微信要求退款前必須確認(rèn)訂單有效 $orderStatus $this-queryOrder($params[out_trade_no]); if ($orderStatus[status] ! SUCCESS) { throw new InvalidArgumentException(Cannot refund order with status: {$orderStatus[status]}); } // 3. 構(gòu)建退款請(qǐng)求體 $body [ out_trade_no $params[out_trade_no], out_refund_no $params[out_refund_no], amount [ refund (int)$params[amount][refund], total (int)$params[amount][total], currency $params[amount][currency] ?? CNY, ], reason $params[reason] ?? 用戶申請(qǐng)退款, notify_url $params[notify_url] ?? https://yourdomain.com/api/wechat/refund-notify, ]; // 4. 冪等檢查refund_no是否已存在 $refundCacheKey wxpay:refund: . $params[out_refund_no]; $cachedRefund $this-cache-get($refundCacheKey); if ($cachedRefund $cachedRefund[status] success) { return $cachedRefund; } // 5. 調(diào)用微信退款接口 $headers $this-auth-generateAuthHeader(POST, /v3/pay/transactions/out-refunds, json_encode($body)); $result $this-request-send(POST, /v3/pay/transactions/out-refunds, $headers, json_encode($body)); if ($result[code] 200) { $refundId $result[body][refund_id] ?? null; if (!$refundId) { throw new RuntimeException(No refund_id in refund response); } $this-cache-set($refundCacheKey, [ refund_id $refundId, status success, created_at time(), ], 86400); // 退款I(lǐng)D長期有效緩存1天 return [ refund_id $refundId, out_refund_no $params[out_refund_no], status success, ]; } // 微信退款可能返回422業(yè)務(wù)校驗(yàn)失敗需透出具體錯(cuò)誤 if ($result[code] 422) { $err $result[body][code] ?? UNKNOWN_ERROR; $msg $result[body][message] ?? Unknown error; throw new RuntimeException(Wechat refund failed ({$err}): {$msg}); } throw new RuntimeException(Wechat refund HTTP error: {$result[code]}); }關(guān)鍵邏輯queryOrder()方法必須先調(diào)用/v3/pay/transactions/id/{transaction_id}或/v3/pay/transactions/out-trade-no/{out_trade_no}查單確保原訂單是SUCCESS。out_refund_no必須由你的系統(tǒng)生成如date(YmdHis) . rand(1000,9999)且全局唯一——微信不接受重復(fù)out_refund_no哪怕對(duì)應(yīng)不同訂單。緩存TTL86400是因?yàn)閞efund_id永久有效但退款狀態(tài)可能變更如轉(zhuǎn)為ABNORMAL所以實(shí)際業(yè)務(wù)中還需定時(shí)查單同步狀態(tài)。4. 回調(diào)驗(yàn)簽與解密為什么90%的“驗(yàn)簽失敗”都栽在Wechatpay-Serial頭和響應(yīng)體格式上微信所有異步回調(diào)支付成功、退款成功都帶兩個(gè)關(guān)鍵頭Wechatpay-Timestamp、Wechatpay-Nonce、Wechatpay-Signature、Wechatpay-Serial。而最常被忽略的是Wechatpay-Serial——它標(biāo)識(shí)本次回調(diào)用的是哪個(gè)平臺(tái)證書你必須用對(duì)應(yīng)的公鑰驗(yàn)簽。很多人用錯(cuò)證書或把整個(gè)響應(yīng)體當(dāng)$body傳給驗(yàn)簽函數(shù)卻忘了微信回調(diào)的$body是原始二進(jìn)制不是JSON且$message拼接規(guī)則和請(qǐng)求時(shí)完全不同。4.1 支付回調(diào)驗(yàn)簽先取原始body再拼message微信回調(diào)的$_POST為空必須用file_get_contents(php://input)讀原始數(shù)據(jù)。且$message拼接格式為${wechatpay-timestamp}\n${wechatpay-nonce}\n${response-body}\n注意末尾換行。?php public function verifyNotify(string $rawBody, array $headers): bool { // 1. 提取必要header $timestamp $headers[Wechatpay-Timestamp] ?? ; $nonce $headers[Wechatpay-Nonce] ?? ; $signature $headers[Wechatpay-Signature] ?? ; $serial $headers[Wechatpay-Serial] ?? ; if (!$timestamp || !$nonce || !$signature || !$serial) { return false; } // 2. 獲取對(duì)應(yīng)序列號(hào)的平臺(tái)證書需提前從微信下載并緩存 $certPem $this-getPlatformCert($serial); if (!$certPem) { return false; } // 3. 拼接待驗(yàn)簽字符串注意rawBody是原始二進(jìn)制不能json_decode $message $timestamp . \n . $nonce . \n . $rawBody . \n; // 4. 驗(yàn)簽 $pubKey openssl_pkey_get_public($certPem); $ok openssl_verify($message, base64_decode($signature), $pubKey, OPENSSL_ALGO_SHA256); openssl_free_key($pubKey); return $ok 1; } private function getPlatformCert(string $serial): ?string { // 實(shí)際項(xiàng)目中這里應(yīng)從Redis或文件緩存讀取證書 // 證書需定期更新微信每3個(gè)月輪換建議用定時(shí)任務(wù)自動(dòng)拉取 $certPath /path/to/certs/{$serial}.pem; return file_exists($certPath) ? file_get_contents($certPath) : null; }血淚經(jīng)驗(yàn)$rawBody必須是原始輸入不能json_decode($rawBody, true)后再拼——微信驗(yàn)簽用的是原始字節(jié)流。$message末尾的\n是硬性要求漏掉就100%失敗。getPlatformCert()必須支持多證書微信可能同時(shí)啟用多個(gè)serial且證書要存本地文件不能每次HTTP拉否則高并發(fā)下IO打滿。微信平臺(tái)證書有效期90天必須監(jiān)控過期時(shí)間并自動(dòng)刷新。4.2 退款回調(diào)解密用AES-256-GCM不是簡單base64微信退款回調(diào)的resource字段是AES-256-GCM加密的JSON需用$associated_data和$nonce解密。很多人用錯(cuò)算法如用AES-128-CBC或把$nonce當(dāng)$iv用或忽略$associated_data。?php public function decryptResource(array $resource, string $apiv3Key): ?array { if (!isset($resource[algorithm], $resource[ciphertext], $resource[nonce], $resource[associated_data])) { return null; } if ($resource[algorithm] ! AEAD_AES_256_GCM) { return null; } $ciphertext base64_decode($resource[ciphertext]); $nonce base64_decode($resource[nonce]); $aad base64_decode($resource[associated_data]); // AES-256-GCM解密 $decrypted openssl_decrypt( $ciphertext, aes-256-gcm, $apiv3Key, OPENSSL_RAW_DATA, $nonce, $aad ); if ($decrypted false) { return null; } $data json_decode($decrypted, true); if (json_last_error() ! JSON_ERROR_NONE) { return null; } return $data; } // 使用示例 // $rawBody file_get_contents(php://input); // $headers getallheaders(); // if ($this-verifyNotify($rawBody, $headers)) { // $notifyData json_decode($rawBody, true); // $decryptData $this-decryptResource($notifyData[resource], $this-apiv3Key); // if ($decryptData $decryptData[refund_status] SUCCESS) { // // 更新本地訂單狀態(tài) // } // }參數(shù)說明$apiv3Key是你在微信商戶平臺(tái)設(shè)置的32位APIv3密鑰不是APIv2的key必須嚴(yán)格保密。openssl_decrypt()第4個(gè)參數(shù)是OPENSSL_RAW_DATA第5個(gè)是$nonce第6個(gè)是$aad——三者缺一不可。解密失敗時(shí)openssl_decrypt()返回false不要直接json_decode()。5. 避坑那些讓線上支付服務(wù)凌晨三點(diǎn)告警的5個(gè)真實(shí)問題別等線上出事才看日志。以下是我在三個(gè)不同項(xiàng)目中踩過的坑每一條都附帶現(xiàn)象、根因和可落地的解決方案。5.1 現(xiàn)象退款成功后用戶收不到錢微信商戶平臺(tái)顯示“退款異常”原因調(diào)用退款接口時(shí)amount.total傳了字符串100而非整數(shù)100微信后端解析失敗但返回HTTP 200refund_id卻為空。解決在refund()方法開頭強(qiáng)制類型轉(zhuǎn)換$params[amount][refund] (int)$params[amount][refund]; $params[amount][total] (int)$params[amount][total];并在日志中記錄$params[amount]原始值便于排查。5.2 現(xiàn)象支付回調(diào)驗(yàn)簽通過但$rawBody解析出的resource字段為空原因Nginx配置了client_max_body_size 1M而微信回調(diào)體可能超1MB尤其含大量商品信息時(shí)導(dǎo)致body被截?cái)?。解決在Nginx配置中增加location /api/wechat/notify { client_max_body_size 5M; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; }并用strlen($rawBody)校驗(yàn)長度小于100字節(jié)即告警。5.3 現(xiàn)象同一out_trade_no多次調(diào)用unifiedOrder()返回不同prepay_id原因緩存使用了memcached但未設(shè)置serialize選項(xiàng)導(dǎo)致ArrayCachefallback生效而ArrayCache不支持跨進(jìn)程共享。解決強(qiáng)制使用Redis緩存并在構(gòu)造函數(shù)中校驗(yàn)if (!$cache instanceof \Psr\SimpleCache\CacheInterface) { throw new InvalidArgumentException(Cache must implement PSR-16); }5.4 現(xiàn)象WechatPayAuth::generateAuthHeader()偶爾生成重復(fù)nonce_str原因bin2hex(random_bytes(16))在某些PHP版本如7.3以下的random_bytes()可能返回弱熵導(dǎo)致碰撞。解決改用更健壯的生成方式$nonceStr bin2hex(openssl_random_pseudo_bytes(16)); if (!$nonceStr) { $nonceStr bin2hex(random_bytes(16)); }5.5 現(xiàn)象退款回調(diào)解密后$decryptData[refund_status]始終為PROCESSING原因微信退款是異步流程PROCESSING表示正在處理需等待5-30分鐘但業(yè)務(wù)代碼誤以為失敗觸發(fā)重試導(dǎo)致微信重復(fù)退款。解決在回調(diào)處理中對(duì)PROCESSING狀態(tài)不做任何DB更新僅記錄日志并啟動(dòng)一個(gè)5分鐘后的延遲任務(wù)查單if ($decryptData[refund_status] PROCESSING) { // 推送延遲任務(wù)到隊(duì)列5分鐘后執(zhí)行 queryRefund($out_refund_no) $this-delayQueue-push(check_refund_status, [ out_refund_no $out_refund_no, retry_count 0, ], 300); // 5分鐘 }6. 進(jìn)階技巧用phpstan和psalm靜態(tài)分析守住支付類的類型安全紅線支付類一旦出錯(cuò)就是資金事故不能只靠單元測試。我堅(jiān)持在CI中加入靜態(tài)分析堵住90%的低級(jí)錯(cuò)誤。比如unifiedOrder()的$params[amount][total]必須是int但PHP默認(rèn)是stringjson_encode()后微信會(huì)拒收。6.1 用PHPStan定義嚴(yán)格類型契約在phpstan.neon中添加parameters: level: 8 paths: - src/WechatPayService.php typeToStrictTypes: int: [int, integer] string: [string] checkAlwaysTrueCheckTypeFunctionCall: true然后在類方法注釋中寫明/** * param array{ * appid: string, * mchid: string, * description: string, * out_trade_no: string, * amount: array{total: int, currency?: string}, * payer: array{openid: string}, * notify_url: string * } $params * return array{prepay_id: string, timestamp: string, nonce_str: string, package: string, sign_type: string} */ public function unifiedOrder(array $params): array運(yùn)行vendor/bin/phpstan analyse它會(huì)立刻報(bào)錯(cuò)Parameter #1 $params of method WechatPayService::unifiedOrder() expects array{amount: array{total: int, ...}, ...}, parent type array given.逼你把$params[amount][total] (int)$_POST[total]寫進(jìn)代碼而不是靠“應(yīng)該沒問題”的僥幸。6.2 用Psalm檢測數(shù)組鍵缺失風(fēng)險(xiǎn)Psalm能發(fā)現(xiàn)$params[payer][openid]可能不存在的問題。在psalm.xml中projectFiles directory namesrc / ignoreFiles directory namevendor / /ignoreFiles /projectFiles并在方法上加/** * psalm-param array{payer: array{openid: string}} $params */當(dāng)有人傳[payer []]時(shí)Psalm直接標(biāo)紅“Missing keyopenidin array”。6.3 給關(guān)鍵方法加throws文檔讓IDE自動(dòng)提示異常鏈/** * throws InvalidArgumentException 當(dāng)參數(shù)缺失或格式錯(cuò)誤 * throws RuntimeException 當(dāng)微信接口返回非200或JSON解析失敗 * throws RuntimeException 當(dāng)驗(yàn)簽失敗或解密失敗 */ public function verifyNotify(string $rawBody, array $headers): bool這樣在調(diào)用處PHPStorm會(huì)顯示所有可能拋出的異常提醒你try-catch而不是讓Exception一路冒泡到頂層500。最后說一句我寫這個(gè)類的第7版時(shí)把WechatPayService拆成了WechatPayV3Client純HTTP、WechatPayDomain業(yè)務(wù)規(guī)則、WechatPayGateway適配器因?yàn)槟炒挝⑿磐蝗簧?jí)了證書格式只改了一個(gè)適配器就全量切流。支付類不是越“全能”越好而是越“可替換”越穩(wěn)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香WWW| 婷婷五月丁香激情图片 | 色婷丨日丨天丨综合久久| 狠狠干,狠狠操| 丁香五月亚洲AV| 五月婷婷性爱| 第四色婷婷五月| 大香蕉伊人久久| 综合欧美五月婷婷| 99热999| 99热的无码| 91九色 熟| 国产日韩欧美性爱| 怕怕av| 超碰av在线| 综合激情伊人影视在线| 久久久久久9热不雅视频| 亚州色色色| 亚洲天天综合| 五月丁香啪啪啪| 色色色热热热| 丁香六月婷婷色播| 久久亚洲婷婷| 影音先锋女人av鲁色资源网小说免费| 大天天伊人| 丁香色婷婷| 色综合爽| 久久中国毛毛片爱久久| 狠狠久久婷五月综合色| 色碰碰视频| 九九热99免费视频| 天天狠天天叉| 五月婷婷婷自由综合| 日韩欧美老妇性视频91久久久| 国产成人+综合亚洲+天堂| 国产99视频永久免费| 成人在线高清| 婷婷干六月综合旧址| 色五月欧美| 亚洲色9| 丁香婷婷综合喷| 99视频内射三四| 色色色色欧洲| 九九热大香蕉| 五月天丁香久久| 九九热精品| 色色色热| 色五月婷婷基地| 五月婷免费视频久久久| 丁香丁香激情网| 色五月综合97| 大香蕉娱乐| 色婷婷激情| 婷婷国产成人| 俺去也五月天| 婷婷激情小说| 婷婷瑟瑟五月天| 丁香五月天欧洲在线| 丁香婷婷五月人体| 骚逼视频一区2区| 99热免费观看| 99热在线播放| 五月天激情小说网| 午夜69成人做爰视频| 国产免费AV网站| 日本在线视频播放91| 婷婷狠狠香蕉综合| 国产成人在线不卡AV| 日韩AV片| 色色色综合色| 99久久久久| 综合久久影院| AVDV久久| 精品无码久久久久久久久| 色综合激情| 五月婷婷 激情五月| 伊人六月无码视频| 五月色丁香| 成人在线免费网址| 色播播婷婷| 黄页免费一级视频懂色| 五月停停色| 日韩综合成人| 国产成人亚洲综合亚洲| 这里只有精品免费视频在线观看| 色女伊人| 丁香五月婷婷超碰在线| 中文激情网| 五月婷综合| 九月婷婷| 久久99视频| 久9精品视频在线| 超碰A V在线| 91激情五月开心| 色5月婷婷| site:picc-up.com| 亚洲成人中心| www.色多多婷| 丁香 婷婷 激情 综合 五月| 丁香五月婷婷在线| 亚洲精品无人区| 丁香五月婷婷高清| 狠狠操天天日| 色五月激情综合网| 亭亭玉月丁香| 成人做爰A片免费看网站找不到了| www久久久久久久久久久| 97啪在线观看视频| 亚洲夜五月| 丁香六月婷婷姐网| 精品一区二区三区免费毛片爱| 婷婷五月天最新网址| 99啪啪网| 亚洲六月色| 丁香六月综合激情| 91成人品| 狠狠五月激情丁香六月| www.久久爱.c n| 日韩五月婷婷| 丁香五月婷久久| AV中文网| 丁香六月婷婷综合网| 久热99热| 激情啪啪五月天| 99精品亚洲| 国产亚洲99久久精品熟| 五月色丁香国产在线视频| 深爱激情五月婷婷| 七七色综合| 婷婷丁香六月五月天| 99爱在线精品视频免费观看| 任你弄在线视频免费| 91欧美| 九九这里有精品| 性做爰A片免费视频A片直播 | 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 夜夜爽天天爽| 99视频91| 丁香五月激情五月| 久久超级碰视频| 26uuu欧美亚洲日韩| 精典久久| 色色99| 色图亚洲91| 人人澡天天色天天做| www.久久久.com| 婷婷五月天毛片| 色婷婷五月婷婷五月婷婷五月| 成人视频一区| 激情五月天在线观看色婷婷| 欧亚成人A片一区二区| 丁香六月久久| 色五月婷婷在线| 九九热中文| 亚洲婷婷五月| 色丁香五月婷婷| 热99在线精品| 狠狠操综合| 996热| 色狠狠999综合| 99热色综合| 天天网站天天爽| 五月婷婷激情网| 成人丁香五月| 日韩成人影片网站| 日本五月婷婷| 中文字幕在线免费观看视频| 91啪啪| 天天曰夜夜爽| 久色精品| 五月天播播| www.com亚洲网站在线免费| 夜夜爽天操| 天天久综合网永久入口18| 亚州AV超碰人人操| 97色啪| 色五月婷婷在线| 久久久99婷婷久久久久久| 超碰99久久| AV在线资源| 欧美日本国产欧美日本韩国99| 婷婷五月综激情| 97精品自拍视频| 久青草影院| 亚洲 视频 导航 一区| 天天做天天爱天天高潮| 色播五月婷婷综合| 18久久| 91视频精品99| 色五月久久成人婷婷| 爆乳熟妇一区二区三区四区| 成人一级片| 婷婷五月天综合激情| 五月丁香啪啪啪| 丁香五月冃欧美| 天天操精品| 中文字幕在线资源| 激情网综合| 精典久久| 99er6热在线观看精品6| 欧美精品99| 成人国产欧美大片一区| 狠狠色丁香婷婷久久综合| 色色色色热热| www.99热这里精品| 禁欲电影完整版在线播放| 激情综合另类| 99热只有精品在线播放| 天堂爱啪啪| 91chinese在线| 天天操夜夜爱| 精品在线| 日本91在线| 大香蕉久久视频久久视频| 久热免费| 婷婷综合五月色播| caobi四区| 97五月久久丁香婷婷| 啊v视频在线观看| 91色五月在线观看| 色色国产| 第五色婷婷| 亚洲经典小视频| 五月婷婷基地| 欧美在线看| tingtingcaobi| 区美毛片子| 99热的无码| 91久久久久久久| 国产原创视频91九色| 欧美人妻一区二区| 色情综合网| 四色五月婷婷在线观看| 久热这里精品免费| 九九亚洲小视频| 九九色热| 综合亚洲六月婷婷在线| 人妻激情久久| 怡红院视频| 99人这里只有精品| 91ncom.色| 成人五月天视频播放| 天天搡日日搡aaaaⅩ| 五月色婷婷AV| 99在线看片| 婷婷丁香社区网| 五月狠狠| 日韩 中文 欧美| 色婷婷精| 欧美色色日韩| 激情啪啪五月| 91超级碰碰| 久9久成人精品视频| 婷婷色综合中心站| 色婷大香蕉| 亚洲亚洲人成综合网络| 丁香狠狠干| 777精品久无码人妻蜜桃| 丁香六月婷婷综合| 激情99| 天天色天天| 十月丁香九月婷婷综合| 婷婷色综合中心站| 欧美碰碰碰| 伊人久久大香| 成人丁香色| www.五月婷婷.com| 99re思思精品视频在线观看| 亚洲AV无码久久精品色欲| 色婷婷在线视频久| 五月激情婷婷开心| 五月天 婷 欧美亚洲| 精品久久66| 丁香婷婷视频一区二区| 五月天色综合| 涩五月婷婷| 婷婷亚洲综合| 91seAV| 综合激情九月婷婷,激情综合婷婷中文字| 婷婷色综合网日韩国产| 免费看片操逼| 五月激情四射婷婷丁香| 噜噜噜精品欧美成人在线观看| 成人国产欧美大片一区| 伊人大蕉香| 欧美超碰人人| 激情五月天婷婷激情| 99热这里只有精品1025| 丁香无月在线观看| 色色网五月激情| 丁香五月婷婷视频| 久久婷婷五月天| 日本在线播放97| 五月丁香人妻| 色五月婷婷在线视频| 涩涩网五月天| 美女精品一级不卡视频| 久久综合婷婷激情| 琪琪色五月天| 狠狠干五码| 激情丁香五月| 中字幕视频在线永久在线观看免费 | 9久国产| 丁香六月婷婷久久高清| 热99热| 欧美这里只有精品| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 91色久| 九月婷婷在线视频| 天天日天天添| 成功精品影院| 亚洲AV影片在线观看| 丁香五月婷婷色偷偷| 国产一级片| 色六月视频| 91婷婷在线| 超pen个人视频97| 国产肏屄大片| 夜夜综合色| 亚洲va综合va国产va中文| 在线一起草av| 亚洲婷婷婷| 久久久27操| 激情综合女人网五月播播| 婷婷五月美女直播| .青娱乐天天操B| 人妻久久婷婷| 久久99热免费最新版| 婷婷五月天色色| 97碰碰电影| 五月天婷婷在线啪啪视频| 天天色天天操天天射| 天天日天天色| 超碰在线99| 天天摸天天做天天爱天天爽| 婷婷干| 这里只有视频精品| 婷婷丁香五月亚洲17cao| 色综合婷婷99| 婷婷色情小说| 色五月激情五月| 色色色欧美| 国产欧美va| 丁香五月婷婷av影院| 91久热| 中文字幕av久久爽| 亚洲 五月 婷婷 成人| 99热只有| 久久亚洲色导航| 碰碰女| 色很久综合| 成人性爱精品视频| 日韩人妻AV在线| wwxx日本| AV在线不卡播放| 久久在这里有精品| 亚洲天堂婷婷丁香| 5月婷婷激情网| 碰99在线| 天天爱夜夜爽| 丁香花成人区| 综合视频久久| 伊人网欧美在线男人天堂五月丁香 | 亚洲岛国电影| 天天草比天天爽| 99久久66综合| 99成人免费视频| 99久久思思| 亚洲综合在线视频| 人人干天天操五月丁香| 成人中文网| 日韩精品色| 亚洲中文字幕AV在线| 婷婷五月天视频小说| 国产人妻人伦精品一区二区| 亚洲射激情| 少妇高潮呻吟A片免费看软件| 色月视频| 91精品视频男人的天堂| 9热视频在线观看| 亚洲AV综合网| 婷婷五月天AV| 79色色色色| 97人人操com| www.婷婷| 狠狠色官网| 婷婷97色| 啪啪99| 久久永久网址| 激情婷婷激情在线不卡| 中文字幕av网站| 亚洲免费婷婷| 婷婷五月色播网| 五月天开心网| 丁香五月Av| 日韩色五月| 香蕉婷婷| 日本色狠狠| 激情九月综合| 久久婷婷五月综合色丁香花| 五月丁香自拍| 色色丁香五月婷婷| 懂色av蜜臀av粉嫩av永陈冠希 | 五月天激情影院| 婷婷丁香五月六月激情| 开心五月婷婷婷美女| 九月婷婷久久| 人人噜天天上| 久久草人妻| 伊人网色婷婷五月天| 开心五月激情网| 丁香亭亭久久| 999久久久国产精品| 97久人人| 丰满老熟妇BBBBB搡BBB| 五月停停999| 六月香五月婷| 99re在线精品视频| 婷婷在线日韩综合| 久久久com| 久久免费精彩视频| 久色网五月| 婷婷无码视频| 91碰操| 可以直接看的av| 岛国AV网| 婷婷五月永远18免费久久久| 99综合网| www.henhenl| 在线视频九色97| 婷婷五月天伊人网| 五月婷婷深深爱| 久久婷婷色丁香| 一级性感黄色内射视频| 97在线视频 欧美| 五月色综合| 日本婷婷在线| www色五月| 性小说五月天| 99色这里| 日韩婷婷五月| 五月婷婷丁香综合| 九色七七| 色五婷婷| 久久婷婷丁香| 天天干天天曰天天射| 婷婷九月久久| 丁香五月停停av| 免费观看18视频网站| 日韩999| 婷婷五月丁香手机在线视频| 亚洲最大五月天成人网| 99精品久久久久久久婷婷久久 | 国产亚洲成AV人片在线观黄桃 | 噜噜噜噜噜色| 激情五月婷婷综合色播小说| 婷婷丁香五月六月激情| 婷婷五月天激情综合深爱| 色丁香五月婷婷婷| 成人五月天婷婷| 99人人干| 入口五月婷婷六月香| 99啪啪网| www.狠狠| 婷婷国产日本欧美| 99久久思思| 开心五月丁香综合久久| 婷婷激情鹿城五月天| 婷婷丁香五月精品| 免费观看的AV| 久久人妻人人槡| 国产精品色一哟哟| WWW.色婷婷.COM| 手机AVAV天堂看网| 五月婷婷狠狠干| 深爱五月网| 久色资源网| 色婷婷色五月天| 五月天久久网站| ji'qi'luan'ren'lun| 丁香五月婷婷色情综合| 麻豆雪千夏| 丁香婷婷基地| 99网| 五月丁香六月停停停| 婷婷丁香综合色AV| 久久网日本| 久久XX| 开心久久爱五月天| 少妇人妻综合色6699| 丁香婷婷五月天在线视频| 天天插天天爽| 色五月婷婷五月| 99网| 天啪色| 亚洲成人高清在线| 五月丁香拍拍激情综合| 五月天俺去也| 色婷婷69| 国精产品一区一区三区免费视频| 亚洲第二AV| 色综合中文色综合网| 婷婷免费精品视频| 亚洲亚洲永久无码777777| 免费啪啪亚州视频| 午夜天堂一区人妻| 丁香五月激情综合婷综| 九九免费精品在线视频| 国产成人99久久亚洲综合精品| 五月天激情综合网| 中国女人做爰A片| 丁香五月婷婷99| 丁香五月天啪啪| 五月婷婷五月天天| 91碰在线| 五月天色色色网| 丁香六月色婷婷| 天天操天天操天天操| 免费视频无码| 五月Huangsewang| 色婷婷色九月| 五月天婷婷乱| 色五月天婷婷| 五月天婷婷AV| site:ornaments52.com| 99色免费观看全部| 久久99jiu9| 婷婷丁香六月五月天| 九九热视| 日韩精品视频中文字幕| 色综合色综合网| 婷婷色5月激情网| 性爱视频久久| 久久9久久| 五月综合婷婷久久在线| 欧美激情综合| 日本九九九九| 玖玖五月丁香| 久久婷五月影院| 丁香五月在线伊人| 中文字幕av在线| 丁香婷婷影院| 中文不卡一二区| 思思99热| 热99国产精品| 97人妻碰碰碰久久香蕉| 激情综合在线播放| 色色色色色网站| 欧美性色A片免费免费观看的 | 婷婷色情小说| 777精品久无码人妻蜜桃| www99久久| 色婷婷精品| 婷婷色色网站| 插插五月天| 天天综合精品| 新99思思视频| 五月天婷婷色| 亚洲 激情 中文| 色欲婷婷五月天| 婷婷午夜综合| 91九色熟女| 99人人操| 99热成人精品网站| 91岛国片| 99久在线观看| 激情综合婷婷| 97人人草| 国产精品久久99| 五月天激情四射| 久久五月网| www.五月天色色.com| 91丁香| 丁香婷婷五月天在线视频| 大香蕉天堂色| 色天五月天在线观看视频| 一起操最新网址| 色区域网站视频| 99爱在线| 亚洲综合五月天婷婷| 怡春院天天干| AA久久| 色五月天堂| 91精品综合久久久久久五月丁香| 婷婷五月丁香综合亚洲 | 天天色天天操天天射| 99热丁香五月| 色婷婷久久综合| 日韩九区| 欧美韩国日本| 婷婷综合色五月天| WWW99热| 在线只有精品| 国产日日操夜夜操的肉棒视频| 影音先锋91视频| 夜色综合网| 久久婷婷五月综合| 久婷婷视平| 操骚货在线| 天天噜日日噜综合无码| 日本熟妇乱妇熟色A片蜜桃| 久99久热只有精品国产99| 天天肏天天舔AV| 国产激情在线| 激情网站综合五月天| 热久久999| 激情九色| 青青五月天婷婷| 色约约视频一区二区三区四区五区 | 五月激情啪啪啪| 五月丁香久久久日婷婷久久婷婷日| 久777| WWW99热| 五月婷婷色男女| 五月丁香A片| 久久国产色| 久久九九蜜| 伊人激情综合网| 国产毛片精品一区二区色欲黄A片| 无码人妻一区| 色激情综合狠狠婷婷| 丁香九月色| 亚洲精品亚洲人成人网| 91精品久久久久久综合五月天| 99九九在线| 色综啪啪网| AV成人在线播放| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 亚洲操人| 人人九色| 五月婷婷二月丁香| 五月天婷五月天综合网在线观| 九九超日本| 五月天激情网图片| 婷久久| 99精品免费欧美小视频 | 91色吧网| 激情五月亚洲综合网| 九九热10| WWW.久久久久久久久久久久久| 99成人| 久久丁香五月天| 乱抡小BB| 丁香五月 综合| 天天综合 99久久婷婷| 爱爱网址9| www.久久爱.com| 国产精品香蕉| 99在线看片| 日韩免费乱轮网站| 丁香五月自拍| 日本久久视频| 停停五月色宗合| 九九色插| 岛国AAAV| 日韩人妻白浆视频系列| 国产人妻777人伦精品HD| 午夜免费试看| 丁香六月激情| 色噜噜狠噜噜视频| 久久九九热视频| 亚洲免费99| 五月激情偷拍婷婷| 色综合色综合色综合高潮| 丁香五月婷婷激情小说| 国产精品久久..4399| 欧洲色区| 97五月天| 五月婷婷成人| 国产激情在线| 成人电影AV在线观看| 五月天偷拍| 亚洲最大视频| 无码色| 色爱99| 国产精品国产| 97丁香五月| 五月丁香色综合| 婷婷五月天网址| 激情九色| 99这里只有| 亚洲色色色| 这里只有精品久久| 中文字幕日产A片在线看| 亚洲日韩乱码一区二区三区四区| 三十熟女| 国产干逼片| www.色色com| 五月婷婷久久久久| 久久9精品| 欧美丁香婷婷天天操| 国产99热在线看| 国产寻花在线| 99久久免费精品| 日本色五月婷婷| 日本色久| 91丨九色丨东北熟女| 国产偷人爽久久久久久老妇APP| 91919191919久久成人视频| www.色色色com| 伊人大蕉香| 久久久久久9| 天堂AV三级| 26uuu亚洲欧美另类| 亚洲色情网站| 中文字幕不卡+婷婷五月| 99热在线观看免费精品| 精品久久久中文字幕大豆网推荐理由| 超碰A V在线| 五月天婷婷免费| 六月丁香五月婷婷首页| 开心婷婷五月中文字幕组| 五月天偷拍| 色爱综合网| 丁香五月婷婷色综合| 九九re视频在线视频| 久久99视频| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 久久婷丁香五月| 超碰精品在线| 蜜乳AV成人| 色吧五月| 精品五月天| 色99网站| 激情婷婷综合网| 九九综合视频在线观看| 这里只有精品网| 99热精品在线播放| 国内在线99视频| 熟女重口味αV| 99热这里只有精品中文字幕| a在线观看| 久久久五月天婷婷成人网| 91欧美| 日日杆天天| 成人无码精品1区2区3区免费看| 成片免费观看大全| 色色成人網| 9久热在线视频精品| 琪琪色网在线| 亚洲激情亚洲激情| 日本美女五月天| 久久九九激情五月天| 成人电影一区| 激情五月天小说网| 青柠影视免费高清电视剧| 中文字幕九九九九| 99re8在这里只有精品| 中文成人在线| 丁香六月激情综合| 色噜噜五月天| 狠狠狠狠青草| 五月婷婷丁香色吧网| 色墦五月丁香| 97精品综合久久| 婷婷八月丁香激情综合| 五月丁香六月综合图| 深夜婷婷五月丁香| 九热久| 精品久久久人妻| 99燥99日| 色情五月天se| 亚洲五月婷| 婷婷伊人中文字幕| 成人av播放| 人人操操| 五月丁香色婷婷| 97人人操人人操人人操人人| 深夜A片| 91re色综合视频| 逼逼AV| 国产精自产拍久久久久久蜜| 久久婷婷激情五月天一区二区| 日韩精品999| 久久超级碰碰| 网色99| 色色色干| 五月天婷婷激情小说电影| ww久久| 91干| jiujiu热在线视频| 婷婷五月六月丁香| 色五月综合网| 丁香色婷婷| 激情综合播播| 538在线精品| 激情综合网,婷婷五月天| 成人精品视频99在线观看免费| 欧美大奶熟女噜噜噜噜| 国产精品美女久久久久AV超清| 丁香婷婷免费| 精品人妻一区二区三区在| 9这里只有精品| www.第四色99| AV性爱网| 色欲婷婷五月天| 亚洲中文字幕网| 婷婷五月在线综合| 蜜桃人妻无码AV天堂三区| Av性爱网站| 免费视频WWW在线观看网站| 国产高潮A片羞羞视频涩涩| 天天粽合合合合| 激情小说色五月| 真实亲子乱子伦高清在线观看| 美女伊人久久| 超碰人人干| 成人必爱视| 性爱网五月婷婷| 欧美VA在线| 超碰在线9| 91精品丝袜久久久久久| 热这里| 综合五月丁香六月婷婷| 97干在线| 婷婷四色成人综合色视| 国产免费av在线| www.夜夜操.com| 99亚洲大片精品永久在线观看| 中文字幕高清av| 超碰国产AV| 婷婷色色五月天| 99热这里只有精品1025| 99热这里只有精品21| 97碰碰草| 五月天婷婷av| 99爱最新免费视频在线观看| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 夜夜爽天天爽| 国精产品久久| 激情四射网| 欧美电影在线观看| 狠狠色五月天| 日本婷婷综合精品| 97干婷婷| 美国少妇性做爰| WWW.17C亚洲精品| 99在线观看免费精品视频| 丁香五月成人自拍| 99色在线视频| 丁香五月婷老师| WWW色综合| 大香蕉75线| 天天做天天爱天天高潮| 五月天综合在线观看视频| 婷婷五月天视| 991精品在线视频| www,婷婷,com| 色噜噜狠狠一区二区三区| 99热这里只有免费| 久久五月天激情婷婷| 天堂五月婷婷| 色欲色欲久久宗合网| 久久综合九九| 婷婷五月丁香综合激情| 激情小说五月天中文字幕| 91碰超| 97涩婷婷| 九九视频在线观看视频6 | 国产激情av| 婷婷五月天电影区小说区| 激情五月黄色小说| 日本一毛片| 精品五月花| 欧美人与性动交CCOO| 99久热在线精品| 天天干 夜夜爽| 国产高清RV综合aVa| 久久婷婷五月国产色综合激情| 99碰视频| 免费观看日韩成人av| 亚洲亚洲人成综合网络| 五月天开心激情综合网| 五月天激情国产综合婷婷婷| 亚洲激情网站| WWW激情五月天| 五月天伊人久久久久| 婷婷成人综合五月| 欧洲亚洲最新精品| 99小视频在线| 五月婷婷深深爱| 超碰免费观看| 久久婷婷五月综合色区| 高清无码网址| 啪啪91| 国产这里只有精品| 色色射| 五月丁香色情| 91超碰九色| 久热中文字幕| 激情视频综合| 九九这里是免费的视频5| 激情五月婷婷| 久久综合五月天| 涩涩五月天| 亚洲综合激情五月久久| 亚洲丁香五月天视频| 色色AV色色色东莞| 天天爱天天操| 殴美激情综合网| 中文字幕视频在线播放| 亚洲AV网址| PORNY九色9l自拍视频成人| 久久婷婷综合网| 色色色99| 色婷婷久久| 欧美三级A做爰在线观看| 丰满女老板BD高清A片| 99久久国产宗和精品1上映| 激情图片亚洲| 丁J香六月首页| 高清国产AV| 99热在线中文字幕| 一起草AV| 五月丁香狠狠爱婷婷综合| 开心五月婷婷激情网| 涩涩涩.com| 婷婷丁香五月天激情| 久久婷婷五月综合色奶水99啪| 天天综合五月| 久久草大香蕉| 第六色在线| 日日夜夜天天综合| 国产成人AV在线播放| 亚洲操逼网| 亚洲精品无码一区二区| 久久涩视频| 综合久久首页| 99精品久久久久久久婷婷| 色七色九九| 色久激情在线| 情色婷婷五月天| 激情五月婷婷| 丁香五月婷婷五月基地| 亚洲旡码| 国产日日夜夜操| 激情五月天com| 99久久网站| 操操综合网婷婷| 超碰在线免费9| 色综合xx| 九色无码| 色狠狠色噜噜AV天堂五区| 婷婷综合干| 天天操天天日天天爱| 五月天欧美激情| 97人妻碰碰碰久久香蕉| 国产乱人偷精品人妻A片| 大香蕉丁香| 婷五月天天| 婷婷五月色情天| 国产这里只有精品| 97香蕉人人在线观看| 激情深愛五月視頻| 丁香五月天成人网站| 五月婷色| 亚洲无码yw| 婷婷中文字幕版| 九色自拍| 久久久久久9热不雅视频| 99在线精品观看99| 久久久久久久久人妻| 激情深爱五月天| 亚洲色图在线视频| 噜色精品| 狠狠爱综合网| 婷婷伊人视婷婷婷| 99久久99热| 98永久精品| 色五月丁香A欧美com| 伊人婷婷青青cao| 婷婷五月六月丁香| 丰满少妇猛烈A片免费看观看 | 大香蕉久| 色五月婷婷影院| 99热这里| 丁香五月婷婷啪啪| 婷婷日欧美在线观看| Av狠狠色丁香婷| www..999热久| 日韩五月婷婷| 战争与艾拉电影免费观看| 亚洲欧美婷婷五月色综合| 欧美啪啪9| 欧美VA在线| 久久久久久五月天| 亚色网站小视频| 三级黄网站| 黑人熟妇一区二区三区| 久狠日av| 亚洲视频在线网站| 激情婷婷亚洲五月| 激情五月天色色网| 91久久久久久久久久久| 99无码视频| 久久婷婷五月综合色和| 久久99久久99精品免视看婷婷| 丰满人妻一区二区三区| 色九九综合| 九九99免费视频| 91色九| 人人草人人爱| 色原狠狠综合| 99这里只有精品|v| 97涩婷婷婷婷基地| 深爱激情六月| 九色亚洲| 五月天另类图片| 欧美十二区| 日韩久久这里只有精品| 国产精品久久久久久喷浆| 99热大全在线观看| 婷婷色五月天在线| 天天爱天天做天天日| 中文字幕在线免费观看视频| 婷婷的99视频网站| 久久久18| 99热免费精品热久久66| 国产精品色| 综合激情啪啪| 中文字幕无码人妻少妇免费视频| 亚洲色色图片| 欧美成人AAA片一区国产精品| 啪啪啪啪五月天| 666555。COm毛片| 欧美一区二区三区不卡影视| 国产免费性爱| 久久这里只有精品1| 久久综合综合综合| 欧美色色色色色色| 色五月天堂| 色婷婷五月天| 成人狠狠成人狠狠成人狠狠成人狠狠| 黄网在线免费观| 骚。com| 色欲五月婷婷| 六月激情网| 激情丁香五月激情婷婷| 刘玥精品一区| 极品人妻VideOssS人妻| 九九热自拍| www激情| 思思热久久婷婷五月天| 九九热99在线视频| 中美日韩成人在线| 99免费视频久久| 国产AV影片| 婷婷情爱五月天6| 丁香五月天堂| 国产,欧美,学生妹,视频| 六月婷婷开心| 91九色精品熟女内射| 成人无码髙潮喷水A片| 99九九精品视频| 开心五月婷婷婷美女| 婷婷五月天av| 看国产探花操逼三级片| 91精产品自偷自偷综合| 婷婷激情图片| 这里只有精品网站| 中文字幕在线资源| 色婷婷色综合久久精品V| 国产美女视频久| 婷婷,五月天,丁香,第一| 7EzOBIhNq85TO| 激情综合网激情五月天| 五月丁香久久综合| 最新久久99视频网站| 激情综合网五月天| 亚洲激情97五月天| 欧美一级色| 碰人人97| 99久热| 婷婷五月免费视频| 久久婷五月综合色| 另类在线观看视频| 夜夜嗨一区二区三区直播内容| 九九热在线视频| 5月丁香综合网| 中文字幕AV网址| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 精品无码人妻一区| 伊人九九综合| 大香蕉久久青青| av网址在线| 中文乱子伦视频| 国产伊人五月天| 色欧美影院| 综合色七七| 99视频在线精品| 色99色| 五月丁香激情在线| 亚洲色9| 久99热在线观看| JlZZJlZZ8JlZZ亚洲熟女| 99色色| 欧美日比视频| 色婷婷狠狠干芒果TV| 五月激情五月丁香| 大香蕉网站,大香蕉综合| 中文超碰视在线| 五月激情综合网| 亚洲黄色影视| 五月婷婷婷丁香播| 狠狠搞亚洲| 亚洲九九九九| 色婷婷婷av| 狠狠五月激情丁香六月| 色站9/| 青青草婷婷五月天| 色丁香五月婷婷| 人妻av在线| 在线另类视频| 天天综合网在线| 婷婷.com| 亚洲va在线| 色狠狠伊人久久五月丁香| 大香蕉啪啪网| 啊v视频在线观看| 夜夜爱伊人| 影音先锋天天日| 久久182| 31色区视频免费看| 久久受www免费人成| 成人国产欧美大片一区| a在线观看| 99精品无码| 国产精品美女| 99操视频| 色色五月婷婷| 天天日夜夜| 国产精品国产成人国产三级| 婷婷六月色| 香蕉久久国产AV一区二区| 五月天桃色深爱网| 五月激情六月宗合| 六月激情综合| 91日本在线观看| 天天做天天爱| 亚洲精品V天堂中文字幕| 欧美日韩精品人妻狠狠躁免费视频| 精品一二三区久久AAA片| 五月激情在线| 99re6在线视频精品免费| 国产做A爰片毛片A片美国| 婷婷五月天在线观看| 国产露脸150部国语对白| 国产亚洲精品久久久久久久久动漫| 亚洲电影在线观看| 大操人妻| 岛国操B不卡在线| 色碰干| 五月丁香手机在线| 操丝袜视频影院导航| 五月开心久久| 9操在线| 日本精品在线噜噜噜| 九九热视频网站| 亚洲视频丁香网va| 99热久草| 五月天婷婷影院| 亚洲综合99| 欧美在线视频99| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 五月丁香激情综合六月涩涩爱| 秋霞日本免费毛片A片| 超碰在线人妻| 五月丁香在线国产| 婷婷五月丁香手机在线视频| 麻豆雪千夏| 五月天婷婷色| AV片一区在线观看| 97人人看一| 婷婷久久综合久| 久久婷婷五月激情网站| 99精品大片| 97av在线视频| 人人色人人弄人人操| 丁香色五月AV在线| 99热精品在线| 六月亭亭久久综合激情| 激情都市丁香婷婷| 六月婷婷色综合| 五月精品99综合| √天堂资源在线人妻熟女| 久久与婷婷| 天天色噜| 91久久久久久| 久久九九囯产| 开心久久xxx色| 久久丁香五月婷| 亚洲日日日| 一级视频网址| 120分钟婬片免费看| 五月婷婷六月激情网| 偷偷操99| 日韩成人中文| 丁香花五月天激情| 亚洲中文乱字字幕线在永久| 久久婷婷五月综合伊人| 91色呦哟| 婷婷色播婷婷| 丁香五月综合在线视频| 五月丁香啪啪| 伊人五月婷婷国产视频| 青草久久五月婷伊人| 久热黄色| 99re久热| 丁香六月 婷婷六月| 99色色网| 日本黄色三级片内射| Av大香蕉| 成人在线99| 丁香五月激情久久麻豆| 色婷婷狠狠| 成年人丁香五月| 99热在线观看| sesesesezonghe| 激情 婷婷| 中文字幕91,综合| 密臀久久| 五月天色社区| 青青草99热久久精品国| 婷婷综合伊人丁香| 操一区| 99这里有精品视频| 狠狠插狠狠插| 黄色AAAA韩国guochansanji| 热99热| 色色色色综合| 伊人久久大香线蕉av最新| 99re思思热久久| av在线播放网站| 婷婷色五月噜噜| 99操逼| 五月婷婷七月丁香| 久久精热| 亚洲成人网址在线观看| 激情五月无码| 婷婷综合五月| 91久久婷婷| 婷婷五月天黄色| 免费播放片大片| 五月色影院| 欲色人妻| 天天操天天爱天天玩| 爱99干99| 五月永久激情| 久久久国产精品黄毛片| 99er国产| 九九色综合| 国产裸舞福利资源在线视频| 久久综合五月| 色色五月婷| 另类视频在线| 久久激情五月| 国产激情久久久| 狠狠色婷婷7777久| 26uuu精品国产| 啪啪啪大香蕉| 伊人五月天在线| 婷婷五月成人| 丁香婷婷激情| 日日爽日日操| 2025超碰| 直接看的AV网站|