【问题标题】:Symfony Routing and Mixed Content ErrorsSymfony 路由和混合内容错误
【发布时间】:2018-04-05 04:11:57
【问题描述】:

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

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

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(正如您从评论中看到的那样),它会返回“重定向过多”并使页面崩溃(尽管它确实显示在 iFrame )。我认为这是因为它首先尝试 http 然后 https 并且因为付款只能在这样做变得无效时才能被捕获。

任何帮助将不胜感激。

【问题讨论】:

  • 它看起来既不像 Payum 也不像 Sylus 错误,一定是 Symfony 安全设置有问题。
  • 我尝试过像这样更新安全设置:`支付:模式:^/payment.*方法:[GET]匿名:~`和`-{路径:^/payment.*,角色: [ROLE_USER], requires_channel: https }` 到我的访问控制,没有骰子...
  • 我遇到了完全相同的问题。有人找到解决方案了吗?

标签: symfony sylius omnipay payum


【解决方案1】:

更新

正确的解决方案应该是用强制 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 的付款表单。

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

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

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2012-11-26
    • 2016-04-16
    相关资源
    最近更新 更多