嗨,所以当我在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,因为只有在这样做时才能捕获付款。
非常感谢任何帮助。
答案 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:// ...
它可以工作,但是有人知道更好的解决方案吗?