React,在表单中加载脚本(mercadopago)

Posted

技术标签:

【中文标题】React,在表单中加载脚本(mercadopago)【英文标题】:React, loading a script inside a form (mercadopago) 【发布时间】:2020-12-05 19:56:02 【问题描述】:

我正在尝试实施一些支付系统 (MercadoPago)。

根据文档,它只是粘贴这个:

<form method="POST">
  <script
    src="https://www.mercadopago.com.pe/integrations/v1/web-payment-checkout.js"
    data-preference-id="589788715-2e52aeec-8275-487c-88ee-1a08cff37c08"
  ></script>
</form>

将其粘贴到纯 html 文件中可以正常工作:出现一个按钮并单击它会打开一个模式,以便按预期使用信用卡付款。但是,这在 React 中不起作用,因为它是动态加载脚本的。因此,我尝试使用效果挂钩在加载时插入&lt;script&gt;

const App = () => 
  const setMercadoPagoPreferences = async () => 
    const script = document.createElement('script');
    script.src =
      'https://www.mercadopago.com.ar/integrations/v1/web-payment-checkout.js';
    script.async = true; // commenting or uncommenting seems to have no effect
    script.setAttribute(
      'data-preference-id',
      '589788715-2e52aeec-8275-487c-88ee-1a08cff37c08'
    );
    document.getElementById('mercadoForm').appendChild(script);
  ;

  useEffect(() => 
    setMercadoPagoPreferences();
  , []);

  return <form action='/procesar-pago' method='POST' id='mercadoForm' />;
;

这似乎正确加载了脚本,因为支付按钮被附加到页面上。但是,单击它会打开一个模式,上面写着“哦,不,发生了不好的事情”。这不会发生在我上面的 .html 示例中;所以这一定是因为 React 如何加载脚本或类似的东西。它不适用于开发版或生产版。

编辑:按照建议,我尝试使用 refs 而不是直接附加子级,但这似乎没有任何影响,它仍然不起作用。

【问题讨论】:

【参考方案1】:

我不知道这个框架,但也许就是这样:看起来这家伙有类似的问题right here。

我认为有问题,因为脚本没有按时加载。所以也许让我们试试这个:

script.onload = () => 
  document.getElementById('mercadoForm').appendChild(script);
;

此外,react ref 中有内置机制,例如 HERE 而不是 document.getElementById

【讨论】:

另一个人确实有类似的问题,但它是不同的,因为他的脚本根本没有加载,我的是(当一个按钮出现时),只是不正确(因为点击它会弹出一个错误) .此外,script.onload 运行 脚本已附加到文档之后,因此您的建议不起作用。【参考方案2】:

如果不是mercadolibre,你的技术可能会奏效。 显然,mercadolibre 不允许使用您尝试加载的页面。这就像你试图在 Iframe 中加载 mercadolibre,他们可能使用 CSP header 阻止了它。具体来说,他们将 Content-Security-Policy 标记设置为 frame-ancestors 'self'。这是一个安全限制标准,不允许在元素 Iframe 中使用来自该域的页面。

【讨论】:

那么有没有办法克服呢?也许是一些 hacky 的东西。 还有一些其他方法可以绕过 CSP 标头的解释,但我想您正在构建一个一般用途的网站。我建议您关注 mercadolibre 文档,了解如何集成他们的插件。 他们的文档假设我使用的是纯 html 文件,但我想将它集成到我的 SPA 中做出反应。他们的文档也没有提到任何 CSP 标头。

以上是关于React,在表单中加载脚本(mercadopago)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Webpack 在 React 中加载图像

如何在 React 测试中加载 Stripe?

确定子表单/子报表是不是在 MS Access 中加载了表单或报表

无法在其他类组件中加载 React 类组件

在React中加载登录首页

在 React Native WebView 中加载捆绑的静态资产