免费国产精品自在自线-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
返回資訊列表
五月婷婷影| 亚洲色色五月| 丁香五月狠狠综合欧美| 99在线精品免费视频| 五月天婷婷影院| 狼人婷婷久久| 99在线免费视| 97人人妻人人艹| 激情婷婷五月天在线观看| 五月丁香在线| 亚洲噜色| 996精品热视频| 色婷视频| www.色综合.com| 草婷婷在线| 五月婷婷之综合激情| 人人摸人人搞| 国产精品久久99| 99久久极情精品一区| 婷婷六月啪啪| 无码人妻AV久久久一区二区三区| 丁香五月婷在线观看| 五月开心播播网| 97香蕉久久超级碰碰高清版| www.色五月| 国产精品色色色色| 六月丁香中文字幕| 无遮挡国产高潮视频免费观看| 五月激情丁香六月狠狠干| 国产毛片精品一区二区色欲黄A片| 麻豆五月丁香婷婷| 91超级碰在线视频| 色玖玖爱| 99热精品综合| 99热主页日本| 狠狠色噜噜狠| 9 1超碰九色| 能看的AV| 色色亚洲视频| 99热这里有精品6| 中文字幕有多少字| 另类A片| 激情深爱婷婷网| 亚洲V国产V欧美V久久久久久| 激情网婷婷婷| 婷婷欧美偷拍综合| www色综合亚洲92| 精品激情| 激情综合丁香五月| 久久婷婷丁香五月一二三| 久久人妻少妇嫩草AV| 99热官网精品在线| 开心五月婷婷六月丁香| 99久久精品国产色欲| 久久资源网五月婷| 色视频五月天| 色久婷婷五月| 婷色综合| 香蕉97碰碰碰欧美| 五月婷婷激情| 婷婷激情五月天网站| 欧美日韩成人| 亚洲妇女熟BBW| 无码 色| 综合久久久| 久久五月天婷婷| 久久成人综合五月天| 天堂久久婷婷| 99热无码精品| 色色吧综合| 久久婷婷六月综合国际| 秋霞AV淫| 很很干夜夜干| 丁香婷婷伊人| 色五月亚洲五月天| www.婷婷亚洲基地| 69人妻人人澡人人爽久久| 久热99| 天天色噜| 五月花成人网| 金桔一区二区ab地址| se婷97| 丁香六月久久| 播五月丁香三月婷婷| 三级成人网站| 欧洲亚洲免费视频9| 免费AV在线网址| 激情五月影院| 六月婷婷八月丁香| 五月丁香六月婷婷操操操| 激情久久四色| 影音先锋色色色资源色资源色| 中文字幕欧美精品久久| 国产精自产拍久久久久久蜜| 激情五月影院| 996热| 99热这里只有精品一区| 五月四色婷婷| 五月天婷婷丁香视频| 成人片在线播放| 日本少妇AA一级特黄大片| 极品人妻VIDEOSSS人妻| 在线观看免费视频| 日本欧美成人片AAAA | 天天做天天爽| 欧美日朝成人| 久久视频在线| 婷婷五月天在线观看第二页| 另类综合婷婷五月天欧美视频| 激情深愛五月視頻| 亚洲性爱干干| 噜噜噜噜噜在线| 婷婷国产欧美97| 丁香五月婷婷综合网| 天天操加勒比| 91久久五月天| 天天插天天干| 可以免费观看的AV| 99爱操| 五月天伊人日日噜影片AV| av大香蕉| 五月天色婷好好| 亚洲中文字幕AV| 天堂爱啪啪| 婷婷五月天首页激情| 五月天大香蕉av| 嫩草AV久久伊人妇女超级A| 六月天无码网址| 五月婷婷真爱激情网| 校园激情 亚洲| 亚洲欧洲自拍图片专区五月天| 97色图片中文字幕视频在线观看| www91在线| 97狠狠碰| 99九九综合久久九九| 色婷婷天堂| 一级性感毛片| 无码人妻激情| 免费色色色| 99亚洲综合| 五月激情啪啪| 久婷婷久草| 亚洲天堂AAA| 五月丁香网中文字幕| 五月婷高清视频| 久久婷婷六月综合资源| 99色热视频| 日本欧美国产| 日本3级片一区2区| 六月丁香网| 五月婷婷色| 婷婷五月天基地| 亚洲成av人影院| 久久久久久久久月丁| 99操不停| 粉嫩av懂色av蜜臀av熟妇| 99,色| 国产精品久久久99视频| 在线A色| 色五月婷婷天天操夜夜操| 九九九九九无码| 五月丁香色婷婷基地| 六月丁香好婷婷| 99在线小视频| 婷婷欧美| 狠狠干综合| 九九综合九九| 国产精品成人AV在线| 婷婷丁香激情综合色情| 五月婷婷丁香| 在线伦子99热| mmm1717.6dbm人人爱人人操| 色亚洲欧洲| 国产无套精品一区二区| 亚洲欧洲另类| 99天堂在线观看免费视频| 亚洲一二三网| 日本久久人人| 超碰在线91| 3p日韩网站视频| 99综合激情久久精品久久| 日日夜夜狠狠| 亚洲操操| 国产精产国品一二三在观看 | 丁香五月婷婷激情蜜桃| 婷婷丁香五另类网站| 99色精品| AV电影在线播放| 97婷婷丁香五月天激情图片| 久久最新色| 丁香五月综合| 五月丁香久久综合色| 开心五月婷婷五月| 亚洲成人五月天| 人人干人人看| 91国产精品视频播放| 超碰男人色| 99,色| 婷婷五月天性| 综合五月婷婷| 日本欧特黄色刺激一区影视久精品无码| 九九热超碰| 5月丁香六月婷婷| 91精品无码| 丁香五月-激情综合| 9999三级片| 伊人婷婷五月天av| 色色五月天婷婷| 99精品视频免费观看近期发布| 日本女人久久| 婷婷五月另类网站| 中文字幕精品无码一区二区| 久久九九综合| 六月撸婷婷| 精品国产AV色一区二区深夜久久| 亚洲精品视频在线| 激情av在线| 成人免费黄色短视频| 天天日夜夜欢| www.夜夜操.com| 天天射影院| 综合久久影院| 久草狼人| 六月婷婷AV| 久久视频婷婷视频| 99热这里有精品| 五月天小说激情| 激情五月黄色小说| 大香蕉AV在线| 五月丁香精品| 九九99精品视频| 91热久88| av免费人人| 五月丁香啪| 丁香五月Av| 免费看片操逼| 五月丁香六月婷婷久久| 色五月噜噜| 五月丁香久久综合精品| 欧美人与性动交CCOO| 婷婷综合色| 青青草成人网| 色综合av超碰| 五月亭亭狠狠| 亚洲av网址| 青青草原精品久久| 天堂网操| 99热无码| 99视频日韩| 五月天中文字幕在线婷婷| 天天做天天爱天天高潮| 色情性爱视频网址| 久热欧美| 激情五月天色色| 午夜九九九九九九九九九九九九九| 国产九月婷婷| 色播激情五月天| 婷婷的五月天另类视频| 天天搽天天射| 色99在线视频| 成人av在线电影| 色婷婷五月天天天干天天操天天爽 | 成人丁香| 激情涩涩网| 中文字幕成人| 丁香五月婷婷亚洲人| 亚洲综合婷婷| 成人版视频在线观看| 9热精品| 久久玖玖综合| 91爱啪啪| 99超碰欧美| 99re热| 五月香婷婷| 激情美女五月天| 99久久网站| 五月天色播网| 人人摸人人操人人爱| 久热这里只有精品99re,久热这里只有精品7 | 午夜电影网VA内射| 久久激情婷婷| 五月激情婷婷综合| 99在线er热| 91狠狠综合久久| 丁香激情五月综合网| 91精品综合久久久久久五月丁香| 日日噜狠狠色综合久久| 丁香五月婷婷综合91| 网站免费一站二站| 9精品视频在线| 99超级碰碰| www久久99| 五月丁香五月综合欧美| 丁香五月天激情小说| 百度一下国产精品A| 色亚洲欧洲| 亚洲激情六月丁香| 天天玩天天摸| 五月成人丁香av91| 超碰99资源站| 91精品久久久久久久久| 丁香九月婷婷| 婷婷欠久少妇| 欧美日韩成人在线网| 久久综合综合久久| 97超碰婷婷五月天| 久久久精品人妻| 久久婷.com| 五月色丁香| 日本性激情色播| 丁香五月婷婷激情完整版| 丁香婷婷基地| 丁香五月天激情小说| 欧美情色一区| 影视av久久久噜噜噜噜噜三级| 青青热视频| 亚洲亚洲人成综合网络| 欧美Va日本Va| 国产99精品免费视频| 182tv992tv人之初午夜免费观看| 99久久9| 丁香成人综合| 久久婷婷五| 超碰人人射| 美女100%露全身无挡网站| 激情影院69| 五月丁香精品| 激情丁香五月婷| 久久电影五月天丁香电影| 五月丁香琪琪| 五月天精品综合| 亚洲不卡| 五月天婷久久| 思思re99视频在线观看| 五月激情六月宗合| 久色成人| 啪啪综合| 9999热在线| 九九热免费| www,26uuu,c0m,色情| 婷婷色五月激情| 91黄色五月天视频| 色色a| 五月婷在线视频免费看| 中文在线视频久1| 99热日韩| 正宗黄色毛片| 疯狂做受XXXX高潮A片动画| 亚洲99在线视频| 人妻久久婷婷| 热九九精品| 激情五月婷婷色播网| 亚洲啪啪视频| 94干大香蕉| 精品一区二区三区四区五区六区| 91seav| 久热这里只有精品99re,久热这里只有精品7| 婷婷六月丁综合| 这里只有精彩视频| 天堂色婷婷| 久久久人妻门| wwccc久久久| 丁香九月婷婷综合| 日本丁香久在线| 91久久1118| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 亚洲中文字幕AV| 婷婷五月花西瓜| 日本不卡高字幕在线2019| 久久天堂婷婷五月| 亚洲六月婷婷| 天天插天天插天天插| 天天干,天天舔| 欧美三级级99久久| 日本三级第一页| 99视频35精品视频在线观看| 99re这里只有| 九九婷婷热| 亚洲这里只有精品| 欧美婷婷丁香五月社区| 91碰超| 天天综合社区| 99re视频精品| 五月天玖玖狠狠色色| 99热欧| 另类激情五| 黄色成人AV在线| 亚洲欧美在线观看| 北京熟妇搡BBBB搡BBBB| 天天爽天天| 亚洲热视频在线| 超碰a女人的天堂| 99热这里只有精品22| 狠狠操在线视频| 91天天操天天干天天射| 人妻综合网| 丁香六月啪啪啪| 97影院一级片| 综合啪啪| 五月激情视频| 久久婷婷青草五月天| 99久久9| 久碰久操| aaaaa不卡| www久| 激情综合一| 久久婷婷成人综合色怡春院| 人妻少妇色综合| www.五月天婷婷| 日本一级一级一级一级| 热九九精品| 九九热超碰| 99精品热| 91久久精品国产91性色TV| 被强行糟蹋的女人A片| av中文在线| 这里只有精品久久| 五月桃花网综合| 日韩专区五月天婷婷丁香| 不卡在线视频| 丁香五月婷婷欧美成人色图| 欧美久久网| 97香蕉久久超级碰碰高清版| 成人噜噜网| 六月丁香啪| 深爱激情九九五月天 | 亚洲深喉aV| 国产美女无遮挡裸体毛片A片 | 亚洲五月天激情| 综合激情视频| A片试看120分钟做受视频红杏 | Www.Av网9| 先锋男人91资源| 国产精品丝| 五月婷婷啪啪啪| 91综合在线| 久热这里这里有精品| 亚洲五月天综合| 天天色天天色天天色天天色天天色| 色综合色综合色综合| 色五月天综合网| 大香蕉久久婷婷| 九九综合色| 能看的av| 色色色9 9 9| 最新久久网址| 激情婷婷五月天网址| 五月天婷婷高清无码| 天天爽天天日| 丁香五月偷拍| 久热精彩视频98| 99精品在线播放| 免费看欧美成人A片无码| 婷婷综合九色伊人| 国产精品99久久久久久猫咪| 丁香伊人激情| www.久久综合| 精品国产乱码久久久久夜深人妻| 欧美日韩日韩成人| 色综合网址| 停停色综合伊人| 99热精品在线播放| caop在线| 五月婷婷很很色| 在线成人视频免费| 日韩一66精品| 操日本三片99| 丁香五月播播| 天天操天爱综合| 懂色av蜜臀av粉嫩av永陈冠希| 日韩成人精品中文字幕| 天堂草在线观| 亚洲成人网站在线观看| 五月天天综合网色婷婷| 婷婷成人视频| 99视频在线精品| 深爱婷婷基地| 任你干嘛免费视频播放| 亚洲无AV在线中文字幕 | 久久久久久草黄色片AV在线观看| 99视频在线观看网址| 性无码专区无码| 91要啪| 色综合综合色| 色情五月丁香婷婷网| 热久免费视频9| 欧洲不卡视频| 激情伊人五月天| 99re热99| 欧美激情-区二区三区| 五月在线| 丁香五月婷婷综合精品素人| 五月天婷婷黄色| 九九九九综合| 成人免费视频一区| 日韩AV无码影片| 成人婷99最新| 六月丁香综合| 婷婷五月天日日日干干干| 99免费热视频在线| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 丁香婷婷偷拍| 色情五月| 国内自拍97在线| 婷婷综合久久| 九九热婷婷| 五月丁香在线综合| 极品五月天| 日日夜夜青青草| 婷婷五月激情的图片| 天天综合五月| 精品网站:999WWW| 成人VAV视频在线观看| 丁香五月婷婷av影院| 久草热8精品视频在线观看| 人妻操逼视频| 99综合视频一体| PORNY九色9l自拍视频成人| 天天艹夜夜艹| 天天久| 丁香五月激情五月开心五月| 激情五婷网| 婷婷伊人久久综合| 思思热久久久在线| 国产色色色色| 激情五月天综合婷婷网| 九九在线视频| 大香蕉伊人99| 色噜噜综合网| 狠狠插狠狠插| 激情丁香五月| 色色色色色色综合网| co超碰在线观看| 九月丁香八月婷婷加勒比| 人妻无码视频网| 北条麻妃九九九国产精品视频| 日本乱子人伦在线视频| 天堂久久丁香| 日本天堂久久| 色婷婷伊人| 九九久久五月天| 黄色三级日本| 99热香港| 五月天婷婷视频30| 五月婷婷在线视频| 激情99热| 久久九九网| 202丰满熟女妇大| 第四色在线观看| 色逼综合网| 人人操大| 色色婷| 天天AV导航网| 99操逼| 激情综合网激情五月天| 丁香五月综合| 婷婷黄色网| 丁香五月激情综合婷综| 97人人干| 婷婷激情五月综合丁| 人妻久久久久久久久久久| 丁香五月天社区| www.丁香五月| 五月丁小婷婷激情四射| 人人干女人| 婷婷欧美偷拍综合| 婷婷五月天日本无码| 性色天| 91久久婷婷| 国产暴力强伦轩1区二区小说| 久草九一| 日韩亚洲视频| 五月丁香婷婷伊人| 五月丁香色| 成人精品一区日本无码网| 丁香五月婷婷香| 久久久久亚洲AV无码网影音先锋| 激情黄色五月天| 婷婷五月天久久| 久久久性爱视频| 久久se 综合网| 99亚洲精美视频在线观看| 久久久精品99亚洲综合| 色婷婷视频在线| 激情五月天影院| 丁香婷婷五月综合欧美另类| 丁香五月激情婷婷视频| 色综合射婷婷| 91日本在线观看| 久热99久热| 色五月婷婷五月丁香五月激情五月视频| 亚洲五月天婷婷综合| AV在线免费网站| 欧美顶级少妇做爰HD| 亚洲AV无码影院| 人人舔人人色人人高潮| 婷婷五月天堂| 91综合网| 综合狠狠五月婷婷| 日本色婷婷| 91人人妻人人操人人爽| 思思热99er在线视频| 婷婷五月色播| 新激情婷婷| 激情五月婷婷综合| 66成人网| 五月激情婷婷偷拍| 婷婷六月激情啪啪| 青青草激情网| 婷婷丁香成人五月天| 欧美一区二区三区不卡影视| 激情五月小说婷婷| 欧美日韩成人在线观看| 五月花婷婷丁香| 婷婷久草| 99久热| 婷婷综合五月| 五月婷婷丁香五月| 丁香五月天综合网| 成人在线日韩欧美| 曰韩五月丁香色婷婷无码| 不卡在线视频| 五月婷婷天| 五月天天天色| 伊人狠狠综合| 成人操呦av| AV色婷婷| 久久久免费图片视频| 无码人妻少妇色欲AV一区二区| 激情爱爱网站超大免费| 五月激情婷婷开心| 天干干夜夜操| 最新日本A片| 碰97久久| 色五月婷婷AV| 墨西哥毛片内射精| 婷婷操无码| 色色色网站| 91碰碰| 狠狠干狠狠干| 婷婷射丁香| 深爱五月亚洲| 美女要搞搞天天搞搞搞网站| 九九综合视频在线观看| 九九99免费视频| 九九色之九九色之88| 色色热日| 欧美,日韩成人在线| 亚洲精品白浆高清久久久久久 | 最新久久网址| 五月丁香色| 26uuuuuuuu国产| 亚洲另类婷婷五月综合| 另类图片五月天婷婷| 丁香婷婷久久| 婷婷丁香五月天婷婷| 91久久1118| 亚洲操精品| 国产avapp 网| www.99热在线观看| 怡春院久操| 98永久精品| WWW久| 色色五月激情| 色涩影院六月丁香| 中文字幕网站在线观看| 欧美色偷拍| 在线看av| www.久久综合| 欧洲综合视频| 9色在线| 在线五月婷婷小电影| 性爱综合网| 狠狠舔| 五月丁香激情综合啪| 丁香六月色香蕉视频| 99婷婷五月天| 久久奄也去色色网站| 中文aV网| 激情六月一二| 狠狠色综合网站| 婷婷五月开心中文字幕色| 亚洲综合网激情小说| 婷婷五月永远18免费久久久| 台湾佬天天日丁香婷婷五月天| 激情综合网 激情五月天| 99小视频网站| 五月天国产| 久9免费视频| 9999久久久久| 久久丁香| 五月丁香久久激情综合| 婷婷综合日本| 91一起操| 色综合久久88色综合天天人守婷| 97韩国久久电影院| 天天操婷婷| 亚洲另类婷婷综合| 日本一级一级一级一级| 丁香五月激情久久麻豆| 日韩无码系列| 色色色欧美| 五月综合婷婷网| 日日夜夜小色哥| 亚洲第一综合| 丁香五月六月综合激情| 五月日韩中文字幕| 1234操逼网| 大香蕉五月婷婷| 九九综合久久丁香婷婷,开心激情综合网| 色人五月婷婷| 狠狠操狠狠操| 夜夜干 夜夜操| 四川女人毛多水多A片| 丁香花五月天婷婷成人社区| 另类伊人婷婷| 丁香婷婷免费| 色情成人五月天| 久久久这里有精品| 久99久视频精品| 日本色久| 狠狠狠狠狠狠狠狠草| 人人爽天天爽| 色色五月婷| 激情综合网激情五月天| 天天日天天色| www.1024久久| 丁香婷婷久久| se99视频| 丁香五月综合| 大香蕉懂9| www.天天色综合| 激情五月综合网最新 | 密乳视频| 一起草Av| 影音先锋五月婷婷| 婷婷五月综合在线| 亚艹艹| 热久久99热欧美国产亚洲| 99久久超级| 国产成人综合网| 天天色综合综合| 婷婷色五月激情| 开心婷婷五月综合| 丁香五月花婷婷开心| 天天干天天色综合| 国产成人精品一区二区三区视频 | 欧美精品999| 丁香六月激情网C0W| 亚洲六月婷婷| 久久一级片| 99热在线中文字幕| 婷婷激情四射| 日韩有码久久| 欧美色小说婷婷| 大香蕉久久| 91天堂网综合| 色婷婷五月综合在线| 91美女被操| 激情五月天福利| 色综合色欲综合天天免费| 五月婷婷色综图片| 美女被肏网站在线看| 久久6这里只有精品| 99九九综合久久九九| 丁香婷婷浪潮AV久久综合| 五月丁香色婷婷婷基地| 激情婷婷丁香五月天| #NAME?| 国产精品五月丁香| 久久只有18视频| 亚洲成人网站在线| 久热网在线视频| 国产又黄又爽又色的免费| 久久多色| 久久久无码精品成人A片小说| 亚洲精品一二三| www.sd-xiangsu.cpm| 婷婷九月丁香| 9l视频自拍9l九色9l成人| www.色五月.com| 亚洲成人影视在线| 99热99思午夜精品| 久久六月综合| 97干视频| 色婷婷a v| 丁香五月天天| 四色99久久| 在线播放 精品| 大香蕉丁香五月| 五月婷婷丁香伦理网| 久久这里只有精品99| 婷婷伊人久久| 91丨九色丨白浆秘| 4438成人电影| 九九热在线精品| 激情五月天婷婷丁香| 国产资源91在线| www婷婷色| 成人狠狠成人狠狠成人狠狠成人狠狠| 成人做爰A片免费看视频| 噜一噜免费视频| 亚洲色在线观看| www激情| 丁香色色色| 色婷婷丁香综合中文字幕| 丁香五月婷婷综合精品素人| 91日视频| 日本色图综合| 玖玖综合色| 久99热| 操91| 九九热免费视频| 婷婷五月丁香六月伊人网| 人妻中文在线| 99久久国产宗和精品1上映| 九九激情网| 人妻五月天激情开心网| 欧美性生交xXxX久久久| 五月天五月婷五月激情网| 久久91久久精品久久| 天天操天天爱天天玩| 九热av| 五月丁香六月婷婷网| 婷婷丁香综合| 国产综合色婷婷精品久久| 日本啪啪天堂| 狠狠干,狠狠操| 色色色在线播放| 少妇水多A片太爽了| 婷婷五月天首页| 婷婷五月在线| 久久婷婷五月综合啪| 96精品久久久久久久久| AV人人操| 婷婷五月天影视网址| 久久性爱网| 婷婷丁香五月综合网上| 成人短视频在线免费观看| 色欲天天综合| 五月天国产成人| 国产欧美性成人精品午夜| 午夜婷婷六月天| aaa9区免费在线观看| 成人婷99最新| 久久综合网免费视频| AV片一区在线观看| 丰满熟女人妻一区二区三| 久热超碰91| 天天爽夜夜操| 久久99热精品a片在线观看| 9久热在线精品| 丁香婷最新动态| 超碰v| 精品综合五月| 色射7856五月天激情四射| 中文字幕在线资源| 九九热免费视频| 婷婷五月天BBw| 色婷婷88| 色婷婷基地 | 99视频这里只有精品10| 丁香六月久久| 国产69久久久欧美黑人A片| 激情丁香图片| 婷婷五月激情网| 99热热热99精品丁香| 激情五月天在线免费美女视频| 综合婷婷五月天| 97色婷婷| 91热久88| 六月婷婷激情图片| 亚洲瑟瑟精品在线| www.yw色| 欧美肉大捧一进一出免费视频| 99热这里只有精品86| 91久久婷婷| 97成人丁香| 超碰人人草| 色婷五月| 九九伊人网| 久久婷鲁| 色色a| 五月婷婷婷婷| 激情丁香久久| 欧美啪啪五月天| 99综合网| 在线观看亚洲AV| 天天婷婷操| 色婷婷综合综合网| 日本黄 色 片| 久99久视频| 欧美成人精品老美女噜噜噜| 亚洲色五月| 色护士综合| 久久人妻视频| 婷婷五月天国产| 538久久| 综合久久影院| 色五月激情问网站| 狠狠干狠狠色| 色五月色图| 色五月婷婷天天操夜夜操| 五月丁香婷婷中文| 欧美日韩精品一区二区三区钱| 色色亚洲视频| 丁香综合婷婷五月天| 91婷婷五月天综合视频| 天天射综合网站| 久久亭亭电影| 日产精品久久久久久久蜜臀 | 亚洲色图日韩网址| 99国产精品白浆在线观看免费| 五月丁香激情四射| 五月激情婷婷六月| 五月天婷婷爱丁香中文字幕| 色色色干| 九九99男女视频在线观看| 日曰躁夜夜躁2026| 色色色热热热| 色哟哟精品| 97色色综合| 六月天六月婷| 夜夜操夜夜爽| 99精品久久久| 国产性爱色| 婷色天堂| 另类视频在线| 另类在线| 伊人婷婷大香蕉| 丁香色五月天| 五月婷婷激情四月| 五月丁香婷婷激情爱爱| 免费无码毛片一区二区A片| 欧美99热| 五月丁香综合伦理片| 五月天激情婷婷丁香| 婷婷五月色| 成人视频在线免费播放| 人人综合色| 亚洲精品久久久久久久久久飞鱼| 玖玖婷婷五月天| 人妻精品在线| 99这里只有精品| 六月丁香六月婷婷欧美| 色六月视频| 9这里只有精品| 天天干天天日日| 激情丁香婷婷五月天| WWW.天天日| 日韩人妻无码专区| 亚洲视频二区| 97操碰碰无码视频| 激情爱爱网站超大免费| 五月天停婷基地| 色天堂操| 久久婷婷五月综合一| 91美女啪啪| 免费在线观看av网站| 五月丁香久久综合91| 欧美亚洲色色色色| 九九无码AV| 丁香五月婷婷欧美性爱| 亚洲网站观看视频| 欧美日韩成卜| 婷婷97色| 五月色情精品| 五六月婷婷久久| 97涩婷婷婷婷基地| 久久久久久久久久久久久久久久久精典| 日本44久久在线| 天堂呦 呦百度搜索-百度搜索| www.婷婷com| 五月婷婷久久网| 色八戒操婷婷| 五月婷婷色白丝| 大香蕉久久婷婷精品综合| 日韩99视频| 五月伊人网| 99这里只有精品视频免费| 熟女激情网| 五月天婷婷在线啪啪视频| 99精品视频在线| 丁香婷婷伊人| 日韩色五月| 色色色热| 成人在线网址| 99久在线精品99re8| 99免费在线视频| 国产精品激情AV久久久青桔| 人人干av| BBWCUCKOLD精品熟妇| 九九成人电影婷婷| 丁香五月97视频| 99热热这里只精品996小说| 婷婷黄色| 亚洲综合新99视频| 五月婷婷色吧!| 婷婷五月丁香香蕉| 玖玖在线视| 9久热| av在线婷婷| 九九综合图片网| 久色网址| 天天拍天天做视频| 婷婷开心激情五月激情网| 婷婷五月丁香色综合| 天天综合在线网| 欧美顶级少妇做爰HD| 色婷婷五月综合色婷婷| 外国碰视频网站97| 五月色丁香综合| 国精产品一区二区三区| 亚洲天堂色色| 婷婷深爱五月天| 午夜天天精品视频| 色99婷婷五月天| 亚洲色综合| 五月欧美色色五月| 亚洲va成人va成人va在线观看| 26uuu| 婷婷五月五月丁香| 激情五月,激情综合网| 天堂婷婷五月在线| 婷婷开心激情五月激情网| 99re这里只有精品首页| 真实熟女-91九色| 亚洲免费av在线| 丁香五月色色色色| 亚洲色无码| 99久久99九九九99九他书对| 无码少妇高潮喷水A片免费| 激情熟女网| 五月丁香激情片| www.99成人视频| 99热精品在线观看| 九九九九热99超碰| 五月婷中文字幕| 欧美偷偷操| 、激情六月天| 91精品综合久久久久久五月丁香| 大香蕉人妻| 综合网精品99| 99视频精品| 五月婷婷丁香综合网| 操人无码| #NAME?| 九九综合视频在线观看| 黄色AAAAA| 99色综合| av在线不卡播放| 这里只精品| 亚洲综合五月天| 国产精品美女久久久久AV超清| enecarbon-materials.com污K127封锁请涟系@wip1688 | 米奇影视资源777狠狠色婷婷五月天激情网 | 五月丁香婷婷综合视频| 26uuu欧美| 国内一级精品| 五月天成人在线| 婷婷99| 五月天婷婷丁香人人操91| 色综合色婷婷色伊人| 日本丁香五月| 日韩在线观看网址| 超碰91在线| 99免费| 99久久国产宗和精品1上映| 久久多色| 色色色色五月| 国产精品成人AV在线观看春天| 99在线69| 色婷婷丁香五月天在线观看| 五月天电影网| 亚洲综合在线视频| 五月婷婷在线视频| 激情四射亚洲| 涩综合在线| aa久久| 人妻在线网站| 丁香婷婷色五月合集| 狠狠干狠狠干| 五月久久婷婷丁香| 婷婷激情社区| 日本无码专区| 色五月之第四色| 91九色国产| 男人天堂AV在线一区二区| 1995年关宝慧版蜘蛛女| 日韩操人| 99日韩| 婷婷五月综合色拍| 亚洲视频1区| 日日做夜夜爱| 亚洲国产精品SUV| 夜夜夜天天操| 中美日韩成人在线| 激情AV中文| 丁香成人色情五月天| AⅤ网站在线看| 蜜桃婷婷丁香五月天狠狠久久综合| 欧美精品999| www一起操| 五月天婷婷在线视频| 五月天小说激情| 人妻尝试久久久久久久久久久久| 丁香五月婷婷五月| 婷婷伊人| 婷婷五月天激情网| 人妻激情在线| 噜噜噜久久| 五月丁香激情啪啪网| 婷婷丁香人妻天天| 久久9情免费| 亚洲VA在线| 岛国在线观看91| 97婷婷丁香五月天激情图片| 婷婷五月影院| 五月丁了香蕉综合| jiZZdr| 五月天色导航婷婷资源婷婷| 五月婷六月| 91蜜桃婷婷狠狠久久综合9色| 超碰人人艹| 大香蕉婷婷丁香天堂AV| 999热在线视频| 中文字幕AV在线| 97在线精品| 综合久| www.久久| 99er这里只有精品| 九九在线视频| 思思热99er在线视频| 色婷婷在线视频| 情欲综合网| 怡红院AV亚洲一区二区三区H| 激情五月无码| 色五月天成人| 色站9/| 丁香五月天电影| 五月天色婷婷激情综合| 九九色中文| 久久人妻久久| 五月婷婷影| 99久久精| 激情五月天综合网| 五月丁香激情五月天| 丁香五月激情天AV无码| ss99热| 婷婷色导航| 日日撸夜夜操| 丁香五月天堂| 天天摸,天天爽| 免费视频在线观看的网站| 亚洲九九在线| 九九精品系列| 色色五月婷婷久久| 久久五月综合| 操人无码| 青青福利网| 丁香六月成人网| 影音先锋偷偷色男人站| 激情五月婷| 久热这里只有| 青娱乐美女福利视频美臀| 97操在线| 噜噜噜久久| 色五月婷婷婷婷婷婷婷婷婷婷| 婷婷五月天激情小说| 日日肏天天操| 六月激情网| 99热老网站| 亚洲视频丁香网va| 五月天另类小说久久小说网| 狠狠操狠狠| www.久久爱| 五月网站| 婷婷色色婷婷| 免费AV播放| 99热99艹在线观看| 日欧大屏操| 久久三级视频| 人妻日日日| 丁香五月婷婷AV在线| 日本综合色图| 色综合久久久无码中文字幕999| 婷婷五月天激情开心网| 99综合| 色婷婷在线电影| www.婷婷| 五月婷婷五月天激情视频| 五月丁香久久激情综合| 色伊人婷婷| 亚洲综合丁香五月| 一起肏在线视频| 99啪啪视频| 情婷婷五月天| 九九色影院| 99天堂在线观看免费视频| 色综合九九色综合88| 激情五月综亚网| 在线观看亚洲AV| 婷婷综合在线| 色婷婷丁香五月天在线观看| 婷婷偷拍网| 99热色综合| 99热精品在线在线| 亚洲欧美国产高清vA在线播放| 91九色视频| 99久久婷婷国产综合精品电影| 五月丁香激情四射| 久久这里99| 久久九九爽| 99精品丰满| 丁香婷婷六月| 夜夜干夜夜操| 五月停停直播| 99精品久久久久久久| 亚洲三级无码| VA色婷婷| 亚洲色情网站| 丁香五月六月久久综合 | 久久久久激情网| 五月天色婷婷小说| 综合久久综合| 五月丁香在线综合| 色色热99| 玖玖五月丁香| 小香蕉av| 大香蕉520| 日韩五月丁香| 蜜桃婷婷丁香五月天狠狠久久综合| 五月婷婷丁香六月| 东京热五月婷婷| 五月天婷婷久久视频| 极品人妻VideOssS人妻| 99视频在线观看欧| 五月丁香色色网| 欧美性交一区二区三区| 国产AV一区二区三区最新精品| 内射综合网| 激情丁香五月天图片| 五月丁香婷婷激情久久| 亚洲精品电影| 18久久| 美女久久婷婷| 99热国产免费| 色色五月天丁香婷婷| 亚洲色激情| 亚州视频九九99| 色狠狠狠干| 台湾无码A片一区二区| 变态另类色图 | 99热这里有精品| 青草激情综合| 在线观看欧美| 亚洲激情婷婷| 久久久五月婷婷| 五月天天天开心激情网| 91蜜桃婷婷狠狠久久综合9色| 丁香五月婷婷综合精品素人| 婷婷色综合网日韩国产| 成人做爰A片免费看网站找不到了| 六月激情综合| 开心五月激情网| 99久在线观看|