PayPal JS SDK v6沙盒环境onApprove未触发及FraudNet CORS错误问询
PayPal JavaScript SDK v6 沙盒环境
onApprove回调未触发,CORS配置错误导致结账中断 将PayPal JavaScript SDK v6集成到Web应用后,沙盒环境下出现严重问题:买家点击PayPal弹窗的「立即付款」按钮后,onApprove回调从未触发,弹窗显示无限加载,整个结账流程中断。
环境信息
- SDK地址:
https://www.sandbox.paypal.com/web-sdk/v6/core - 集成类型:
JS_SDK_V6(已通过弹窗URL参数确认) - 测试浏览器:Firefox 148、最新版Chromium
- 沙盒账户:测试2个不同个人账户,结果一致
复现流程
- 服务器调用
POST /v2/checkout/orders创建订单,返回CREATED状态及新orderId - 前端调用
createPayPalOneTimePaymentSession,传入onApprove/onCancel/onError回调 - 点击PayPal按钮,调用
paymentSession.start({ presentationMode: "auto" }) - PayPal弹窗打开,买家登录并点击「立即付款」
- 预期:
onApprove回调触发,执行后续订单捕获逻辑 - 实际:无任何回调触发,弹窗显示无限加载
已定位的根因
通过弹窗DevTools控制台发现,PayPal弹窗(hermes)因FraudNet(fb_fp.js)的CORS失败抛出「Interrupted」错误:
Access to XMLHttpRequest at 'https://c.paypal.com/v1/r/d/b/p1' from origin 'https://www.sandbox.paypal.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header has a value 'https://www.paypal.com' that is not equal to the supplied origin.
相同错误出现在以下请求:
https://c.paypal.com/v1/r/d/b/p1https://c.paypal.com/v1/r/d/b/p2https://c.paypal.com/v1/r/d/b/w
问题核心:c.paypal.com响应的Access-Control-Allow-Origin硬编码为https://www.paypal.com,未包含沙盒环境的https://www.sandbox.paypal.com,导致跨域请求被拦截,FraudNet流程失败,进而中断整个结账流程。
此外还存在以下CSP错误:
CSP blocks 'unsafe-eval' in PayPal's own hermes page CSP blocks blob: worker on sandbox.paypal.com
弹窗日志关联ID:1VU87823S2094644K
简化集成代码
const sdkInstance = await window.paypal.createInstance( { clientId: "MY_CLIENT_ID", components: ["paypal-payments"], pageType: "checkout", locale: "de-DE" }); const paypalSession = sdkInstance.createPayPalOneTimePaymentSession( { onApprove: async function (data) { // 从未执行到此处 await fetch("/api/paypal/capture", { method: "POST", ... }); }, onCancel: function () { /* 取消逻辑 */ }, onError: function (error) { /* 错误处理逻辑 */ } }); paypalBtn.addEventListener("click", async function () { await paypalSession.start( { presentationMode: "auto" }, Promise.resolve({ orderId: serverGeneratedOrderId }) ); });
服务器端创建订单请求
{ "intent": "CAPTURE", "purchase_units": [{ "amount": { "currency_code": "EUR", "value": "530.00", "breakdown": { "item_total": { "currency_code": "EUR", "value": "445.38" }, "tax_total": { "currency_code": "EUR", "value": "84.62" }, "shipping": { "currency_code": "EUR", "value": "0.00" } } } }] }
已排除的可能原因
- 重复使用旧
orderId:每次测试都创建全新订单 - 我方CSP配置问题:已添加所有必要的PayPal域名
- 浏览器兼容性问题:在Firefox和Chromium中均复现
- 沙盒账户异常:测试2个不同个人账户结果一致
请求帮助
目前判断这是PayPal沙盒环境的服务器配置错误,c.paypal.com的CORS策略未允许沙盒域名请求。恳请提供解决方案,或修复c.paypal.com的沙盒环境CORS配置。
内容的提问来源于stack exchange,提问作者mareb
相关产品推荐
相关产品推荐

