Sylius: добавление нового Payum Gateway (Rabobank Omnikassa)

Я просмотрел много сообщений, но нигде не нашел решения своего вопроса. В Интернете не найти ни одного места, где объясняется, как правильно добавить новый платежный шлюз в комплект Sylius Payum.

Я использую последнюю версию sylius 0.10.* и хочу добавить новый платежный шлюз (Rabobank Omnikassa, конечная точка оплаты в Нидерландах).

Есть некоторая информация о том, как добавить PaymentFactory для PayumPayumBundle, однако структура папок этого пакета совсем не похожа на SyliusPayumBundle. Я создал свой собственный Acme\Bundle\PayumBundle, который переопределяет SyliusPayumBundle.

Я хотел бы настроить его аналогично PaypalExpressCheckoutPaymentFactory.

конфиг/payum.yml

Здесь я просто проверяю несколько вещей, чтобы заставить Силиуса найти мои вещи.

payum:
    contexts:
        rabobank:
            storages:
                Sylius\Component\Core\Model\Order:
                    doctrine:
                        driver: orm
                Sylius\Component\Core\Model\Payment:
                    doctrine:
                        driver: orm

            custom:
                actions:
                    - Shopfish\Bundle\PayumBundle\Payum\Rabobank\Action\CapturePaymentAction
                    - Shopfish\Bundle\PayumBundle\Payum\Rabobank\Action\NotifyOrderAction

конфиг/services.xml

Я не уверен, какие служебные теги использовать, где ..

<parameters>
    <parameter key="shopfish.payum.rabobank.action.capture_payment.class">Shopfish\Bundle\PayumBundle\Payum\Rabobank\Action\CapturePaymentAction</parameter>
    <parameter key="shopfish.payum.rabobank.action.notify_order.class">Shopfish\Bundle\PayumBundle\Payum\Rabobank\Action\NotifyOrderAction</parameter>
    <parameter key="shopfish.payum.rabobank.action.payment_status.class">Shopfish\Bundle\PayumBundle\Payum\Rabobank\Action\PaymentStatusAction</parameter>
</parameters>

<services>
    <!-- Rabobank Omnikassa -->
    <service id="shopfish.payum.rabobank.action.capture_payment" class="%shopfish.payum.rabobank.action.capture_payment.class%" public="false">
        <tag name="payum.action" factory="omnipay" />
    </service>

    <service id="shopfish.payum.rabobank.action.notify_order" class="%shopfish.payum.rabobank.action.notify_order.class%" public="false">
        <argument type="service" id="event_dispatcher" />
        <argument type="service" id="sylius.manager.payment" />
        <argument type="service" id="finite.factory" />

        <tag name="payum.action" factory="paypal_express_checkout_nvp" />
    </service>
</services>

конфиг/config.yml

И конечно я прописываю шлюз в файле config.yml

sylius_payment:
    gateways:
        rabobank: Rabobank Omnikassa

Исключение: неверная конфигурация пути

Кажется, он не распознает Rabobank как допустимый тип. Где зарегистрировать новый тип?

InvalidConfigurationException: Invalid configuration for path "payum.contexts.rabobank.omnipay": Given type Rabobank is not supported. These types AuthorizeNet_AIM, AuthorizeNet_SIM, Buckaroo, CardSave, Dummy, Eway_Rapid, GoCardless, Manual, Migs_ThreeParty, Migs_TwoParty, Mollie, MultiSafepay, Netaxept, NetBanx, PayFast, Payflow_Pro, PaymentExpress_PxPay, PaymentExpress_PxPost, PayPal_Express, PayPal_Pro, Pin, SagePay_Direct, SagePay_Server, SecurePay_DirectPost, Stripe, TargetPay_Directebanking, TargetPay_Ideal, TargetPay_Mrcash, TwoCheckout, WorldPay are supported.

Регистрация платежной фабрики

В этом файле вы можете увидеть, как они регистрируют фабрики. в Паюме. Я хотел бы сделать то же самое в Sylius из своего собственного Bundle.

Какие хорошие шаги можно предпринять отсюда?


person Mirage    schedule 02.06.2014    source источник


Ответы (1)


Есть два способа добавить собственное платежное решение в Payum\Sylius.

  • Самый быстрый — использовать custom factory. Это то, что вы сделали, но вам нужно добавить услуги в раздел actions, а не классы. Тег payum.action можно использовать с таким подходом, как <tag name="payum.action" context="rabobank" />. Я не использовал фабрику custom в теге, потому что в этом случае действия будут добавлены во все контексты, созданные пользовательской фабрикой. Это не то, чего мы хотим.

  • Второй способ — создать платежную фабрику. Для этого вам нужно внедрить PaymentFactoryInterface и зарегистрировать его в расширении Payum. Вы должны выбрать это, если вам нужно настроить некоторые параметры, прежде чем вы сможете создать платеж. Тег payum.action можно использовать с таким подходом, как <tag name="payum.action" context="rabobank" /> или <tag name="payum.action" factory="rabobank" />. Разница в том, что первый тег добавляет действие только к одному контексту, а второй добавляет действие ко всем контекстам, созданным фабрикой.

Некоторые общие предложения:

Есть некоторая информация о том, как добавить PaymentFactory для PayumBundle, однако структура папок этого пакета совсем не похожа на SyliusPayumBundle.

Так не должно быть. SyliusPayumBundle — это тонкий слой интеграции между Sylius и PayumBundle.

Я создал свой собственный Acme\Bundle\PayumBundle, который переопределяет SyliusPayumBundle.

Вам не нужно этого делать, все должно работать нормально и без этого.

Я не уверен, какие служебные теги использовать, где ..

Если вы выбрали кастомную фабрику, вам не нужны теги, правильно настройте раздел actions.

InvalidConfigurationException: Недопустимая конфигурация для пути «payum.contexts.rabobank.omnipay»:

Вы уверены, что выложили правильные конфиги? Я считаю, что вы не можете получить это исключение с тем, что вы опубликовали. Я ожидаю другого исключения с другим сообщением.

И конечно я прописываю шлюз в файле config.yml

Вы также должны поместить некоторые данные в свою таблицу payment_gateway (если я правильно помню название таблицы).

В этом файле вы можете увидеть, как они регистрируют фабрики в Payum. Я хотел бы сделать то же самое в Sylius из своего собственного Bundle.

Просто сделайте то же самое в методе сборки вашего пакета.

person Maksim Kotlyar    schedule 02.06.2014
comment
Максим, спасибо за развернутый ответ. Однако, прежде чем я смогу принять это, у меня осталось несколько неопределенностей. Я зарегистрировал свой PaymentFactory, и Sylius правильно нашел мой CapturePaymentAction. Однако мне нужно перенаправить пользователя на веб-сайт платежного шлюза Rabobank с информацией о платеже. Я видел пример на сайте Payum с PaymentController с prepareXXXPaymentAction(), в котором пользователь, кажется, перенаправляется. Я еще не нашел способа включить это в Sylius, видя, как он использует метод PurchaseStep:display. Твои мысли? - person Mirage; 03.06.2014
comment
Я все еще не уверен, называется ли CapturePaymentAction до или после фактического выполнения платежа на веб-сайте Rabobank Omnikassa. - person Mirage; 03.06.2014
comment
Итак, reportUrl, по которому Rabobank будет публиковать свои обновления, тоже должен быть Capture? Или это другой адрес? Я могу себе представить, что это payum_notify_do, просто нужно выяснить, как отображать этот URL-адрес из действия. - person Mirage; 04.06.2014
comment
Я не знаком с Rabobank, чтобы ответить на ваш комментарий, я использовал этот doc. Возвращаемый URL-адрес должен быть таким же, как у захвата (вы должны вернуться, чтобы захватить действие с обновленными данными). URL-адрес отчета — это своего рода IPN PayPal, используемый для автоматических отчетов. Найдите NotifyAction в Sylius, чтобы узнать, как его реализовать. - person Maksim Kotlyar; 04.06.2014
comment
Сладкий, спасибо! Глядя на NVP Paypal CaptureAction, я вижу, что он выполняет кучу запросов на $this->payment, таких как DoExpressCheckoutPaymentRequest, как этот запрос связан с его действием? Все запросы пустые, что меня немного смущает. - person Mirage; 04.06.2014
comment
Например, $this->payment->execute(new SyncRequest($model));, я понятия не имею, что здесь происходит, потому что отслеживая SyncRequest, это просто пустой класс, который расширяет BaseModelRequest, как и все другие запросы. - person Mirage; 04.06.2014
comment
Обновление: кажется, я разобрался с пустыми запросами, они просто используются для функции Action::supports, верно? Подобно $request instanceof SetExpressCheckoutRequest, кроме того, что для запроса нет другого применения, кроме определения параметра в конструкторе. Единственное, в чем я до сих пор не понимаю, так это в назначении и функционировании запроса SyncRequest. - person Mirage; 04.06.2014
comment
платеж содержит все действия и спрашивает каждое по одному Поддерживаете ли вы такой запрос?, Для этого он использует метод действия-›поддержки. Допустим, одно действие говорит «Да, я поддерживаю метод выполнения платежного вызова» и передаю ему запрос. Прочитайте это, чтобы лучше понять философию Payum: payum.forma-dev.com/ документация/0.8/Ядро/архитектура - person Maksim Kotlyar; 04.06.2014
comment
› назначение и функционирование запроса SyncRequest на получение данных со стороны платежей и обновление локальной модели - person Maksim Kotlyar; 04.06.2014
comment
Давайте продолжим это обсуждение в чате. - person Mirage; 04.06.2014