结账页能打开,选择支付方式后却没有弹窗,控制台出现 Refused to load the script 或 Refused to connect。最危险的处理是关闭 CSP 或添加 *。正确做法是识别被拦截的资源类型、准确域名和实际业务阶段,只放行必需来源。
先读完整的浏览器违规信息
script-src、connect-src、frame-src 和 img-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 违规。白名单变更应纳入代码审查,因为它改变的是浏览器信任边界,而不只是修一个前端报错。

