Маршрутизация Symfony и ошибки смешанного содержимого

Привет, поэтому я получаю смешанные ошибки содержимого при попытке отобразить форму сведений о карте на моей странице оформления заказа в моем приложении Symfony/Sylius. Я использую payum w/omnipay bridge для оплаты sage pay.

Причина, по которой я получаю ошибку смешанного содержимого, заключается в том, что я отправляю форму на своей родительской странице, которая отправляет токен по следующему маршруту:

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 заблокирован от отображения содержимого из-за ошибки смешанного содержимого. Причина, по которой эта ошибка такая странная, заключается в том, что если я принудительно назначу маршрут на https (как вы можете видеть, я пробовал из комментария), он возвращается с сообщением «Слишком много перенаправлений» и приводит к сбою страницы (хотя он отображается в iFrame). ). Я думаю, это потому, что сначала он пытается использовать http, а затем https, и поскольку платеж может быть захвачен только после того, как он станет недействительным.

Любая помощь будет принята с благодарностью.


person UUake Up    schedule 24.10.2017    source источник
comment
Это не похоже ни на ошибку Payum, ни на ошибку Syilus, должно быть что-то не так с настройками безопасности Symfony.   -  person Maksim Kotlyar    schedule 25.10.2017
comment
Я попытался обновить настройки безопасности следующим образом: `платеж: шаблон: ^/payment.* методы: [GET] анонимный: ~ `И `- {путь: ^/платеж.*, роли: [ROLE_USER], require_channel: https} ` к моему контролю доступа, без костей...   -  person UUake Up    schedule 25.10.2017
comment
У меня точно такая же проблема. Кто-нибудь нашел решение?   -  person Kim    schedule 24.08.2019


Ответы (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 выполняла бесконечные перенаправления, заключалась в том, что у меня был Ingress-Nginx перед приложением, которое обрабатывало и завершало https. Таким образом, приложение Symfony на самом деле никогда не думало, что оно было достигнуто через https, отсюда и перенаправления.

Для этого мне пришлось обновить nginx, который вызывает php_fpm, используя следующий параметр:

fastcgi_param HTTPS on;

Если вы используете Kubernetes Ingress и хотите на самом деле передать https к своему сервису, вы можете проверить:

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

Теперь payum и gateway работают, генерируя корректные маршруты https.

СТАРЫЙ ОТВЕТ:

Это мой старый ответ, который в конце концов не сработал полностью, я оставляю его для расследования.

Проблема, вероятно, вызвана используемым вами платежным шлюзом, у меня была такая же проблема с nfq-eta/ payum-braintree.

Проблема заключалась в том, что файл https://github.com/nfq-eta/payum-braintree/blob/037fb302d63e1bfd733ecc86afc3ec869adb8f2b/src/Resources/views/Action/obtain_payment_method_nonce.html.twig содержит платежную форму с URL-адресом действия 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 %}

Я полностью удалил аргумент действия из формы, чтобы он просто использовал текущий. В моем случае https://...

Это работает, но кто-нибудь знает лучшее решение?

person Kim    schedule 24.08.2019