Интеграция с Symfony2.8 Payum Bundle

Я использую PayumBundle для интеграции PayPal на моем сайте. Я настроил пакет, как описано в https://github.com/Payum/PayumBundle/blob/master/Resources/doc/get_it_started.md

и установил расширение PayPal Express Checkout nvp для payum.

Это мой контроллер:

            $gatewayName = 'paypal-express-checkout-nvp';

            $storage = $this->get('payum')->getStorage(PaymentDetails::class);

            $details = $storage->create();
            $details['PAYMENTREQUEST_0_CURRENCYCODE'] = 'CHF';
            $details['PAYMENTREQUEST_0_AMT'] = $amount;
            $storage->update($details);

            $captureToken = $this->get('payum')->getTokenFactory()->createCaptureToken(
                $gatewayName, $details, 'payment_done'
            );

            return $this->redirect($captureToken->getTargetUrl());

Вот файл конфигурации:

payum:
  security:
    token_storage:
        MyBundle\Entity\PaymentToken: { doctrine: orm }

  storages:
    MyBundle\Entity\PaymentDetails: { doctrine: orm }

  gateways:
    paypal-express-checkout-nvp:
        factory: paypal_express_checkout
        username:  %paypal_user%
        password:  %paypal_password%
        signature: %paypal_signature%
        sandbox: true

Однако, когда я отправляю форму, я получаю следующую ошибку"

 Catchable Fatal Error: Argument 3 passed to Payum\Paypal\ExpressCheckout\Nvp\Api::__construct() must be an instance of Http\Message\MessageFactory, null given, called in vendor/payum/paypal-express-checkout-nvp/Payum/Paypal/ExpressCheckout/Nvp/PaypalExpressCheckoutGatewayFactory.php on line 89 and defined in vendor/payum/paypal-express-checkout-nvp/Payum/Paypal/ExpressCheckout/Nvp/Api.php at 317

Я взглянул на класс PaypalExpressCheckoutGatewayFactory, где конфигурация передается внутри функции populateConfig в строке 89,

 return new Api($paypalConfig, $config['payum.http_client'], $config['httplug.message_factory']);

ключ 'httplug.message_factory' нигде не определен?

ТРАССИРОВКИ СТЕКА:

 0 vendor/payum/paypal-express-checkout-nvp/Payum/Paypal/ExpressCheckout/Nvp/Api.php(317): Symfony\Component\Debug\ErrorHandler->handleError(4096, 'Argument 3 pass...', '...', 317, Array)
 1 vendor/payum/paypal-express-checkout-nvp/Payum/Paypal/ExpressCheckout/Nvp/PaypalExpressCheckoutGatewayFactory.php(89): Payum\Paypal\ExpressCheckout\Nvp\Api->__construct(Array, Object(Payum\Core\Bridge\Guzzle\HttpClient), NULL)
 2 [internal function]: Payum\Paypal\ExpressCheckout\Nvp\PaypalExpressCheckoutGatewayFactory->Payum\Paypal\ExpressCheckout\Nvp\{closure}(Object(Payum\Core\Bridge\Spl\ArrayObject))
 3 vendor/payum/core/Payum/Core/CoreGatewayFactory.php(123): call_user_func(Object(Closure), Object(Payum\Core\Bridge\Spl\ArrayObject))
 4 vendor/payum/core/Payum/Core/Bridge/Symfony/ContainerAwareCoreGatewayFactory.php(35): Payum\Core\CoreGatewayFactory->buildClosures(Object(Payum\Core\Bridge\Spl\ArrayObject))
 5 vendor/payum/core/Payum/Core/CoreGatewayFactory.php(40): Payum\Core\Bridge\Symfony\ContainerAwareCoreGatewayFactory->buildClosures(Object(Payum\Core\Bridge\Spl\ArrayObject))
 6 vendor/payum/core/Payum/Core/GatewayFactory.php(33): Payum\Core\CoreGatewayFactory->create(Array)
 7 vendor/payum/core/Payum/Core/PayumBuilder.php(422): Payum\Core\GatewayFactory->create(Array)
 8 app/cache/dev/appDevDebugProjectContainer.php(2209): Payum\Core\PayumBuilder->getPayum()
 9 vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php(316): appDevDebugProjectContainer->getPayumService()
 10 vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php(391): Symfony\Component\DependencyInjection\Container->get('payum')
 11 src/zenpme/BusinessBundle/Controller/PaymentController.php(74): Symfony\Bundle\FrameworkBundle\Controller\Controller->get('payum')
 12 [internal function]: BusinessBundle\Controller\PaymentController->indexAction(Object(Symfony\Component\HttpFoundation\Request))
 13 vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php(139): call_user_func_array(Array, Array)
 14 vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php(62): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
 15 vendor/symfony/symfony/src/Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.php(69): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
 16 vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php(185): Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
 17 web/app_dev.php(30): Symfony\Component\HttpKernel\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request))
 18 {main}

person Tejas Gosai    schedule 01.04.2016    source источник
comment
Вы можете добавить трассировку стека исключений к вопросу?   -  person Paweł Mikołajczuk    schedule 01.04.2016
comment
Я добавил трассировку стека. :)   -  person Tejas Gosai    schedule 04.04.2016
comment
Та же проблема с Symfony 3   -  person codeneuss    schedule 06.04.2016


Ответы (2)


Убедитесь, что у вас payum/core не ниже 1.3 версии.

person Paweł Mikołajczuk    schedule 01.04.2016
comment
Я установил httplug-bundle, guzzle-adapter. Включены классы httplug в config.yml. Все еще с той же ошибкой. - person Tejas Gosai; 01.04.2016
comment
вы уверены, что у вас payum/core в версии ›= 1.3? - person Paweł Mikołajczuk; 01.04.2016
comment
Да. Обновлен payum/core до 1.3.0 - person Tejas Gosai; 01.04.2016
comment
Вам также необходимо установить php-http/guzzle6-adapter - person Paweł Mikołajczuk; 01.04.2016
comment
Да, я установил guzzle6-адаптер, httplug-bundle. - person Tejas Gosai; 01.04.2016

У меня такая же проблема в Symfony3. Чтобы обойти это, добавьте ключ массива => значение:

httplug.message_factory' => new GuzzleMessageFactory()

в массиве конфигурации PaypalExpressCheckoutGatewayFactory. Я постараюсь найти лучшее решение и обновить сообщение позже.

Вы также должны добавить этот оператор использования:

use Http\Message\MessageFactory\GuzzleMessageFactory;

РЕДАКТИРОВАТЬ Я, наконец, заставил его работать без изменения библиотек, но я на самом деле не знаю, как это сделать. Я установил приложение на свой сервер и установил php composer.phar -o, и оно работает.

Это мой composer.json:

 "require": {
        "php": ">=5.5.9",
        "symfony/symfony": "3.0.*",
        "doctrine/orm": "^2.5",
        "doctrine/doctrine-bundle": "^1.6",
        "doctrine/doctrine-cache-bundle": "^1.2",
        "symfony/swiftmailer-bundle": "^2.3",
        "symfony/monolog-bundle": "^2.8",
        "sensio/distribution-bundle": "^5.0",
        "sensio/framework-extra-bundle": "^3.0.2",
        "incenteev/composer-parameter-handler": "^2.0",
        "beberlei/DoctrineExtensions": "^1.0",
        "payum/payum-bundle": "^2.0",
        "payum/paypal-express-checkout-nvp": "^1.3"
    },
person codeneuss    schedule 06.04.2016
comment
я нигде не могу найти класс GuzzleMessageFactory. Должен ли я установить для него какую-либо библиотеку? Это мой текущий composer.json payum/payum-bundle: ^2.0, payum/paypal-express-checkout-nvp: ^1.3, php-http/guzzle6-adapter: ^1.0 - person Tejas Gosai; 07.04.2016
comment
Ну, я сдаюсь. Я использую PHP API Paypal в своем приложении. Однако я держу этот вопрос открытым. Если вы найдете ответ, пожалуйста, опубликуйте его, чтобы кто-то другой мог получить решение, если он застрял в той же ошибке. - person Tejas Gosai; 07.04.2016
comment
Мой Composer.json выглядит так: payum/payum-bundle:^2.0, payum/paypal-express-checkout-nvp:^1.3 и больше ничего (кроме стандартного symfony). - person codeneuss; 11.04.2016