Symfony 路由和混合内容错误

Symfony Routing and Mixed Content Errors

您好,当我尝试在我的 Symfony/Sylius 应用程序的结帐页面上显示银行卡详细信息表单时,我收到了混合内容错误。我正在使用带 omnipay 桥的 payum 进行明智的支付结账。

我收到混合内容错误的原因是我在我的父页面上提交了一个表单,该表单向以下路由发送了一个令牌:

payum_capture_do:
    path: /payment/capture/{payum_token}
    defaults: { _controller: sylius.controller.payum.capture:doAction }
    # schemes:  [https]

route 依次执行一些代码来获取 iFrame src。然后将响应送入 iFrame src。这实际上都是通过 JS 将表单直接提交到 iFrame 来完成的:

 let form = jQuery("form[name='sylius_checkout_complete']");

 if (form.length) {
     form.attr('target', 'card-details');
     form.submit();
 }

然后问题就出现了,因为 payum 路由不是 https 路由,因此由于混合内容错误,iFrame 被阻止显示内容。这个错误如此奇怪的原因是因为如果我强制路由到 https(正如你从评论中看到的那样),它 returns 和 "Too Many Redirects" 并使页面崩溃(尽管它确实如此)显示在 iFrame 中)。我认为这是因为它首先尝试 http,然后尝试 https,因为付款只能在这样做无效后才能被捕获。

如有任何帮助,我们将不胜感激。

更新

正确的解决方案应该是通过强制 https 覆盖路由定义,我这样做了:

payum_all:
    resource: "@PayumBundle/Resources/config/routing/all.xml"

payum_capture_do:
    path: /payment/capture/{payum_token}
    controller: PayumBundle:Capture:do
    schemes: [https]

Symfony 无休止重定向的问题是我在处理和终止 https 的应用程序前面有一个 Ingress-Nginx。所以 Symfony 应用程序实际上从未想过它是通过 https 到达的,因此重定向。

为此,我必须使用以下参数更新调用 php_fpm 的 nginx:

fastcgi_param HTTPS on;

如果你使用 Kubernetes Ingress 并且你想实际将 https 传递给你的服务,你可以查看:

nginx.ingress.kubernetes.io/ssl-passthrough: "true"

现在 payum 和网关通过生成正确的 https 路由来工作。

旧答案:

这是我的旧答案,最后没有完全起作用,我留下来研究。

这个问题可能是由你使用的payum网关引起的,我和nfq-eta/payum-braintree有同样的问题。

问题是文件 https://github.com/nfq-eta/payum-braintree/blob/037fb302d63e1bfd733ecc86afc3ec869adb8f2b/src/Resources/views/Action/obtain_payment_method_nonce.html.twig 包含带有 http 操作的付款表单 url。

我通过使用配置 payum.yaml

覆盖模板解决了这个问题
gateways:
    offline:
        factory: offline
    braintree:
        factory: braintree
        payum.template.obtain_payment_method_nonce: 'Payment/payum_obtain_payment_method_nonce.html.twig'

然后我在 templates/payum_obtain_payment_method_nonce.html.twig:

创建了我的模板
{% extends "@PayumBraintree/Action/obtain_payment_method_nonce.html.twig" %}

{% block braintree_payment_form %}
    <form method="POST" id="form">
        <div id="dropin-container"></div>
        <input type="hidden" name="payment_method_nonce" id="payment_method_nonce" value="" />
        <input type="submit" value="Submit payment" id="submit_btn" />
    </form>
{% endblock %}

我从表单中完全删除了 action 参数,因此它只使用当前参数。在我的例子中是 https://...

它有效,但有人知道更好的解决方案吗?