上周帮一家外贸站看 WooCommerce 结账:点「下单」之后转圈不停,支付页永远不出来。后台订单偶发能建出来,网关后台却一片空白。客服说「支付坏了」,开发说「缓存问题」,运维说「证书没问题」。拆开看,往往是 admin-ajax / wc-ajax 报错、购物车页被页面缓存、回调 URL 对不上、或者 REST/nonce 失效叠在一起------很少是单一开关。
原则:先看 Network,再动缓存
别一上来就 purge 全站,也别先关支付插件、更别急着重装网关。用无痕窗口打开结账页,F12 → Network,筛选 admin-ajax、wc-ajax、checkout,再点一次下单。先记下四件事:哪条请求挂了、状态码多少、响应是 HTML 还是 JSON、有没有 CORS / 403 / 500。把这一条钉住,后面四层才有方向。很多「假死」其实是前端在等一条永远解析失败的 AJAX。

核对 1:浏览器里 admin-ajax / wc-ajax 到底回了什么
结账提交多数走 AJAX。打开 Network 点开失败请求的 Response / Preview,对照下面几类:
- 请求打到了 404,或 302 到登录页 :permalink 坏了,或安全插件 / WAF 拦了
admin-ajax.php、?wc-ajax=。把完整 URL 拷出来,无登录态再访问一次,看是业务失败还是入口被挡。 - 响应是整页 HTML(主题头尾都在) :页面缓存或 CDN 把动态接口当静态页吐了,前端
JSON.parse失败就会一直转圈。这是结账场景里最常见、也最容易被误判成「支付插件坏了」的一类。 - Console 冒
Invalid nonce、cookie 丢失、或会话相关警告:nonce 和会话不同步。多见于跨子域、HTTP/HTTPS 混用、以及缓存了带旧 cookie 的 HTML 再发给新访客。 - 网关前端脚本本身 404 / 被拦截:先确认脚本能加载;混合内容、证书告警另文写过,这里只核「结账按钮点下去之后那一跳」。
可在本机对结账页头信息做一次只读探测(生产环境勿对真实用户会话做破坏性操作,也不要用带 Cookie 的请求乱刷下单):
bash
# 只看结账页是否被错误标记为可缓存
curl -sI 'https://example.com/checkout/' | egrep -i 'HTTP/|cache-control|x-cache|cf-cache|age|set-cookie'
期望大致是:Cache-Control 带 no-store / private,或至少不该是边缘 HIT;若结账页直接 x-cache: HIT 且看不到会话相关 Set-Cookie,基本就能解释「为什么 AJAX 像抽风」。
核对 2:页面缓存与 CDN 必须排除 cart / checkout / my-account
结账页、购物车、我的账户,以及 admin-ajax.php、带 wc-ajax 的查询串,一律不要进全页缓存。很多站首页很快、列表也快,唯独结账转圈,就是缓存规则「一刀切」:把动态结算页当成可缓存 HTML 了。
逐项过一遍:
- 页面缓存插件 :明确排除
/cart/、/checkout/、/my-account/(注意多语言前缀、商店自定义 slug);并按 Cookie 旁路,例如woocommerce_items_in_cart、wp_woocommerce_session_。 - CDN / 边缘规则 :同样按路径 + Cookie 旁路,不要只按文件扩展名缓存。结账相关 URL 改完后做定点 purge,确认再测时是 MISS/BYPASS,而不是旧 HIT。
- 对象缓存与「一键加速」面板 :改规则不等于清干净。生产高峰期慎用全站
wp cache flush------它可能把整站打冷,顺带放大别的问题;优先清结账相关页面与网关脚本那一层。
支付链路和性能排查经常缠在一起,但「商品查询慢」和「结账提交挂掉」不是同一类病。结账路径更依赖动态页别被当成静态页。分层对照可以看 WooCommerce 性能与结账路径排查要点。
核对 3:支付网关的 notify / return URL 与 HTTPS
有时转圈停在本站,订单其实已经建了,只是网关回不来,或回调没把状态推到「已付款」。这类问题在 Network 里不一定有红字,要同时看网关控制台日志:
- notify / webhook / return URL 是否仍是旧域名、
http://,或带了错误子路径、多余语言前缀。 - 站点强制 HTTPS 之后,回调是否被中间层 301/302 丢掉 POST body------部分网关对重定向不重放 POST,表现就是「网关显示成功,本站一直待付款」。
- 防火墙 / WAF / 主机安全狗 是否把网关 IP 或特定 User-Agent 当攻击拦了。对照网关侧「通知失败」时间和本站 access/error 日志。
- Woo 支付设置页展示的回调地址 与网关控制台是否一字不差(含尾斜杠习惯、是否必须 https)。
改完用测试单走通:本站订单状态、网关账单、浏览器最终落地页三者要对得上。只看后台「有一笔订单」不够。
核对 4:REST、固定链接、nonce 与 Cookie
区块结账、部分网关、Store API 会走 /wp-json/。固定链接设成「朴素」、重写规则失效、或安全插件误伤 REST,前端就会卡在转圈,表面很像支付挂了。
建议这样核:
- 设置 → 固定链接 :点一次保存,确认前台
/wp-json/返回 JSON 而不是主题 404 页。 - 安全插件 / Basic Auth / IP 白名单 :是否把 REST 或
admin-ajax一并挡了;可先在测试环境对照开关,避免生产直接关防护。 - 多语言、多币种、自定义结账 URL:nonce 签发域和提交域必须一致,否则会出现「有时能付、清 cookie 又能付」的随机性。
- 会话 Cookie :
SameSite、跨子域、www 与裸域混用,都会让问题难复现------统一用无痕窗口 + 同一规范域名测。
bash
# 确认 REST 根可用(只读,勿带业务 Cookie 乱刷)
curl -sI 'https://example.com/wp-json/' | head -n 5
若这里已是 404/403,先修重写和安全规则,再回头点结账,能少走很多弯路。
快速验收
按下面打勾再收工:
- 无痕结账:Network 里
checkout/wc-ajax(或对应 REST)返回 JSON,状态 200,没有整页 HTML 冒充接口。 - 结账页响应头不再被边缘 HIT;带会话 Cookie 时路径旁路生效。
- 测试支付完整走通:下单 → 跳转网关 → 回站,订单状态与网关账单一致。
/wp-json/正常;Console 无持续性 nonce / CORS 红字;重复下单不再「空转」。
结账转圈很少是某一个开关的事,多数是 AJAX 失败的表象下面叠了缓存排除和回调配置。按 Network → 缓存排除 → 网关 URL → REST/nonce 往下压,比上来重装支付插件省时间,也少误伤线上单。
文末延伸
若希望按当前站点插件、缓存和支付配置快速过一遍问题清单,可以用 按站点现状出问题清单的免费诊断。