99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
五月综合亚洲色| 国产SUV精品一区二区6| 人妻熟妇国产精品| 欧美三级大片AA在线看| 午夜婷婷| 丁香五月情| 噜噜狠狠| 婷婷五月综合啪| 久久婷婷五月天| 超碰在线成人| 九月激情综合| 激情婷婷综合网| 五月丁香久久| www.精品99| 久久九九99亚洲国产久精综合| 亚洲成人中文字幕| 久99婷婷色综合| 久久伊人婷婷| www.黄色片-久久成人国产精品在线播放-999AV| 婷婷五月色播网| 久久密臀婷婷| 97超级碰人人| 超碰婷婷五月| 婷婷六月丁| 丁香 婷婷 亚洲 熟女| 毛片新网地| 日本韩国视频在线观看社区免费的9| 久久久五月五丁香| 六月丁香五月婷婷| 亚洲第一色区| 99精品视频在线免费观看| 婷婷五月综合啪| 狠狠干综合| 国产色色色色| 天天操夜夜肏| 日日夜夜小色哥| 91九色超碰正在播放| 色综合xx| 五月天社区| 久久人人九九| 成人AV免费观看| 丁香五月综合亚洲| 国精产品一区二区三区| 色五月婷婷啪啪五月| 免费啪啪亚州视频| 欧美精品99| 婷婷五月丁香人妻无码高清| 成人无码精品1区2区3区免费看| 色天五月天在线观看视频| 午夜丁香六月婷| 99热啪啪| 欧美超级视频97| 丁香激情五月少妇| 婷婷日韩| 久久久A级视频| 六月婷在线| 日比网免费国产| 三年高清大片免费观看国语| 9色视频在线| 欧美激情凹凸丁香网| 九九综合久久丁香婷婷,开心激情综合网| 最新日韩久热免费视频看看| 五月天婷婷香蕉狠狠超碰综合| 欧美成人猛片AAAAAAA| 99热这里只有精品1| 六月色色| 乱精品一区字幕二区| 亚洲综合激情五月久久| 精品一二三区久久AAA片| 亚洲操操| AAA级久久久精品| 少妇AB又爽又紧无码网站 | a网站免费观看| 9婷婷内射| 国产色99| 婷婷六月丁香在线| 九九爱激情| 六月婷婷久久大全| 亚洲成人综合在线| 无码 av电影| 97精品人人A片免费看| 五月婷婷就去色| 五月天色婷婷基地| 久99热在线观看| 久久伊人大香蕉| 欧美va在线| 婷婷五月天AV| 久久丁香社| 婷婷综合一二三| 亚洲激情av| 激情综合网之激情五月| 久久激情五月婷婷| 天天做天天爱| www.久久99精品| 小泽玛利亚视频一区二区| 99热精品在线| 婷婷在线免费| 青青久久五月| 激情五月深爱五月观看| 狠狠爱婷婷爱| 狠狠色色| www.lchjjc.com| 久久加勒比| 狼人久草| 五月天成人综合| 色婷婷五月在线| 天天日天天色| 五月婷婷激情性爱| 五月亭亭直播| 激情五月成年| 婷婷终合色图| 激情综合5月| 丁香五月亚洲| 成人精品视频99在线观看免费| 综合久久婷婷| 九九人人自拍| 中文网av| www.色婷婷| 久久久中文| 四LLL少妇BBBB槡BBBB| 丁香五月婷婷五月天| 人妻无码精品一区| 激情五月天视频| 大香蕉天堂| 亚洲欧洲中文日韩久久AV乱码| 亚洲精品久久久久AV无码| 99精品网| 五月天日日操夜夜操 | 久激情| 99精品在线| 天天日天天干天天天| 99热啪啪| 综合激情网五月激情| 任你搞网站| 激情五月天色色色| 亚洲成人五月| 日本三级第一页| 色色无码日韩| 97人人超| 精品视频这里只有精品| 97香蕉碰碰人妻国产欧美| 665566 无码| 天天噜天天插| 五月色综合| 激情四射婷婷| 九色PORNY自拍成人精彩视频| 91av成人| 久色欧美| 国产午夜精品AV一区二区麻豆| 亚洲视频二区| 六月丁香五月婷婷| 思思久热6| AV在线免费观看不卡| 五月丁香直播| 97操| 久机视频这只有精品| 色婷婷久久综合| 久久综合丁香| www久久99com| 9 7总站超级碰免费视频| 天天色天天舔天天爱天天爽| 丁香花五月天社区| 九九青青草成人| 97碰碰视频在线观看| 色色色五月婷| 十月丁香婷婷| 婷婷基地成人五月天| 丁香午夜天| 超碰伊人碰婷婷五月| 综合网啪| 久久婷婷五月草视频在线播放| 超碰国产在线| 天天日夜夜拍| 丁香五月天婷婷在线视频| 色五月天在线观看| 日夜夜久久| 9婷婷内射| 97人人搞| 1995年关宝慧版蜘蛛女| 天天综合五月天| 伊人激情综合网| 九九人妻福利| 99re热在线视频观看| 久久人人超| 九九热这里都是精品6| 色青青电影色五月| 激情九月综合| 五月天六月婷| 六月丁婷婷| 五月婷婷综合天天操| 99狠狠| 狠狠色婷婷7| 激情五月丁香五月色| 五月婷婷色五月| 色五月综合| 中文字幕有多少字| 五月婷综合| 天天檫天天爽| 精a品a视a频| 久久婷婷网址| 99免费在线视频| 婷婷五月激情视频| 插插插丁香五月婷婷| 人人操人人添人人摸97| 无码少妇高潮喷水A片免费| 天天日,天天插| 久久亚洲婷婷| 国产精品人妻在线网址| 婷婷色色欧美综合网| 97人人超| 啪啪 综合网| 情情五月天色| 激情 五月 婷婷 丁香| 色色色色色色色五月| 九九黄色网| 五月天激情无码专区| 久久激情视频99| 99久久久精品| www,setingting| 99这里都是精品6| 亚洲视99| 婷婷刺激综合| 国产成人99久久亚洲综合精品| 中文资源在线a| 国产真实乱对白精彩| 日本在线99| 99热这里只有精品50| 超碰在线人妻| 97干视频| 91爱啪啪| 五月婷婷啪| 日韩精品一区二区刘| 久久精品99国产精品日本| 色色国产| 激情五月婷黄版| 久热这里只有精品66| 天天爱天天做天天日| 五月婷婷丁香啪啪| 97丁香婷婷| 久久婷婷东京热大香樵| 久久精品噜噜噜成人A∨色欲| 午夜性做爰电影| 久久精品视频99| 丁XX 成人| 51avj视频大全| 99视频这里只有久久精品| 在线观看五月婷婷网| 五月色网| 人人色性网| 激情丁香五月天综合| 非洲一级AV| 香蕉大综综综合久久| 日本在线观看aaa 99| 日日做A爰片久久毛片A片英语| 91精品久久久久久综合五月天| 人妻激情在线| 伊人99热| 思思热99er| 亚洲狠狠色丁香婷婷综合久久| 成人片黄网站色大片免费毛片| 综合激情五月天| 综合网色| 99色在线观看视频| 青青草免费公开视频| 五月天五月天成人网亭亭成人色网站| 在线观看亚洲视频影院| 1024操逼| 五月婷婷在线免费观看| 五月丁香六月婷婷婷婷| 五月婷婷 婷婷五月 一区二区 久久久| 五月天天天天天天天天天天天天天天天婷婷婷 | 久久爱综合| 丁J香六月首页| 一起草aV| 国产伊人五月天| 99热99热在线观看| 亚洲色婷婷五月| 色色色免费视频| 五月婷婷影院| 国产精产国品一二三在观看| 丁香五月成人自拍| 国产色色在线| 色婷婷小说| 婷婷五月天Av| 九九色婷| 97婷婷色| 开心五月网 | 欧美熟妇一区二区三区| 黄色激情久久| 婷婷六月激情啪啪| 婷婷五月成人| 久艹久| 亚洲免费观看高清完整版AV线| 五月天婷婷綜合院| 五月婷婷丁香六月在线| 丁香五月天堂网| 在线看的免费网站| 99re视频在线播放| www.99热. com这里只有精品| 婷婷五月花| 天天色播| 啪啪99| 色久婷婷网| 九九激情视频| 婷婷97狠狠成人网站| 九九Y精品热播| 欧美色男人网站| 欧美超级视频97| 搡BBBB搡BBB搡五十| 欧在线一区| 婷婷天堂综合| 色五月婷婷五月天| 七月丁香婷婷 色色| 无码啪啪| 婷婷黄色| 久久人妻视步| 艳妇野外情欲放荡HD| 九九99热| 色色色热热热| 99热99日天天干| 久久三级视频| 玖玖色综合| 日韩AV在线免费| 视频这里只有精品| 色五月六月| 无码一级片| 九九久久精品| 啪啪啪综合网| 亚洲av成人在线| 婷婷五月花.97| 第四色婷婷日本| 免费在线观看欧美激情xx小视频| 婷婷影院A成人| 久这里只有精品99| 色五月人妻| 九九视屏| 六月丁香五月婷婷| 99热在线观看99| 五月花婷婷最新| 91精品91久久久中77777| 超碰五月婷婷五月天| 亚洲精品又粗又大又爽A片| 激情综合在线播放| 99爱在线视频| 九九热在线99| 原琪琪色影院| 亚洲成人免费在线| 天天干天天做| 久久这里面只有精品视频| 婷婷五月综合色拍| 婷婷丁香激情综合色情| 色色色色色色色色综合网| 无码髙清| 99性视频| AV美美午夜| 五月天激情婷婷| 婷婷五月天免费小说| 午夜色婷婷| 欧美激情性做爰免费视频| 91丨九色丨熟女|老版| 九九视频这里只有精品| 97碰碰视频| www.婷婷.com| 99操逼| 激情五月丁香社区| 五月丁香色婷婷婷基地| 97caop| 99热精品9| 美女婷婷激情亚洲| www.五月丁香| 综合久| 99热97| 天天综合情| 开心深爱激情网| 第四色色六月色综合| 伊人五月综合网| 色婷婷丁香五月| 久热这里| 夜夜爽天天爽| 无码四色色色| 思思热99er| 亚洲色99| 丁香五月综合久久八| 极品人妻VIDEOSSS人妻| 日本色色色| 任你日视频| 成人日韩欧美| 丁香激情综合| 欧美色图45678| 九九九九操逼| 性爱网五月天| 婷婷丁香五月天狠狠| 97婷婷五月丁香| 97干在线观看视频| 26UUU精品一区二区c〇m| 97性高潮久久久| 丁香五月激情综合| 色婷婷色五月天| 婷婷射图| 丁香啪啪中文字幕| 亚洲激情五月天| 久久机热这里只有 | 欧美性猛交99久久久久99按摩| 五月丁香六月婷婷的女人| 小骚穴电影| 99无码精品| 五月丁香龟婷婷| 国产成人av在线| 爱操天堂| 日日日日日| 丁香五月电影| 五月婷婷这里都是精品| 猫咪伊人久久| 欧美碰碰碰| 久久婷婷热| 婷婷五月天免费视频| 色综合色| 99人人操人人操人人精| 狠狠干五月| 国产精品大香蕉| 五月丁香亚洲婷婷| 久久 这里只有精品1| 99在线免费视频| 伊人婷婷福利网| 日本色道视频网站| 综合网啪| 激情五月婷婷五月丁香五月开心五月| xxx综合在线| 丁香五月区| 色九月综合网| 伊人丁香五月婷婷潮吹| αv中文字幕在线观| 久久ww| 狠狠高潮精品亚洲1| 五月丁香六月婷婷不卡免费无码| 97热视频| 伊人色综合影院视频| 爱狠射| 亚洲网站观看视频| 天天日天天色| 色色五月婷| 一起草Av| 亚洲综合婷婷| 丁香六月综合激情| 激情五月天丁香| 丁香六月狠狠干| 79精品视频| 开心五月深爱激情| 久久久久久久合一狠狠做深爱| 天天色伊人| 色色色色色级无码| 成人婷婷桔色| 五月天婷婷六月| 色婷婷丁香网| 婷婷六月激情啪啪| 伊人六月丁香婷婷| 9这里只有精品| 99热日| 激情图片婷婷| 另类综合国产| 99思思热只有在这里看 | 五月婷A V在线| av国产精品| 婷婷久久五月天| 超碰精品在线| 久久精品99国产精品日本| 69精品人人人人| 色噜噜狠狠色综无码久久合欧美| 欧美性生交XXXXX无码小说| 九九这里只有精品| 丁香五月亚洲综合丝袜| 成人国产网站| 深夜男女福利刺激影院一区完整| 色婷婷基地在线| 丁香五月网络网络| 思思热国产| 五月激情婷婷在线| 亚洲中文av| 99热97| 99久热| 五月婷婷视频| 日本色色网站| 99综合| 影音先锋女人av鲁色资源网小说免费| 国产 A片 自拍| 这里只有精品视频在线看| 99在线精品视频免费观看20| 丁香五月影视| 风流少妇A片一区二区蜜桃| 丁香五月婷婷激情97| 国产亚洲成人综合| 五月婷久久| 日本五月婷婷久久久六月丁香| 六月天六月婷| 五月婷婷深深爱| 久久99网| 超级碰碰一区| 在线播放成人网站| 五月丁香六月婷婷网站| 91久久| 国产肥白大熟妇BBBB视频| 丰滿爆乳一区二区三区| 色婷婷av在线| 永久AⅤ1| 国产毛片精品一区二区色欲黄A片| 精品夜夜澡人妻无码AV| 日本久久人| 99视频这里只有免费精品| 99视频精品8| 在线观看欧美| 婷婷操无码| 亚洲第一黄网| 玖玖资源站中文| 久久五月天婷婷| 懂色av粉嫩AV蜜臀AV| 国产白丝在线一区| 新伍月婷婷| 狠狠草狠狠草| 玖玖激情网| 开心久久爱五月天| 五月丁香激情综合| 午夜色丁香| 免费精品66| XX久久| 97碰碰免费.视频| 狠狠色综合网| 97九色视频| 丁香性爱在线视频| 色色热99| 久久婷婷成人综合色怡春院| 九月久久婷婷| 丁香五月综合在线视频| 99在线精品免费视频| 九九99热久久精品66中文字幕| 五月天色婷婷视频| 五月激情综合网| 亚洲一区二区无遮挡A片| sewuyuejiqingwang| 综合婷婷| 国产成人av在线播放| 婷婷五月天成人网站| 婷婷五月天av| 成人短视频在线观看| 激情开心五月天| 9视频在线成人网站| 五月天五月色婷婷综合| 激情五月丁香五月| 色碰碰| 五月天网站免费欧美| 综合网精品99| 五月激情黄色小说| 牛牛澡牛牛爽| 婷婷综合激情五月综合| 乱乱av| 最新午夜理论片| 国产无套精品一区二区| 99日韩| 九九精品99| 久热99热| 九九综合精品| 欧日韩成人| 丁香五月大香蕉AV| 五月天成人在线| 五月丁香激情综合啪| 久久色区| 91欧美| 五月天久久综合| 久久婷婷五月综合色丁香| 婷婷五月天久久久| 午夜丁香六月婷| 无码区婷婷五月花开| 丁香五月很很肏| 久草五月天| 懂色av蜜臀av粉嫩av永陈冠希| 五月丁香在线看| www亚洲无码| 天天澡天天狠天天天做| 丁香五月色五月| 婷婷五月av| 538午夜激情| 亚洲色综合| 超碰免费人人肏| 深爱五月日韩| www、丁香五月天| www婷婷| 丁香婷婷人妻| 久久caop| 噜噜噜久久| 七七九色| 成人做爰A片免费看视频| 色天天综合成人网| 激情五月天的婷婷| 五月丁香啪啪网| 婷婷涩涩网| 在线播放 精品| 成人永久免费视频在线观看| 婷婷色婷婷亚洲成人| 国产精品第一国产精品| 天天爽天天摸天天爱| 婷婷射丁香| 99免费在线视频| 亚洲激情免费视频| 色五月天激情| 五月婷婷玖玖综合玖玖爱| 激情综合网五月婷婷| 中文字幕在线免费观看视频| 色婷婷很很丝袜| 99热日| 综合xx网| 亚洲成人另类| 色偷偷AV亚洲男人的天堂| 五月婷婷性| 大香蕉av在线| 五他月天啪啪啪| 久久激情视频| 丁香五月亚洲| 99视频久久免费视频| 牛牛色av| 五月天六月丁香| 五月丁香久久丝袜啪啪| 欧美性生交XXXXX无码小说| 亚洲色图五月丁香五月婷婷| 色五月综合| 色播五月婷婷| 色婷婷六月| www.国产亚洲69ty.久久久久久久久久久久| 影音先锋秋秋五月婷婷| 婷婷五月丁香六月| 99视频只有精品| 五月天婷婷激情干干| 色色五月天丁香婷婷| 国内一级片| 天天插天天插天天插天天插| 久久人妻人人| 亚洲色婷婷视频| 久久五月天大美女| 丁香六月婷婷综合激情欧美| 亚洲国产网站| 91九色PORNY肉丝在线| 色99网| 五月丁香成人视频| 这里只有精彩亚洲视频推荐| 开心五月激情| 六月丁香婷婷视频综合在线观看| 丁香六月婷婷综合啪啪| 亚洲成人AV一区在线观看| 99精品网| 饮料下药迷倒漂亮女同事强干| 亚洲精品国产精品乱码视99| 欧美英丁香开心快乐六月天网| 99色色网| 午夜免费试看| 日韩成人AV在线| 久热黄色| 欧洲亚洲精品| 精品亚洲VA网站| 中文字幕 久久9999| 五月婷婷狠天天色综合| www,五月天com| 国产成人+综合亚洲+天堂| 狠狠爱五月婷婷| 91久草五月天婷婷| 亚州色综合| 久久五月婷综合网| 丁香六月欧美| 伊人久久大香天蕉亚洲特级| 岛国午夜视频| 99玖玖人人| 久久一品区| 亚洲乱码w在线观看| 97成人在线视频精品| 绿色小导航AV| 超碰电影在线播放| 99热国产精品| 六月亚洲婷婷6月中文字幕| 五月天婷婷色| 午夜性爱影视一区77| 巴基斯坦粉嫰无码视频| 五月婷婷激清网| 综合五月激情网| 日日夜夜久| 五月叮香啪| 高清无码网址| 色播五月网| 99国产精品久久久久久久久久久 | 婷婷伊人激情婷婷| 国产精品色一哟哟| 色女伊人| 九九99九九99偷拍视频免费看| 九九99精品视频| 99热免费精品| 三级黄色大片视频| 9 大屁股在线视频精品| 97色色色| 婷婷五月天影视网址| 99色一| 五月的色婷婷高潮| 9久久精品| 97精品人人A片免费看| 91九色偷拍| xx久久| 久久网站观看免费欧洲国产| 九九色热视频| 天天射美女| 婷婷六月天| 任我肏视频精品| 色婷婷a v| 丁香五月激情综合在线观看| 蜘蛛女侠2003满天星免费观看| 97视频91| 色无婷婷| 丁香九月激情| 天天做天天爱天天玩夜夜爽 | 超碰人人色| 深爱五月天天| 热中文字幕| 婷婷激情六月综合| 99碰网站| 成人龟情网丁香五月| 婷婷天天综合| 丁香六月欧美| 丁香五月网站| 停停五月丁香| 婷婷丁香久久| 激情图片婷婷丁香五月| 婷婷五月天伦理| 99九九热视频| 91性交在线播放| 91seav| 天天日天天做天天操| 熟女激情网| 丁香婷婷五月香蕉91| 九洲一级A片| 这里只有精品视频在线看| 五月丁香综合啪啪| 色色性爱视频| 久久WW| 99久久婷婷国产综合精品电影| 91碰超| 丁香五月在线观看完整版| 久久久噜噜噜久久人妻| 日韩九九| 综合网色| 5月婷婷激情在线| 久热只有精品| 91日视频| 九一99| 精品人妻伦一二三区久久| 婷婷五月天伊人在线| WWW.99视频| 天天射影视综合网| 99色在线观看视频| 五月婷婷日| 色五月婷婷操逼| 色丁香影院| 亚洲乱码日产精品BD| 五月婷婷免费在线| 99亚洲天堂| 激情图片亚洲| 久久精品凹凸分类| 久久久激情视频| 丁香五月亚洲无码| 狠狠色五月激情| 久草丁香婷婷五月天婷| 六月婷婷天天操夜夜爽视频| 婷婷在线精品| 五月丁香久久呀| 天天射综合网天天插| 色青青电影色五月| 久久视频在线视频| 看黄的网站18禁| 五月丁香啪啪网| 99热国内精品| 97久久草草超级碰碰碰| 91成人看片| 精品综合爱| 色婷婷六月| 成人在线日韩欧美| 九九re精品视频在线观看| 久综合九| 97精品自拍| 午夜激情婷婷| 99视频精品在线| 日本精品在线噜噜噜| 99免费在线视频| 天堂爱爱| 久久色六月| 色5月婷婷| 人人操大| 欧美综合123区| 五月丁香啪啪啪啪| 丁香五月激情网| 综合激情五月综合激情五月激情1| 五月丁香网站| 99热99这里有免费的精品| 免费色婷婷| 另类视频五月天| 色吧五月婷婷| 五月天开心网| 九九久久视频| 综合99视频| 99爱在线免费视频| 97深爱伊人综合| 久久婷婷一级片| 婷婷五月天激情网| 91丨九色丨东北熟女| 天天爽天天操| 丁香五月电影| 色色五月丁香| 人人人操 超碰| 第四色五月天| 九九热视频精品2| 五月色天情| 综合久久久| 激情五月婷婷| 五月婷婷综合在线视频小说| 91超级碰| 五月天色软件| 欧美婷婷日本| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 国产亚洲色婷婷久久99精品91| 久久这里只有国产| 人人操超碰| 久久人人九九| 亚洲麻豆乱码国产2028| 色综合久久88色综合天天看| 大香蕉婷婷| 人人视频人人干人人做| wuyuedingxiang99| 五月婷婷黄| 五月天婷婷基地| 九九热精品| 丁香五月瑟瑟| 超碰免费大香蕉| 玖玖爱伊人网| 四色永久成人网站| 色情综合网| 五月丁香婷婷无码中文| 操人精品| 丁香五月五月婷婷欧美大香蕉| 丁XX 成人| 深爱五月天 开心网| 五月丁香色综合| av在线播放网站| 久久精品性爱| 五月丁香六月婷婷姐| 色在线五月天免费| 99在线观看视频| 99久久婷婷综合| 九九热视频在线观看| 成人综合AV| 日韩中出视频| 成 人片 黄 色 大 片| 4438激情网| 99国产这里只有精品| 天天操夜夜啊| 婷婷99中文字幕| 永久热91| 99热综合在线观看| 中文成人在线| 亚洲另类电影| 色婷婷九月| 极品另类| 天天爱综合网| 久久偷拍综合五月天| 色婷婷六月综合| 久月丁香爱婷婷综合| 成人五月天丁香| 婷婷色吧| 男人天堂AV在线一区二区| 亚洲成人在线在线| 欧美 日韩 人妻 高清 中文| 久九色| 婷婷色在线播放| 日本婷婷色日| 五月婷婷在线播放| 秋霞三及片| 日日懆天天懆| AAA亚洲AV| 深爱激情五月天婷婷网| 开心五激情网| 丁香六月高清视频| 伊人五月人妻精品| 熟女五月天久久综合| 在线,国产,色,热视频| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 97欧美在线| 日韩黄色网络| 国产激情综合五月久久| 久久色五月| 91婷婷搞| 日本超碰在线| 婷婷伊人| 久久久久9| 91丨九色丨熟女高潮| 色狠狠综合| 丁香五月久久| 婷婷色情 | 久爱综合| 大香蕉天堂色| 丁香五月婷婷欧美激情-中文天堂最新版在线观看| 五月天堂六月丁香亚州中文字幕久久| AV变态另类一区二区| 最熟少妇乱码| 99人人操人人操人人精| 久久婷婷国产| 一级黄色影片| 岛国资源网| 精品久久66| 天天干天天插| 99热这里精品| 中文字幕在线免费看线人| 99久久66综合| 先锋男人91资源| 成人网站免费在线播放| 激情网站五月| 玖玖精品资源| 久久精品这里只有精品免费首页| 久操福利| 色播丁香| 日本玖玖在线| 激情综合99| 色综合色婷婷色伊人| 人妻尝试久久久久久久久久久久| 日日日日操| 五月婷婷啪啪网| 天天插天天干| 97丁香视频| 超碰免费人人| 婷婷综合五月色播| 在线视频99| 亚洲国产色色| 热99在线精品| 亚洲色五月| 久久日韩婷婷五月| 另类的婷婷| 五月婷婷在线综合| 天天综合在线网| 久久久久久久11111111111| 成人一区在线观看| 婷婷五月激情热播| 亚洲狠狠干| 超碰九色| 日本黄色精品| 99re这里只有精品免费| 婷婷六月丁| 能看的AV| 久久婷婷五月综合激情国产| 初夜av| www.婷婷| 国产AV一区二区三区日韩| 26.uuu丁香五月婷婷| 婷婷黄色五月天在线视频| 五月激情小说| 欧美色一级色| 久久XX| 色五月综合激情| 超碰精品在线| 9有码中文| 在线A色| 婷婷伊人五月天| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 美国不卡视频| 婷婷成人综合五月| 五月丁香色婷婷| 亚洲XX网| 五月丁香婷婷三级| 成人综合网站| 久久XX| 激情五月丁香六月综合AVXXXX| 少妇人妻丰满做爰XXX| 久久五月网| www.操.com| 五月天综合在线网| 天天色天天色天天色天天色天天色天天色| 久久精品性爱| 碰碰碰97国产| 美女激情婷婷| 图片区 小说区 区 亚洲五月| 色婷婷成人网| 婷婷99狠狠| 91九色PORNY中文啦| 丁香六月高清视频| 成片免费观看视频大全| 亚洲综合五月天婷婷丁香| 欧美一级操逼视频| 91人人爱| 婷婷五月天激情小说网站| 九九香蕉网| 日韩操人| 色五月综合激情| 丁香六月婷婷久久高清| 丁香五月六月综合欧美| 夜色爱爱亚洲| 色婷亚洲| 久久探花91swag| 五月天婷婷深深爱| 一二线视频 另类| 婷婷五月天777| 99操视频| 激情com| 99无码精品| 五月综合婷婷开心网| 九九在线视频| 色视频2025| 婷婷天堂站| A一级操| 五月综合激情婷婷六月色窝| 深爱激情网五月| 日本三级中国三级99人妇网站| 丁香五月综合高清在线| 99精品在这里| 天天做天天视天天谢| 伊人五月天| 好吊丝aV| 午夜成人av在线| 九九热只有精品| 色播五月丁香综合| 五月天久久网站| 91色综合网| 激情综合一| 精品无码人妻一区| 丁香婷婷影院| www.五月丁香| 97人人看| 97色干| 可以直接看的av网站| 狠狠婷婷日韩| 5五月综合网亚洲| 成人av在线网站| 色色色热热热| 三级成人网站| ww超碰在线| 亚洲AV综合在线观看| aaaaa不卡| 日韩在线观看网址| 日韩1区2区| 人妻AV在线观看| 欧美日韩成人| 狠狠操狠狠干综合| 五月天婷婷社区久久综合| 色婷婷AAA| 天天插夜夜爽| 99精品女人天堂| 五月天伊人网| 天天日天天日天天搞| 成人在线视频一区| 色五月婷婷丁香五月| 森林影视大全,最好看的2019年视频 | 欧美综合五月丁香六月婷| 六月撸婷婷| 丁香五月玖玖| 啪啪操网| 婷婷丁香综合| 日本99视频精品免费播放| 久久精品女人天堂AAA| 日91高清无玛| 久久WW| 99热99思午夜精品| 91人人操.COM| 狠狠操天天干| 另类图片天天影视在线观看| 色色网站| 婷婷五月天日日日干干干| 五月激情丁香久久综合网| 最新色色五月天| 9伊人网| Va另类视频| 狼友超碰| 免费视频WWW在线观看网站| 丁香五月中文字幕久色| www.婷婷五月天| 国产肥白大熟妇BBBB视频| 激情五月天偷拍综合网| 玖玖99福利| 五月婷婷综合影院| 中文字幕免费高清电视剧| 99热在线看片| 久久人人人人妻| www.精品99| 婷婷五月激情综合网| 99色热| 激情五月婷黄版| 开心五月婷婷在线视频免费观看| 大香蕉天堂| 亚洲情欲久久| 国产SUV精品一区二区6| 色丁香五月天| 午夜丁香婷婷| 久久草婷婷丁香网站| 欧美日韩99| 亚洲av午夜精品一区二区| 人人色人人弄人人操| 俺去也综合| 91ncm视频| 天天夜夜爽| va婷婷在线免费观看| 色色综合无码| 大香蕉久久草| 99re在线免费视频| 九久久九精品视频| 另类少妇人与禽zOZZ0性伦| 99热精品在线播放| 天天综合精品| 日婷婷久久开心| 岛国av电影网站| 婷婷丁香五月天色区| 都市激情久久| 中文字幕永久在线| 久热中文字幕| 丁香婷婷色色| 久久精品夜色噜噜亚洲a∨| 亚洲视频在线网| 五月丁香综缴情性爱| 久久精品无码一区| 拍真实国产伦偷精品| 欧美人妻一区二区| 久久久激情| 人人澡玖玖一| 另类综合激情| 五月天丁香成人| 女人天堂久久| 日日干日日| 婷婷成人五月天| 激情五月丁香亭亭 | 性爱在线播放av| 色很很96| 婷婷丁香视频在线观看免费| 丁香五月亚洲激情婷婷射| 99久久99九九九99九他书对| 婷婷五月天久久| 九九九九国产| 日韩免费乱轮网站| 婷婷五月蜜桃成人桃色丁香| 成人深爱丁香五月| 99热 免费| 五月激情另类| 九九视频精品在线免费| 79色色免费| 99热这里只有精品18| 噜噜精品| 天堂久久性| 丁香激情久久| 狠狠爱综合网| 超碰在线91| 欧美久久一级内射wwwwww.| 九九99精品免费播放| 国内精品免费一区二区2009| 一本九九色| 99色色| 六月色日韩| 激情综合婷婷| 亚洲国产色色| 天天做天天爱| 91色久| 五月丁香综合网| 婷婷99视频在线| 日本人妻操| 五月玖玖| 色色色视频| 这里只有精品免费视频在线观看 | 天堂呦 呦百度搜索-百度搜索| 31色区视频免费看| 日本一级特黄大片AAAAA级| 就是色婷婷五月亚洲色| 丁香五月激情综合在线观看| 婷婷开心六月| 婷婷黄色| 成人国产欧美大片一区| 九九热内射| 丁香五月激情棕合| 五月丁香六月激情综合啪啪| 伊人五月丁香| 丁香花色色网| 日本精品人妻无码77777| 国产婷婷久久| 极品色丁香| 激情五月亚洲| 色人久久| 五月丁香亭亭电影久久| 五月天激情网址| 久久人妻久久久久| 26uuu亚洲精品国产| 亚洲国产精品二二三三区| 五月天自拍网| 99免费热视频| 综合网色| 91九色超碰| 丁香五月婷婷基地| 玖玖精品资源| 性爱网五月天| 九九色网专区| 97人人操人人| 五月婷婷伊人在线| 婷婷五月天激情小说| 九月丁香网婷婷| 97干97色| 拳交大逼| 麻豆AV一区二区三区| 久久精品系列| 东北婷婷五月天| 色情丁香五月婷婷精品| 五月天丁香色色| 亚洲思思热久| 丁香六月情| 99热在线观看| 97色在线视频| 五月婷婷综合在线视频小说| 婷婷久久综合久| 超碰在线观看9| 性天天中文网| 依人大香蕉| 久久9精品| 亚洲激情五月| 大香焦啪啪啪| 精品久久婷婷五月天| 玖玖在线视| 97久操| 色五月天成人在线| 久久激情五月婷婷| 五月丁香综合中文| 日撸夜撸日操| 99热| 99精品在线观看| 亚洲性爱电影| 天堂网色婷婷| 五月婷婷激情综合视频| 欧美性猛交99久久久久99按摩 | 99九九精品视频| 国产毛片欧美毛片久久久| 91色久| 99玖玖免费视频| 99啪在线| 橾逼网| WWW.HENHENL.| 6080av| 丁香婷婷综合激情五月色| 久久久18| 538任你爽| 日韩黄色网络| 欧美激情VA永久在线播放| 色综合色色色色色色综合| 激情五月视频| 屁股翘好撅高迎合跪趴| 日韩操| 九月丁香| 精热在线综合网| 99精在线| 亚洲综合五月天| 影院久久久| 色综合久久久久久久久五月| 99热在线观看| 热的国产99热| 99热99色| 夜夜躁狠狠| 丁香五月成人| 久热这里只有国产| 久久久久9| 人妻内射麻豆视频| 欧美性色A片免费免费观看的| 成人五月天色天堂| 亚洲精品久久久久久久久久吃药| WWW、日本色丁香co m| 欧美经典片免费观看大全| 五月丁香六月婷婷亚洲激情综合| 五月天电影网|