2016-08-16 7 views
3

Я реализовал шлюз Omnipay, который теперь я хотел бы использовать в Sylius, который использует payum 1.3, payum-bundle 1.0 и omnipay-bridge 1.0.Использование шлюза Omnipay в Силиусе с Payum + OmnipayBridge

Я настроил шлюз (это перенаправлять тот, который показывает отдельную страницу оплаты и, как только оплата будет завершена, не будет вызывать returnUrl, и нет кредитных карт, участвующих) в app/config/config.yml:

payum: 
    gateways: 
     my_gateway: 
      omnipay_offsite: 
       type: MyOmnipayGateway 
       options: 
        gatewayOption: 1 
        anotherOption: 2 
       actions: 
        - sylius.payum.my_gateway.action.convert_payment 

и I добавил шлюз sylius_payment секции, а

sylius_payment: 
    gateways: 
     my_gateway: My Payment Service 

я добавил действие для преобразования платежа в vendor/sylius/sylius/src/Sylius/Bundle/PayumBundle/Resources/config/services.xml:

<service id="sylius.payum.my_gateway.action.convert_payment" class="Sylius\Bundle\PayumBundle\Action\ConvertPaymentToMyGatewayAction"> 
    <tag name="payum.action" context="my_gateway" /> 
</service> 

и внедрил класс ConvertPaymentToMyGatewayAction, который теперь преобразует полезную нагрузку запроса в ожидаемый формат (в качестве ссылки используется ConvertPaymentToPaypalExpressAction).

Я также добавил MyOmnipayGateway в список шлюзов в vendor/omnipay/common/composer.json, чтобы пройти мимо ошибки, которая говорит, что шлюз не поддерживается.

Теперь, когда я завершаю заказ, я успешно перенаправлен на мой фактический сайт оплаты, и как только платеж завершен, возвращается в предоставленный returnUrl с ожидаемыми параметрами в строке запроса. Однако здесь выполнение возвращается к OffsiteCaptureAction и вызывает purchase с теми же параметрами, что и вызванный звонок, и я снова и снова перенаправляюсь на сайт оплаты.

Актуальные вопросы:

  1. Как избежать добавления опций конфигурации в vendor папку - а именно упомянутой services.xml и OmniPay-х composer.json?

  2. Где обращаться с ответом об оплате? Мне нужно проверить параметры строки запроса returnUrl (реализовано в моем шлюзе completePurchase).

Спасибо!

Edit: я пропустил инициализацию $details в моем новообращенном действии с $details = $payment->getDetails(); который вызвавшего _completeCaptureRequired ложным каждый раз, и, таким образом, purchase был выполнен в виде петли. Теперь я могу правильно обрабатывать платеж, т.е. Вопрос 2 в значительной степени решена с помощью данной конфигурации, и этот обработчик

<?php 
namespace Sylius\Bundle\PayumBundle\Action; 

use Payum\Core\Action\ActionInterface; 
use Payum\Core\Exception\RequestNotSupportedException; 
use Payum\Core\Request\Convert; 
use Sylius\Component\Core\Model\PaymentInterface; 

class ConvertPaymentToMyGatewayAction implements ActionInterface 
{ 
    public function execute($request) 
    { 
     RequestNotSupportedException::assertSupports($this, $request); 

     /** @var PaymentInterface $payment */ 
     $payment = $request->getSource(); 
     $order = $payment->getOrder(); 

     $details = $payment->getDetails(); 

     // Fill the correct parameters here 

     $request->setResult($details); 
    } 

    public function supports($request) 
    { 
     return 
      $request instanceof Convert && 
      $request->getSource() instanceof PaymentInterface && 
      $request->getTo() === 'array' 
     ; 
    } 
} 
+0

по этой ссылке, что говорить об интеграции Payum https://github.com/Sylius/Sylius/issues/5715 – sprik

+0

Спасибо за удобный справочник, я теперь я хочу добавить дополнительный шлюз оплаты на мой сайт. Это поможет. Есть ли вероятность, что вы можете загрузить весь код в репозиторий git или в sylius? – Brett

+1

@Brett Это почти весь код (очевидно, возврат не называется Payum), так как мы сначала написали Omnipay-шлюз. Но в любом случае код здесь https://github.com/vesse/SyliusPayumCheckoutFiBundle – vesse

ответ

0

Чтобы ответить на вопрос: 1. Вы можете добавить свой собственный сервис для вашего приложения конфигурации или ваш собственный пакет. Мне нравится вкладывать его в свой собственный пакет, а затем, обновляя sylius, он не будет затронут.

<service id="sylius.payum.my_gateway.action.convert_payment" class="Sylius\Bundle\PayumBundle\Action\ConvertPaymentToMyGatewayAction"> 
    <tag name="payum.action" context="my_gateway" /> 
</service> 

Просто конвертировать, что YML

sylius.payum.my_gateway.action.convert_payment: 
    class: Sylius\Bundle\PayumBundle\Action\ConvertPaymentToMyGatewayAction 
    tags: 
     - { name: payum.action, context: my_gateway }