Symfony路由和混合内容错误

时间:2017-10-24 11:21:16

标签: symfony sylius omnipay payum

嗨,所以当我在Symfony / Sylius应用程序的结帐页面上显示卡片详细信息表单时,我收到混合内容错误。我正在使用payum w / omnipay bridge做一个圣人支付结账。

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

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

路由反过来执行一些代码来获取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显示内容。这个bug很奇怪的原因是因为如果我强制路由到https(你可以看到我已经从评论中尝试过),它会返回“Too Many Redirects”并崩溃页面(尽管它确实显示在iFrame中) )。我认为这是因为它首先尝试http然后尝试https,因为只有在这样做时才能捕获付款。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

更新

正确的解决方案应该是使用强制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操作网址的付款表格。

我通过使用配置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:// ...

它可以工作,但是有人知道更好的解决方案吗?