Ошибки маршрутизации и смешанного содержимого Symfony
Здравствуйте, я получаю смешанные ошибки содержимого при попытке отобразить форму сведений о карте на странице оформления заказа моего приложения Symfony/Sylius. Я использую Payum W / OmniPay Bridge, чтобы сделать проверку мудрой оплаты.
Причина, по которой я получаю ошибку смешанного содержимого, заключается в том, что я отправляю форму на родительской странице, которая отправляет токен по следующему маршруту:
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 (как вы можете видеть, я пытался из комментария), он вернется с "Too Many Redirects" и вылетит на страницу (хотя он отображается в iFrame.). Я думаю, что это потому, что сначала он пытается http, а затем https, и поскольку платеж может быть получен только один раз, он становится недействительным.
Любая помощь будет принята с благодарностью.
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 совершал бесконечные перенаправления, заключалась в том, что у меня был Ingress-Nginx перед приложением, которое обрабатывало и завершало https. Таким образом, приложение Symfony на самом деле никогда не думало, что оно было достигнуто через https, следовательно, перенаправления
Для этого мне пришлось обновить nginx, который вызывает php_fpm, используя следующий параметр:
fastcgi_param HTTPS on;
Если вы используете Kubernetes Ingress и хотите передать https на ваш сервис, вы можете проверить:
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
Теперь Payum и шлюз работают, генерируя правильные маршруты https.
СТАРЫЙ ОТВЕТ:
Это мой старый ответ, который в итоге не сработал, я оставляю его для расследования.
Возможно, проблема связана с используемым вами шлюзом payum, у меня была такая же проблема с https://github.com/nfq-eta/payum-braintree.
Проблема заключалась в том, что файл https://github.com/nfq-eta/payum-braintree/blob/037fb302d63e1bfd733ecc86afc3ec869adb8f2b/src/Resources/views/Action/obtain_payment_method_nonce.html.twig включен в форму оплаты с 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 %}
Я полностью удалил аргумент действия из формы, чтобы он просто использовал текущий. Который в моем случае это https: //...
Это работает, но кто-то знает лучшее решение?