结账页能打开,选择支付方式后却没有弹窗,控制台出现 Refused to load the scriptRefused to connect。最危险的处理是关闭 CSP 或添加 *。正确做法是识别被拦截的资源类型、准确域名和实际业务阶段,只放行必需来源。

先读完整的浏览器违规信息

script-srcconnect-srcframe-srcimg-src 不能互相替代。支付 SDK 主脚本可能来自一个域,API 请求、3DS iframe 和像素图片又来自其他域。把控制台信息按 directive 分类记录。

grep -Rni "Content-Security-Policy" app/code app/design vendor/*/*/etc
find app/code -path '*etc/csp_whitelist.xml' -print
curl -skI https://shop.example.com/checkout/ | grep -i content-security-policy

为模块建立最小白名单

<?xml version="1.0"?>
<csp_whitelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Csp:etc/csp_whitelist.xsd">
 <policies>
  <policy id="script-src">
   <values>
    <value id="gateway-sdk" type="host">https://js.gateway.example</value>
   </values>
  </policy>
  <policy id="connect-src">
   <values>
    <value id="gateway-api" type="host">https://api.gateway.example</value>
   </values>
  </policy>
 </policies>
</csp_whitelist>

示例域名必须替换为支付服务商真实生产域名。不要把 sandbox 和 production 混在一条宽泛通配符中;测试环境可单独配置。

更新配置后检查响应头而不是只清缓存

bin/magento cache:clean config full_page
bin/magento setup:di:compile
curl -skI https://shop.example.com/checkout/ | grep -i content-security-policy

如果 CDN 或 Nginx 也写 CSP header,浏览器会同时执行多条策略,Magento 白名单正确仍可能被外围响应头拦截。用 Network 面板查看最终响应里到底有几条 CSP。

结账验证要覆盖 3DS 和失败路径

普通测试卡成功并不代表规则完整。还要测试 3DS iframe、支付失败后返回、切换支付方式和订单成功页,并确认没有新增 CSP 违规。白名单变更应纳入代码审查,因为它改变的是浏览器信任边界,而不只是修一个前端报错。