[payum] Payum 1.0 upgrade

This commit is contained in:
Maksim Kotlyar 2015-10-01 14:28:43 +00:00
parent 091525df5a
commit 857e717283
37 changed files with 970 additions and 1655 deletions

View file

@ -0,0 +1,33 @@
<?php
namespace Sylius\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
/**
* Auto-generated Migration: Please modify to your needs!
*/
class Version20151028183600 extends AbstractMigration
{
/**
* @param Schema $schema
*/
public function up(Schema $schema)
{
$this->addSql("ALTER TABLE sylius_payment_security_token CHANGE payment_name gateway_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '';");
$this->addSql("ALTER TABLE sylius_payment_config CHANGE payment_name gateway_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '';");
$this->addSql('RENAME TABLE `sylius_payment_config` TO `sylius_gateway_config`;');
}
/**
* @param Schema $schema
*/
public function down(Schema $schema)
{
$this->addSql("ALTER TABLE payment_name gateway_name CHANGE sylius_payment_security_token VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '';");
$this->addSql("ALTER TABLE payment_name gateway_name CHANGE sylius_payment_config VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '';");
$this->addSql('RENAME TABLE `sylius_gateway_config` TO `sylius_payment_config`;');
}
}

View file

@ -48,9 +48,9 @@
"knplabs/knp-snappy-bundle": "~1.2",
"liip/imagine-bundle": "~1.0",
"omnipay/omnipay": "~2.3",
"payum/omnipay-bridge": "~0.14.0",
"payum/payum": "~0.14.0",
"payum/payum-bundle": "~0.14.2",
"payum/omnipay-bridge": "~1.0",
"payum/payum": "~1.0",
"payum/payum-bundle": "~1.0",
"sensio/distribution-bundle": "~2.3",
"stof/doctrine-extensions-bundle": "~1.1",
"swiftmailer/swiftmailer": "~5.0",

859
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -16,10 +16,9 @@ use Payum\Core\Security\GenericTokenFactoryInterface;
use Payum\Core\Security\HttpRequestVerifierInterface;
use Sylius\Bundle\CoreBundle\Event\PurchaseCompleteEvent;
use Sylius\Bundle\FlowBundle\Process\Context\ProcessContextInterface;
use Sylius\Bundle\PayumBundle\Payum\Request\GetStatus;
use Sylius\Bundle\PayumBundle\Request\GetStatus;
use Sylius\Component\Core\Model\PaymentInterface;
use Sylius\Component\Core\SyliusCheckoutEvents;
use Sylius\Component\Payment\PaymentTransitions;
use Symfony\Component\HttpFoundation\RedirectResponse;
class PurchaseStep extends CheckoutStep
@ -55,22 +54,15 @@ class PurchaseStep extends CheckoutStep
$this->getHttpRequestVerifier()->invalidate($token);
$status = new GetStatus($token);
$this->getPayum()->getPayment($token->getPaymentName())->execute($status);
$this->getPayum()->getGateway($token->getGatewayName())->execute($status);
/** @var $payment PaymentInterface */
$payment = $status->getFirstModel();
$order = $payment->getOrder();
// Should it be here??
$this->dispatchCheckoutEvent(SyliusCheckoutEvents::PURCHASE_INITIALIZE, $order);
$nextState = $status->getValue();
$stateMachine = $this->get('sm.factory')->get($payment, PaymentTransitions::GRAPH);
if (null !== $transition = $stateMachine->getTransitionToState($nextState)) {
$stateMachine->apply($transition);
}
$this->dispatchCheckoutEvent(SyliusCheckoutEvents::PURCHASE_PRE_COMPLETE, $order);
$this->getDoctrine()->getManager()->flush();

View file

@ -7,11 +7,11 @@ payum:
token_storage:
Sylius\Bundle\PayumBundle\Model\PaymentSecurityToken: { doctrine: orm }
dynamic_payments:
dynamic_gateways:
config_storage:
Sylius\Bundle\PayumBundle\Model\PaymentConfig: { doctrine: orm }
Sylius\Bundle\PayumBundle\Model\GatewayConfig: { doctrine: orm }
payments:
gateways:
paypal_express_checkout:
paypal_express_checkout_nvp:
username: %paypal.express_checkout.username%
@ -37,12 +37,4 @@ payum:
secret_key: %stripe.secret_key%
dummy:
custom:
actions:
- sylius.payum.dummy.action.capture_payment
- sylius.payum.dummy.action.payment_status
offline:
offline:
actions:
- sylius.payum.offline.action.capture_payment
offline: ~

View file

@ -12,21 +12,17 @@
namespace spec\Sylius\Bundle\CoreBundle\Checkout\Step;
use Doctrine\Common\Persistence\ObjectManager;
use Payum\Core\PaymentInterface;
use Payum\Core\GatewayInterface;
use Payum\Core\Registry\RegistryInterface;
use Payum\Core\Security\HttpRequestVerifierInterface;
use Payum\Core\Security\TokenInterface;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use SM\Factory\FactoryInterface;
use Sylius\Bundle\FlowBundle\Process\Context\ProcessContextInterface;
use Sylius\Component\Cart\Provider\CartProviderInterface;
use Sylius\Component\Core\Model\Order;
use Sylius\Component\Core\Model\Payment;
use Sylius\Component\Core\SyliusCheckoutEvents;
use Sylius\Component\Payment\PaymentTransitions;
use Sylius\Component\Payment\SyliusPaymentEvents;
use Sylius\Component\Resource\StateMachine\StateMachineInterface;
use Symfony\Bridge\Doctrine\RegistryInterface as DoctrinRegistryInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@ -46,19 +42,18 @@ class PurchaseStepSpec extends ObjectBehavior
Request $request,
CartProviderInterface $cartProvider,
RegistryInterface $payum,
PaymentInterface $payment,
GatewayInterface $gateway,
EventDispatcherInterface $eventDispatcher,
DoctrinRegistryInterface $doctrine,
ObjectManager $objectManager,
Session $session,
FlashBagInterface $flashBag,
TranslatorInterface $translator,
FactoryInterface $factory
TranslatorInterface $translator
) {
$session->getFlashBag()->willReturn($flashBag);
$doctrine->getManager()->willReturn($objectManager);
$token->getPaymentName()->willReturn('aPaymentName');
$payum->getPayment('aPaymentName')->willReturn($payment);
$token->getGatewayName()->willReturn('aGatewayName');
$payum->getGateway('aGatewayName')->willReturn($gateway);
$httpRequestVerifier->verify($request)->willReturn($token);
$httpRequestVerifier->invalidate($token)->willReturn(null);
@ -70,7 +65,6 @@ class PurchaseStepSpec extends ObjectBehavior
$container->get('doctrine')->willReturn($doctrine);
$container->has('doctrine')->willReturn(true);
$container->get('translator')->willReturn($translator);
$container->get('sm.factory')->willReturn($factory);
$this->setName('purchase');
@ -89,11 +83,9 @@ class PurchaseStepSpec extends ObjectBehavior
function it_must_dispatch_pre_and_post_payment_state_changed_if_state_changed(
Request $request,
$factory,
ProcessContextInterface $context,
PaymentInterface $payment,
EventDispatcherInterface $eventDispatcher,
StateMachineInterface $sm
GatewayInterface $gateway,
EventDispatcherInterface $eventDispatcher
) {
$context->getRequest()->willReturn($request);
@ -103,18 +95,14 @@ class PurchaseStepSpec extends ObjectBehavior
$paymentModel->setOrder($order);
$order->addPayment($paymentModel);
$payment
->execute(Argument::type('Sylius\Bundle\PayumBundle\Payum\Request\GetStatus'))
$gateway
->execute(Argument::type('Sylius\Bundle\PayumBundle\Request\GetStatus'))
->will(function ($args) use ($order, $paymentModel) {
$args[0]->markCaptured();
$args[0]->setModel($paymentModel);
}
);
$factory->get($paymentModel, PaymentTransitions::GRAPH)->willReturn($sm);
$sm->getTransitionToState('completed')->willReturn(PaymentTransitions::SYLIUS_COMPLETE);
$sm->apply(PaymentTransitions::SYLIUS_COMPLETE)->shouldBeCalled();
$eventDispatcher
->dispatch(
SyliusCheckoutEvents::PURCHASE_INITIALIZE,
@ -144,11 +132,9 @@ class PurchaseStepSpec extends ObjectBehavior
function it_must_not_dispatch_pre_and_post_payment_state_changed_if_state_not_changed(
Request $request,
$factory,
ProcessContextInterface $context,
PaymentInterface $payment,
EventDispatcherInterface $eventDispatcher,
StateMachineInterface $sm
GatewayInterface $gateway,
EventDispatcherInterface $eventDispatcher
) {
$context->getRequest()->willReturn($request);
@ -158,18 +144,14 @@ class PurchaseStepSpec extends ObjectBehavior
$paymentModel->setOrder($order);
$order->addPayment($paymentModel);
$payment
->execute(Argument::type('Sylius\Bundle\PayumBundle\Payum\Request\GetStatus'))
$gateway
->execute(Argument::type('Sylius\Bundle\PayumBundle\Request\GetStatus'))
->will(function ($args) use ($order, $paymentModel) {
$args[0]->markCaptured();
$args[0]->setModel($paymentModel);
}
);
$factory->get($paymentModel, PaymentTransitions::GRAPH)->willReturn($sm);
$sm->getTransitionToState('completed')->willReturn(null);
$sm->apply(PaymentTransitions::SYLIUS_COMPLETE)->shouldNotBeCalled();
$eventDispatcher
->dispatch(
SyliusCheckoutEvents::PURCHASE_INITIALIZE,

View file

@ -28,10 +28,10 @@ class LoadChannelData extends DataFixture
public function load(ObjectManager $manager)
{
$url = $this->container->getParameter('router.request_context.host');
$manager->persist($this->createChannel('WEB-UK', 'UK Webstore', $url, array('en_GB'), array('GBP'), array('Category', 'Brand'), array('DHL', 'UPS Ground'), array('Dummy', 'StripeCheckout')));
$manager->persist($this->createChannel('WEB-DE', 'Germany Webstore', null, array('de_DE'), array('EUR'), array('Category', 'Brand'), array('DHL', 'UPS Ground'), array('Dummy', 'StripeCheckout')));
$manager->persist($this->createChannel('WEB-US', 'United States Webstore', null, array('en_US'), array('USD'), array('Category', 'Brand'), array('FedEx', 'FedEx World Shipping'), array('Dummy', 'StripeCheckout')));
$manager->persist($this->createChannel('MOBILE', 'Mobile Store', null, array('en_GB', 'de_DE'), array('GBP', 'USD', 'EUR'), array('Category', 'Brand'), array('DHL', 'UPS Ground', 'FedEx'), array('Dummy', 'StripeCheckout')));
$manager->persist($this->createChannel('WEB-UK', 'UK Webstore', $url, array('en_GB'), array('GBP'), array('Category', 'Brand'), array('DHL', 'UPS Ground'), array('Offline', 'StripeCheckout')));
$manager->persist($this->createChannel('WEB-DE', 'Germany Webstore', null, array('de_DE'), array('EUR'), array('Category', 'Brand'), array('DHL', 'UPS Ground'), array('Offline', 'StripeCheckout')));
$manager->persist($this->createChannel('WEB-US', 'United States Webstore', null, array('en_US'), array('USD'), array('Category', 'Brand'), array('FedEx', 'FedEx World Shipping'), array('Offline', 'StripeCheckout')));
$manager->persist($this->createChannel('MOBILE', 'Mobile Store', null, array('en_GB', 'de_DE'), array('GBP', 'USD', 'EUR'), array('Category', 'Brand'), array('DHL', 'UPS Ground', 'FedEx'), array('Offline', 'StripeCheckout')));
$manager->flush();
}

View file

@ -32,7 +32,6 @@ class LoadPaymentMethodsData extends DataFixture
$manager->persist($this->createPaymentMethod('Be2bill', 'be2bill_direct', 'fixed', array('amount' => 100)));
$manager->persist($this->createPaymentMethod('Be2billOffsite', 'be2bill_offsite', 'percent', array('percent' => 7)));
$manager->persist($this->createPaymentMethod('StripeCheckout', 'stripe_checkout', 'percent', array('percent' => 5)));
$manager->persist($this->createPaymentMethod('Offline', 'offline', 'fixed', array('amount' => 500)));
$manager->flush();
}

View file

@ -0,0 +1,81 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Action;
use Payum\Core\Action\GatewayAwareAction;
use Payum\Core\Bridge\Spl\ArrayObject;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Model\Payment as PayumPayment;
use Payum\Core\Request\Capture;
use Payum\Core\Request\Convert;
use Sylius\Bundle\PayumBundle\Request\GetStatus;
use Sylius\Component\Core\Model\PaymentInterface as SyliusPaymentInterface;
class CapturePaymentAction extends GatewayAwareAction
{
/**
* {@inheritDoc}
*
* @param $request Capture
*/
public function execute($request)
{
RequestNotSupportedException::assertSupports($this, $request);
/** @var $payment SyliusPaymentInterface */
$payment = $request->getModel();
$order = $payment->getOrder();
$this->gateway->execute($status = new GetStatus($payment));
if ($status->isNew()) {
try {
$this->gateway->execute($convert = new Convert($payment, 'array', $request->getToken()));
$payment->setDetails($convert->getResult());
} catch (RequestNotSupportedException $e) {
$payumPayment = new PayumPayment();
$payumPayment->setNumber($order->getNumber());
$payumPayment->setTotalAmount($order->getTotal());
$payumPayment->setCurrencyCode($order->getCurrency());
$payumPayment->setClientEmail($order->getCustomer()->getEmail());
$payumPayment->setClientId($order->getCustomer()->getId());
$payumPayment->setDescription(sprintf(
'Payment contains %d items for a total of %01.2f',
$order->getItems()->count(), $order->getTotal() / 100
));
$payumPayment->setDetails($payment->getDetails());
$this->gateway->execute($convert = new Convert($payumPayment, 'array', $request->getToken()));
$payment->setDetails($convert->getResult());
}
}
$details = ArrayObject::ensureArrayObject($payment->getDetails());
try {
$request->setModel($details);
$this->gateway->execute($request);
} finally {
$payment->setDetails((array) $details);
}
}
/**
* {@inheritdoc}
*/
public function supports($request)
{
return
$request instanceof Capture &&
$request->getModel() instanceof SyliusPaymentInterface
;
}
}

View file

@ -9,32 +9,35 @@
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Be2bill\Action;
namespace Sylius\Bundle\PayumBundle\Action;
use Payum\Core\Action\GatewayAwareAction;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Convert;
use Payum\Core\Request\GetHttpRequest;
use Payum\Core\Security\TokenInterface;
use Sylius\Bundle\PayumBundle\Payum\Action\AbstractCapturePaymentAction;
use Sylius\Component\Payment\Model\PaymentInterface;
use Sylius\Component\Core\Model\PaymentInterface;
/**
* @author Alexandre Bacco <alexandre.bacco@gmail.com>
*/
class CapturePaymentUsingCreditCardAction extends AbstractCapturePaymentAction
class ConvertPaymentToBe2BillAction extends GatewayAwareAction
{
/**
* {@inheritDoc}
*
* @param Convert $request
*/
protected function composeDetails(PaymentInterface $payment, TokenInterface $token)
public function execute($request)
{
if ($payment->getDetails()) {
return;
}
$this->payment->execute($httpRequest = new GetHttpRequest());
RequestNotSupportedException::assertSupports($this, $request);
/** @var PaymentInterface $payment */
$payment = $request->getSource();
$order = $payment->getOrder();
$details = array();
$this->gateway->execute($httpRequest = new GetHttpRequest());
$details = [];
$details['AMOUNT'] = $order->getTotal();
$details['CLIENTEMAIL'] = $order->getCustomer()->getEmail();
$details['CLIENTUSERAGENT'] = $httpRequest->userAgent ?: 'Unknown';
@ -43,6 +46,18 @@ class CapturePaymentUsingCreditCardAction extends AbstractCapturePaymentAction
$details['DESCRIPTION'] = sprintf('Order containing %d items for a total of %01.2f', $order->getItems()->count(), $order->getTotal() / 100);
$details['ORDERID'] = $payment->getId();
$payment->setDetails($details);
$request->setResult($details);
}
/**
* {@inheritDoc}
*/
public function supports($request)
{
return
$request instanceof Convert &&
$request->getSource() instanceof PaymentInterface &&
$request->getTo() === 'array'
;
}
}

View file

@ -0,0 +1,50 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Action;
use Payum\Core\Action\ActionInterface;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Model\PaymentInterface;
use Payum\Core\Request\Convert;
use Payum\Offline\Constants;
/**
* @author Antonio Peric <antonio@locastic.com>
*/
class ConvertPaymentToOfflineAction implements ActionInterface
{
/**
* {@inheritDoc}
*
* @param Convert $request
*/
public function execute($request)
{
RequestNotSupportedException::assertSupports($this, $request);
$request->setResult([
Constants::FIELD_PAID => true,
]);
}
/**
* {@inheritDoc}
*/
public function supports($request)
{
return
$request instanceof Convert &&
$request->getSource() instanceof PaymentInterface &&
$request->getTo() === 'array'
;
}
}

View file

@ -9,25 +9,28 @@
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Paypal\Action;
namespace Sylius\Bundle\PayumBundle\Action;
use Payum\Core\Security\TokenInterface;
use Sylius\Bundle\PayumBundle\Payum\Action\AbstractCapturePaymentAction;
use Payum\Core\Action\ActionInterface;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Convert;
use Sylius\Component\Core\Model\AdjustmentInterface;
use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Payment\Model\PaymentInterface;
use Sylius\Component\Core\Model\PaymentInterface;
class CapturePaymentUsingExpressCheckoutAction extends AbstractCapturePaymentAction
class ConvertPaymentToPaypalExpressAction implements ActionInterface
{
/**
* {@inheritdoc}
* {@inheritDoc}
*
* @param Convert $request
*/
protected function composeDetails(PaymentInterface $payment, TokenInterface $token)
public function execute($request)
{
if ($payment->getDetails()) {
return;
}
RequestNotSupportedException::assertSupports($this, $request);
/** @var PaymentInterface $payment */
$payment = $request->getSource();
$order = $payment->getOrder();
$details = array();
@ -66,9 +69,26 @@ class CapturePaymentUsingExpressCheckoutAction extends AbstractCapturePaymentAct
$details['L_PAYMENTREQUEST_0_QTY'.$m] = 1;
}
$payment->setDetails($details);
$request->setResult($details);
}
/**
* {@inheritDoc}
*/
public function supports($request)
{
return
$request instanceof Convert &&
$request->getSource() instanceof PaymentInterface &&
$request->getTo() === 'array'
;
}
/**
* @param OrderInterface $order
*
* @return int
*/
private function calculateNonNeutralTaxTotal(OrderInterface $order)
{
$nonNeutralTaxTotal = 0;

View file

@ -9,15 +9,15 @@
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Action;
namespace Sylius\Bundle\PayumBundle\Action;
use Payum\Core\Action\PaymentAwareAction;
use Payum\Core\Action\GatewayAwareAction;
use Payum\Core\Bridge\Spl\ArrayObject;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Generic;
use Sylius\Component\Payment\Model\PaymentInterface;
class ExecuteSameRequestWithPaymentDetailsAction extends PaymentAwareAction
class ExecuteSameRequestWithPaymentDetailsAction extends GatewayAwareAction
{
/**
* {@inheritDoc}
@ -26,9 +26,7 @@ class ExecuteSameRequestWithPaymentDetailsAction extends PaymentAwareAction
*/
public function execute($request)
{
if (!$this->supports($request)) {
throw RequestNotSupportedException::createActionNotSupported($this, $request);
}
RequestNotSupportedException::assertSupports($this, $request);
/** @var PaymentInterface $payment */
$payment = $request->getModel();
@ -37,13 +35,9 @@ class ExecuteSameRequestWithPaymentDetailsAction extends PaymentAwareAction
try {
$request->setModel($details);
$this->payment->execute($request);
$this->gateway->execute($request);
} finally {
$payment->setDetails((array) $details);
} catch (\Exception $e) {
$payment->setDetails((array) $details);
throw $e;
}
}

View file

@ -11,6 +11,9 @@
namespace Sylius\Bundle\PayumBundle\DependencyInjection;
use Sylius\Bundle\PayumBundle\Model\GatewayConfig;
use Sylius\Bundle\PayumBundle\Model\PaymentSecurityToken;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
@ -60,15 +63,15 @@ class Configuration implements ConfigurationInterface
->arrayNode('payment_security_token')
->addDefaultsIfNotSet()
->children()
->scalarNode('model')->defaultValue('Sylius\Bundle\PayumBundle\Model\PaymentSecurityToken')->end()
->scalarNode('controller')->defaultValue('Sylius\Bundle\ResourceBundle\Controller\ResourceController')->end()
->scalarNode('model')->defaultValue(PaymentSecurityToken::class)->end()
->scalarNode('controller')->defaultValue(ResourceController::class)->end()
->end()
->end()
->arrayNode('payment_config')
->addDefaultsIfNotSet()
->children()
->scalarNode('model')->defaultValue('Sylius\Bundle\PayumBundle\Model\PaymentConfig')->end()
->scalarNode('controller')->defaultValue('Sylius\Bundle\ResourceBundle\Controller\ResourceController')->end()
->scalarNode('model')->defaultValue(GatewayConfig::class)->end()
->scalarNode('controller')->defaultValue(ResourceController::class)->end()
->end()
->end()
->end()

View file

@ -0,0 +1,94 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Extension;
use Payum\Core\Extension\Context;
use Payum\Core\Extension\ExtensionInterface;
use Payum\Core\Request\Generic;
use Payum\Core\Request\GetStatusInterface;
use SM\Factory\FactoryInterface;
use Sylius\Bundle\PayumBundle\Request\GetStatus;
use Sylius\Component\Core\Model\PaymentInterface;
use Sylius\Component\Payment\PaymentTransitions;
class UpdatePaymentStateExtension implements ExtensionInterface
{
/**
* @var FactoryInterface
*/
protected $factory;
/**
* @param FactoryInterface $factory
*/
public function __construct(FactoryInterface $factory)
{
$this->factory = $factory;
}
/**
* {@inheritDoc}
*/
public function onPreExecute(Context $context)
{
}
/**
* {@inheritDoc}
*/
public function onExecute(Context $context)
{
}
/**
* {@inheritDoc}
*/
public function onPostExecute(Context $context)
{
if ($context->getPrevious()) {
return;
}
/** @var Generic $request */
$request = $context->getRequest();
if (false === $request instanceof Generic) {
return;
}
if (false === $request instanceof GetStatusInterface) {
return;
}
/** @var PaymentInterface $payment */
$payment = $request->getFirstModel();
if (false === $payment instanceof PaymentInterface) {
return;
}
$context->getGateway()->execute($status = new GetStatus($payment));
if ($payment->getState() !== $status->getValue()) {
$this->updatePaymentState($payment, $status->getValue());
}
}
/**
* @param PaymentInterface $payment
* @param string $nextState
*/
protected function updatePaymentState(PaymentInterface $payment, $nextState)
{
$stateMachine = $this->factory->get($payment, PaymentTransitions::GRAPH);
if (null !== $transition = $stateMachine->getTransitionToState($nextState)) {
$stateMachine->apply($transition);
}
}
}

View file

@ -11,9 +11,9 @@
namespace Sylius\Bundle\PayumBundle\Model;
use Payum\Core\Model\PaymentConfigInterface;
use Payum\Core\Model\GatewayConfigInterface;
class PaymentConfig implements PaymentConfigInterface
class GatewayConfig implements GatewayConfigInterface
{
/**
* @var int
@ -23,7 +23,7 @@ class PaymentConfig implements PaymentConfigInterface
/**
* @var string
*/
protected $paymentName;
protected $gatewayName;
/**
* @var string
@ -51,17 +51,17 @@ class PaymentConfig implements PaymentConfigInterface
/**
* {@inheritDoc}
*/
public function getPaymentName()
public function getGatewayName()
{
return $this->paymentName;
return $this->gatewayName;
}
/**
* {@inheritDoc}
*/
public function setPaymentName($paymentName)
public function setGatewayName($gatewayName)
{
$this->paymentName = $paymentName;
$this->gatewayName = $gatewayName;
}
/**

View file

@ -40,7 +40,7 @@ class PaymentSecurityToken implements TokenInterface
/**
* @var string
*/
protected $paymentName;
protected $gatewayName;
public function __construct()
{
@ -116,16 +116,16 @@ class PaymentSecurityToken implements TokenInterface
/**
* {@inheritDoc}
*/
public function getPaymentName()
public function getGatewayName()
{
return $this->paymentName;
return $this->gatewayName;
}
/**
* {@inheritDoc}
*/
public function setPaymentName($paymentName)
public function setGatewayName($gatewayName)
{
$this->paymentName = $paymentName;
$this->gatewayName = $gatewayName;
}
}

View file

@ -1,67 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Action;
use Payum\Core\Action\PaymentAwareAction;
use Payum\Core\Bridge\Spl\ArrayObject;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Capture;
use Payum\Core\Security\TokenInterface;
use Sylius\Component\Payment\Model\PaymentInterface;
abstract class AbstractCapturePaymentAction extends PaymentAwareAction
{
/**
* {@inheritdoc}
*
* @param $request Capture
*/
public function execute($request)
{
RequestNotSupportedException::assertSupports($this, $request);
/** @var $payment PaymentInterface */
$payment = $request->getModel();
$this->composeDetails($payment, $request->getToken());
$details = ArrayObject::ensureArrayObject($payment->getDetails());
try {
$request->setModel($details);
$this->payment->execute($request);
$payment->setDetails($details);
} catch (\Exception $e) {
$payment->setDetails($details);
throw $e;
}
}
/**
* {@inheritdoc}
*/
public function supports($request)
{
return
$request instanceof Capture &&
$request->getModel() instanceof PaymentInterface
;
}
/**
* @param PaymentInterface $payment
* @param TokenInterface $token
*/
abstract protected function composeDetails(PaymentInterface $payment, TokenInterface $token);
}

View file

@ -1,41 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Action;
use Payum\Core\Action\PaymentAwareAction;
use SM\Factory\FactoryInterface;
use Sylius\Component\Payment\PaymentTransitions;
/**
* @author Alexandre Bacco <alexandre.bacco@gmail.com>
*/
abstract class AbstractPaymentStateAwareAction extends PaymentAwareAction
{
/**
* @var FactoryInterface
*/
protected $factory;
public function __construct(FactoryInterface $factory)
{
$this->factory = $factory;
}
protected function updatePaymentState($payment, $nextState)
{
$stateMachine = $this->factory->get($payment, PaymentTransitions::GRAPH);
if (null !== $transition = $stateMachine->getTransitionToState($nextState)) {
$stateMachine->apply($transition);
}
}
}

View file

@ -1,69 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Action;
use Payum\Core\Action\PaymentAwareAction;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Model\Order;
use Payum\Core\Request\Capture;
use Sylius\Component\Core\Model\PaymentInterface;
class GenericCapturePaymentAction extends PaymentAwareAction
{
/**
* {@inheritDoc}
*
* @param $request Capture
*/
public function execute($request)
{
RequestNotSupportedException::assertSupports($this, $request);
/** @var $payment PaymentInterface */
$payment = $request->getModel();
$order = $payment->getOrder();
$payumOrder = new Order();
$payumOrder->setNumber($order->getNumber());
$payumOrder->setTotalAmount($order->getTotal());
$payumOrder->setCurrencyCode($order->getCurrency());
$payumOrder->setClientEmail($order->getCustomer()->getEmail());
$payumOrder->setClientId($order->getCustomer()->getId());
$payumOrder->setDescription(sprintf(
'Order containing %d items for a total of %01.2f',
$order->getItems()->count(), $order->getTotal() / 100
));
$payumOrder->setDetails($payment->getDetails());
try {
$request->setModel($payumOrder);
$this->payment->execute($request);
$payment->setDetails($payumOrder->getDetails());
} catch (\Exception $e) {
$payment->setDetails($payumOrder->getDetails());
throw $e;
}
}
/**
* {@inheritdoc}
*/
public function supports($request)
{
return
$request instanceof Capture &&
$request->getModel() instanceof PaymentInterface
;
}
}

View file

@ -1,56 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Action;
use Payum\Core\Action\PaymentAwareAction;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\GetStatusInterface;
use Sylius\Component\Payment\Model\PaymentInterface;
class PaymentStatusAction extends PaymentAwareAction
{
/**
* {@inheritDoc}
*
* @param $request GetStatusInterface
*/
public function execute($request)
{
if (!$this->supports($request)) {
throw RequestNotSupportedException::createActionNotSupported($this, $request);
}
/** @var PaymentInterface $payment */
$payment = $request->getModel();
if ($payment->getDetails()) {
$request->setModel($payment->getDetails());
$this->payment->execute($request);
$request->setModel($payment);
} else {
$request->markNew();
}
}
/**
* {@inheritDoc}
*/
public function supports($request)
{
return
$request instanceof GetStatusInterface &&
$request->getModel() instanceof PaymentInterface
;
}
}

View file

@ -1,78 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Be2bill\Action;
use Payum\Core\Exception\LogicException;
use Payum\Core\Request\GetHttpRequest;
use Payum\Core\Security\TokenInterface;
use Sylius\Bundle\PayumBundle\Payum\Action\AbstractCapturePaymentAction;
use Sylius\Component\Payment\Model\PaymentInterface;
use Symfony\Component\HttpFoundation\Request;
/**
* @author Alexandre Bacco <alexandre.bacco@gmail.com>
*/
class CapturePaymentUsingBe2billFormAction extends AbstractCapturePaymentAction
{
/**
* @var Request
*/
protected $httpRequest;
/**
* Define the Symfony Request
*
* @param Request $request
*/
public function setRequest(Request $request = null)
{
$this->httpRequest = $request;
}
/**
* {@inheritDoc}
*/
public function execute($request)
{
$this->httpRequest->getSession()->set('payum_token', $request->getToken()->getHash());
parent::execute($request);
}
/**
* @param PaymentInterface $payment
* @param TokenInterface $token
*
* @throws LogicException
*/
protected function composeDetails(PaymentInterface $payment, TokenInterface $token)
{
if ($payment->getDetails()) {
return;
}
$this->payment->execute($httpRequest = new GetHttpRequest());
$order = $payment->getOrder();
$details = array();
$details['AMOUNT'] = $order->getTotal();
$details['CLIENTEMAIL'] = $order->getCustomer()->getEmail();
$details['HIDECLIENTEMAIL'] = 'yes';
$details['CLIENTUSERAGENT'] = $httpRequest->userAgent ?: 'Unknown';
$details['CLIENTIP'] = $httpRequest->clientIp;
$details['CLIENTIDENT'] = $order->getCustomer()->getId();
$details['DESCRIPTION'] = sprintf('Order containing %d items for a total of %01.2f', $order->getItems()->count(), $order->getTotal() / 100);
$details['ORDERID'] = $payment->getId();
$payment->setDetails($details);
}
}

View file

@ -1,134 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Be2bill\Action;
use Doctrine\Common\Persistence\ObjectManager;
use Payum\Be2Bill\Api;
use Payum\Core\ApiAwareInterface;
use Payum\Core\Bridge\Symfony\Reply\HttpResponse;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Exception\UnsupportedApiException;
use Payum\Core\Request\GetHttpRequest;
use Payum\Core\Request\Notify;
use SM\Factory\FactoryInterface;
use Sylius\Bundle\PayumBundle\Payum\Action\AbstractPaymentStateAwareAction;
use Sylius\Bundle\PayumBundle\Payum\Request\GetStatus;
use Sylius\Component\Resource\Repository\RepositoryInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
/**
* @author Alexandre Bacco <alexandre.bacco@gmail.com>
*/
class NotifyAction extends AbstractPaymentStateAwareAction implements ApiAwareInterface
{
/**
* @var RepositoryInterface
*/
protected $paymentRepository;
/**
* @var ObjectManager
*/
protected $objectManager;
/**
* @var string
*/
protected $identifier;
/**
* @var Api
*/
protected $api;
public function __construct(
RepositoryInterface $paymentRepository,
ObjectManager $objectManager,
FactoryInterface $factory,
$identifier
) {
parent::__construct($factory);
$this->paymentRepository = $paymentRepository;
$this->objectManager = $objectManager;
$this->identifier = $identifier;
}
/**
* {@inheritDoc}
*/
public function setApi($api)
{
if (!$api instanceof Api) {
throw new UnsupportedApiException('Not supported.');
}
$this->api = $api;
}
/**
* {@inheritDoc}
*
* @param $request Notify
*/
public function execute($request)
{
if (!$this->supports($request)) {
throw RequestNotSupportedException::createActionNotSupported($this, $request);
}
$this->payment->execute($httpRequest = new GetHttpRequest());
$details = $httpRequest->query;
if (!$this->api->verifyHash($details)) {
throw new BadRequestHttpException('Hash cannot be verified.');
}
if (empty($details['ORDERID'])) {
throw new BadRequestHttpException('Order id cannot be guessed');
}
$payment = $this->paymentRepository->findOneBy(array($this->identifier => $details['ORDERID']));
if (null === $payment) {
throw new BadRequestHttpException('Payment cannot be retrieved.');
}
if ((int) $details['AMOUNT'] !== $payment->getAmount()) {
throw new BadRequestHttpException('Request amount cannot be verified against payment amount.');
}
// Actually update payment details
$details = array_merge($payment->getDetails(), $details);
$payment->setDetails($details);
$status = new GetStatus($payment);
$this->payment->execute($status);
$nextState = $status->getValue();
$this->updatePaymentState($payment, $nextState);
$this->objectManager->flush();
throw new HttpResponse(new Response('OK', 200));
}
/**
* {@inheritDoc}
*/
public function supports($request)
{
return $request instanceof Notify;
}
}

View file

@ -1,40 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Dummy\Action;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Capture;
use Sylius\Bundle\PayumBundle\Payum\Action\GenericCapturePaymentAction;
use Sylius\Component\Payment\Model\PaymentInterface;
class CapturePaymentAction extends GenericCapturePaymentAction
{
/**
* {@inheritDoc}
*
* @param $request Capture
*/
public function execute($request)
{
if (!$this->supports($request)) {
throw RequestNotSupportedException::createActionNotSupported($this, $request);
}
/** @var $payment PaymentInterface */
$payment = $request->getModel();
if ($payment->getDetails()) {
return;
}
$payment->setDetails(array('captured' => true));
}
}

View file

@ -1,50 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Dummy\Action;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\GetStatusInterface;
use Sylius\Bundle\PayumBundle\Payum\Action\PaymentStatusAction as BasePaymentStatusAction;
use Sylius\Component\Payment\Model\PaymentInterface;
class PaymentStatusAction extends BasePaymentStatusAction
{
/**
* {@inheritDoc}
*
* @param $request GetStatusInterface
*/
public function execute($request)
{
if (!$this->supports($request)) {
throw RequestNotSupportedException::createActionNotSupported($this, $request);
}
/** @var $payment PaymentInterface */
$payment = $request->getModel();
$paymentDetails = $payment->getDetails();
if (empty($paymentDetails)) {
$request->markNew();
return;
}
if (isset($paymentDetails['captured'])) {
$request->markCaptured();
return;
}
$request->markUnknown();
}
}

View file

@ -1,42 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Offline\Action;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Offline\Constants;
use Sylius\Bundle\PayumBundle\Payum\Action\GenericCapturePaymentAction;
/**
* @author Antonio Peric <antonio@locastic.com>
*/
class CapturePaymentAction extends GenericCapturePaymentAction
{
/**
* {@inheritdoc}
*/
public function execute($request)
{
if (!$this->supports($request)) {
throw RequestNotSupportedException::createActionNotSupported($this, $request);
}
$payment = $request->getModel();
if ($payment->getDetails()) {
return;
}
$payment->setDetails(array(
Constants::FIELD_PAID => false,
Constants::FIELD_STATUS => Constants::STATUS_PENDING
));
}
}

View file

@ -1,78 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Paypal\Action;
use Doctrine\Common\Persistence\ObjectManager;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Notify;
use Payum\Core\Request\Sync;
use SM\Factory\FactoryInterface;
use Sylius\Bundle\PayumBundle\Payum\Action\AbstractPaymentStateAwareAction;
use Sylius\Bundle\PayumBundle\Payum\Request\GetStatus;
use Sylius\Component\Payment\Model\PaymentInterface;
class NotifyOrderAction extends AbstractPaymentStateAwareAction
{
/**
* @var ObjectManager
*/
protected $objectManager;
/**
* @param ObjectManager $objectManager
* @param FactoryInterface $factory
*/
public function __construct(ObjectManager $objectManager, FactoryInterface $factory)
{
parent::__construct($factory);
$this->objectManager = $objectManager;
}
/**
* {@inheritDoc}
*
* @param $request Notify
*/
public function execute($request)
{
if (!$this->supports($request)) {
throw RequestNotSupportedException::createActionNotSupported($this, $request);
}
/** @var $payment PaymentInterface */
$payment = $request->getModel();
$this->payment->execute(new Sync($payment));
$status = new GetStatus($payment);
$this->payment->execute($status);
$nextState = $status->getValue();
$this->updatePaymentState($payment, $nextState);
$this->objectManager->flush();
}
/**
* {@inheritDoc}
*/
public function supports($request)
{
return
$request instanceof Notify &&
$request->getToken() &&
$request->getModel() instanceof PaymentInterface
;
}
}

View file

@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/
namespace Sylius\Bundle\PayumBundle\Payum\Request;
namespace Sylius\Bundle\PayumBundle\Request;
use Payum\Core\Request\BaseGetStatus;
use Sylius\Component\Payment\Model\PaymentInterface;

View file

@ -16,7 +16,7 @@
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"
>
<mapped-superclass name="Sylius\Bundle\PayumBundle\Model\PaymentConfig" table="sylius_payment_config">
<mapped-superclass name="Sylius\Bundle\PayumBundle\Model\GatewayConfig" table="sylius_gateway_config">
<id name="id" column="id" type="integer">
<generator strategy="AUTO" />
@ -24,7 +24,7 @@
<field name="config" column="config" type="json_array" nullable="false" />
<field name="paymentName" column="payment_name" type="string" length="255" nullable="false" />
<field name="gatewayName" column="gateway_name" type="string" length="255" nullable="false" />
<field name="factoryName" column="factory_name" type="string" length="255" nullable="false" />

View file

@ -26,7 +26,7 @@
<field name="targetUrl" column="target_url" type="text" nullable="false" />
<field name="paymentName" column="payment_name" type="string" length="255" nullable="false" />
<field name="gatewayName" column="gateway_name" type="string" length="255" nullable="false" />
</mapped-superclass>
</doctrine-mapping>

View file

@ -16,75 +16,35 @@
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="sylius.payum.paypal.action.capture_payment_using_express_checkout.class">Sylius\Bundle\PayumBundle\Payum\Paypal\Action\CapturePaymentUsingExpressCheckoutAction</parameter>
<parameter key="sylius.payum.paypal.action.notify_order.class">Sylius\Bundle\PayumBundle\Payum\Paypal\Action\NotifyOrderAction</parameter>
<parameter key="sylius.payum.be2bill.action.capture_payment_using_credit_card.class">Sylius\Bundle\PayumBundle\Payum\Be2bill\Action\CapturePaymentUsingCreditCardAction</parameter>
<parameter key="sylius.payum.be2bill.action.capture_payment_using_be2bill_form.class">Sylius\Bundle\PayumBundle\Payum\Be2bill\Action\CapturePaymentUsingBe2billFormAction</parameter>
<parameter key="sylius.payum.be2bill.action.notify.class">Sylius\Bundle\PayumBundle\Payum\Be2bill\Action\NotifyAction</parameter>
<parameter key="sylius.payum.dummy.action.capture_payment.class">Sylius\Bundle\PayumBundle\Payum\Dummy\Action\CapturePaymentAction</parameter>
<parameter key="sylius.payum.dummy.action.payment_status.class">Sylius\Bundle\PayumBundle\Payum\Dummy\Action\PaymentStatusAction</parameter>
<parameter key="sylius.payum.offline.action.capture_payment.class">Sylius\Bundle\PayumBundle\Payum\Offline\Action\CapturePaymentAction</parameter>
<parameter key="sylius.payum.action.generic_capture_payment.class">Sylius\Bundle\PayumBundle\Payum\Action\GenericCapturePaymentAction</parameter>
<parameter key="sylius.payum.action.payment_status.class">Sylius\Bundle\PayumBundle\Payum\Action\PaymentStatusAction</parameter>
<parameter key="sylius.payum.action.execute_same_request_with_payment_details.class">Sylius\Bundle\PayumBundle\Payum\Action\ExecuteSameRequestWithPaymentDetailsAction</parameter>
</parameters>
<services>
<!-- Generic -->
<service id="sylius.payum.action.payment_status" class="%sylius.payum.action.payment_status.class%">
<tag name="payum.action" all="true" alias="status_sylius_order" />
<service id="sylius.payum.action.capture_payment" class="Sylius\Bundle\PayumBundle\Action\CapturePaymentAction">
<tag name="payum.action" all="true" alias="sylius.capture_payment" />
</service>
<service id="sylius.payum.action.generic_capture_payment" class="%sylius.payum.action.generic_capture_payment.class%">
<tag name="payum.action" all="true" alias="capture_sylius_order" />
</service>
<service id="sylius.payum.action.execute_same_request_with_payment_details" class="%sylius.payum.action.execute_same_request_with_payment_details.class%">
<service id="sylius.payum.action.execute_same_request_with_payment_details" class="Sylius\Bundle\PayumBundle\Action\ExecuteSameRequestWithPaymentDetailsAction">
<tag name="payum.action" all="true" />
</service>
<!-- PayPal -->
<service id="sylius.payum.paypal.action.capture_payment_using_express_checkout" class="%sylius.payum.paypal.action.capture_payment_using_express_checkout.class%">
<tag name="payum.action" factory="paypal_express_checkout_nvp" alias="capture_sylius_order" />
</service>
<service id="sylius.payum.paypal.action.notify_order" class="%sylius.payum.paypal.action.notify_order.class%">
<argument type="service" id="sylius.manager.payment" />
<service id="sylius.payum.extension.update_payment_state" class="Sylius\Bundle\PayumBundle\Extension\UpdatePaymentStateExtension">
<argument type="service" id="sm.factory" />
<tag name="payum.action" factory="paypal_express_checkout_nvp" alias="notify_sylius_order" />
<tag name="payum.extension" all="true" />
</service>
<!-- PayPal -->
<service id="sylius.payum.action.convert_payment_to_paypal_express" class="Sylius\Bundle\PayumBundle\Action\ConvertPaymentToPaypalExpressAction">
<tag name="payum.action" factory="paypal_express_checkout_nvp" alias="sylius.convert_payment" />
</service>
<!-- Be2bill -->
<service id="sylius.payum.be2bill.action.capture_payment_using_credit_card" class="%sylius.payum.be2bill.action.capture_payment_using_credit_card.class%">
<tag name="payum.action" factory="be2bill_direct" alias="capture_sylius_order" />
<service id="sylius.payum.action.convert_payment_to_be2bill" class="Sylius\Bundle\PayumBundle\Action\ConvertPaymentToBe2BillAction">
<tag name="payum.action" factory="be2bill_direct" alias="sylius.convert_payment" />
<tag name="payum.action" factory="be2bill_offsite" alias="sylius.convert_payment" />
</service>
<service id="sylius.payum.be2bill.action.capture_payment_using_be2bill_form" class="%sylius.payum.be2bill.action.capture_payment_using_be2bill_form.class%">
<call method="setRequest">
<argument type="service" id="request" on-invalid="null" strict="false" />
</call>
<tag name="payum.action" factory="be2bill_offsite" alias="capture_sylius_order" />
</service>
<service id="sylius.payum.be2bill.action.notify" class="%sylius.payum.be2bill.action.notify.class%">
<argument type="service" id="sylius.repository.payment" />
<argument type="service" id="sylius.manager.payment" />
<argument type="service" id="sm.factory" />
<argument>id</argument>
<tag name="payum.action" factory="be2bill_offsite" alias="notify_sylius_order" />
</service>
<!-- Dummy -->
<service id="sylius.payum.dummy.action.capture_payment" class="%sylius.payum.dummy.action.capture_payment.class%" />
<service id="sylius.payum.dummy.action.payment_status" class="%sylius.payum.dummy.action.payment_status.class%" />
<!-- Offline -->
<service id="sylius.payum.offline.action.capture_payment" class="%sylius.payum.offline.action.capture_payment.class%">
<tag name="payum.action" factory="offline" />
<service id="sylius.payum.offline.action.convert_payment" class="Sylius\Bundle\PayumBundle\Action\ConvertPaymentToOfflineAction">
<tag name="payum.action" factory="offline" alias="sylius.convert_payment" />
</service>
</services>
</container>

View file

@ -31,8 +31,8 @@
"sylius/order-bundle": "0.16.*",
"sylius/payment-bundle": "0.16.*",
"sylius/resource-bundle": "0.16.*",
"payum/payum": "~0.14.0",
"payum/payum-bundle": "~0.14.2",
"payum/payum": "~1.0",
"payum/payum-bundle": "~1.0",
"winzou/state-machine": "~0.1"
},
"require-dev": {

View file

@ -1,27 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace spec\Sylius\Bundle\PayumBundle\Model;
use PhpSpec\ObjectBehavior;
class PaymentSecurityTokenSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType('Sylius\Bundle\PayumBundle\Model\PaymentSecurityToken');
}
function it_implements_payum_token_interface()
{
$this->shouldHaveType('Payum\Core\Security\TokenInterface');
}
}

View file

@ -1,92 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace spec\Sylius\Bundle\PayumBundle\Payum\Action;
use Payum\Core\PaymentInterface as PayumPaymentInterface;
use Payum\Core\Request\Generic;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Sylius\Component\Payment\Model\PaymentInterface;
class ExecuteSameRequestWithPaymentDetailsActionSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType('Sylius\Bundle\PayumBundle\Payum\Action\ExecuteSameRequestWithPaymentDetailsAction');
}
function it_extends_payum_payment_aware_action()
{
$this->shouldHaveType('Payum\Core\Action\PaymentAwareAction');
}
function it_should_support_request(Generic $request, PaymentInterface $payment)
{
$request->getModel()->willReturn($payment);
$payment->getDetails()->willReturn(array('foo' => 'foo'));
$this->supports($request)->shouldReturn(true);
}
function it_should_not_support_generic_request_with_not_payment_model(Generic $request)
{
$request->getModel()->willReturn(new \stdClass);
$this->supports($request)->shouldReturn(false);
}
function it_should_not_support_anything_not_model_request()
{
$this->supports(new \stdClass)->shouldReturn(false);
}
function it_throws_exception_if_executing_not_supported_request()
{
$this
->shouldThrow('Payum\Core\Exception\RequestNotSupportedException')
->duringExecute($notSupportedRequest = 'foo')
;
}
function it_should_execute_same_request_with_details_wrapped_by_array_object(
Generic $request,
PaymentInterface $payment,
PayumPaymentInterface $payumPayment
) {
$this->setPayment($payumPayment);
$request->getModel()->willReturn($payment);
$payment->getDetails()->willReturn(array('foo' => 'fooValue'));
$request
->setModel(Argument::type('Payum\Core\Bridge\Spl\ArrayObject'))
->shouldBeCalled()
->will(function ($args) use ($request) {
$request->getModel()->willReturn($args[0]);
})
;
$request->getModel()->willReturn($payment);
$payumPayment
->execute($request)
->shouldBeCalled()
->will(function ($args) {
$details = $args[0]->getModel();
$details['bar'] = 'barValue';
})
;
$payment->setDetails(array('foo' => 'fooValue', 'bar' => 'barValue'))->shouldBeCalled();
$this->execute($request);
}
}

View file

@ -1,93 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace spec\Sylius\Bundle\PayumBundle\Payum\Action;
use Payum\Core\PaymentInterface as PayumPaymentInterface;
use Payum\Core\Request\GetStatusInterface;
use PhpSpec\ObjectBehavior;
use Sylius\Component\Payment\Model\PaymentInterface;
class PaymentStatusActionSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType('Sylius\Bundle\PayumBundle\Payum\Action\PaymentStatusAction');
}
function it_extends_payum_payment_aware_action()
{
$this->shouldHaveType('Payum\Core\Action\PaymentAwareAction');
}
function it_should_support_status_request_with_order_model(
PaymentInterface $payment,
GetStatusInterface $statusRequest
) {
$statusRequest->getModel()->willReturn($payment);
$this->supports($statusRequest)->shouldReturn(true);
}
function it_should_not_support_status_request_with_no_order_model(
GetStatusInterface $statusRequest
) {
$statusRequest->getModel()->willReturn('foo');
$this->supports($statusRequest)->shouldReturn(false);
}
function it_should_not_support_any_no_status_requests()
{
$this->supports('foo')->shouldReturn(false);
}
function it_throws_exception_if_executing_not_supported_request()
{
$notSupportedRequest = 'foo';
$this
->shouldThrow('Payum\Core\Exception\RequestNotSupportedException')
->duringExecute($notSupportedRequest)
;
}
function it_should_mark_new_if_order_have_empty_payment_details(
PaymentInterface $payment,
GetStatusInterface $statusRequest
) {
$payment->getDetails()->willReturn(array());
$statusRequest->getModel()->willReturn($payment);
$statusRequest->markNew()->shouldBeCalled();
$this->execute($statusRequest);
}
function it_should_do_status_subrequest_with_payment_details_as_model(
PayumPaymentInterface $payumPayment,
GetStatusInterface $statusRequest,
PaymentInterface $payment
) {
$details = array('foo' => 'foo', 'bar' => 'baz');
$statusRequest->getModel()->willReturn($payment);
$statusRequest->setModel($details)->shouldBeCalled();
$statusRequest->setModel($payment)->shouldBeCalled();
$payment->getDetails()->willReturn($details);
$payumPayment->execute($statusRequest)->shouldBeCalled();
$this->setPayment($payumPayment);
$this->execute($statusRequest);
}
}

View file

@ -1,161 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace spec\Sylius\Bundle\PayumBundle\Payum\Paypal\Action;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Persistence\ObjectManager;
use Payum\Core\Model\ModelAwareInterface;
use Payum\Core\PaymentInterface;
use Payum\Core\Request\Notify;
use Payum\Core\Security\TokenInterface;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use SM\Factory\FactoryInterface;
use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Payment\Model\Payment;
use Sylius\Component\Payment\Model\PaymentInterface as PaymentModelInterface;
use Sylius\Component\Payment\PaymentTransitions;
use Sylius\Component\Resource\StateMachine\StateMachineInterface;
class NotifyOrderActionSpec extends ObjectBehavior
{
function let(
ObjectManager $objectManager,
FactoryInterface $factory,
PaymentInterface $payment
) {
$this->beConstructedWith($objectManager, $factory);
$this->setPayment($payment);
}
function it_is_initializable()
{
$this->shouldHaveType('Sylius\Bundle\PayumBundle\Payum\Paypal\Action\NotifyOrderAction');
}
function it_extends_payum_payment_aware_action()
{
$this->shouldHaveType('Payum\Core\Action\PaymentAwareAction');
}
function it_should_supports_secured_notify_request_with_order_model(
Notify $request,
PaymentModelInterface $payment,
TokenInterface $token
) {
$request->getModel()->willReturn($payment);
$request->getToken()->willReturn($token);
$this->supports($request)->shouldReturn(true);
}
function it_should_support_only_model_aware_request(ModelAwareInterface $request)
{
$this->supports($request)->shouldReturn(false);
}
function it_should_not_support_notify_request_with_not_payment_model(
Notify $request,
TokenInterface $token
) {
$request->getModel()->willReturn(new \stdClass);
$request->getToken()->willReturn($token);
$this->supports($request)->shouldReturn(false);
}
function it_should_not_support_anything_not_model_request()
{
$this->supports(new \stdClass)->shouldReturn(false);
}
function it_throws_exception_if_executing_not_supported_request()
{
$this
->shouldThrow('Payum\Core\Exception\RequestNotSupportedException')
->duringExecute($notSupportedRequest = 'foo')
;
}
function it_must_not_dispatch_pre_and_post_payment_state_changed_if_state_not_changed(
$factory,
Notify $request,
OrderInterface $order,
PaymentModelInterface $paymentModel,
PaymentInterface $payment,
StateMachineInterface $sm,
Collection $payments,
TokenInterface $token
) {
$request->getModel()->willReturn($paymentModel);
$request->getToken()->willReturn($token);
$order->getPayments()->willReturn($payments);
$payments->last()->willReturn($payment);
$paymentModel->getState()->willReturn(Payment::STATE_COMPLETED);
$factory->get($paymentModel, PaymentTransitions::GRAPH)->willReturn($sm);
$sm->getTransitionToState('completed')->willReturn(null);
$sm->apply(PaymentTransitions::SYLIUS_COMPLETE)->shouldNotBeCalled();
$payment->execute(Argument::type('Payum\Core\Request\Sync'))->willReturn(null);
$payment
->execute(Argument::type('Sylius\Bundle\PayumBundle\Payum\Request\GetStatus'))
->will(function ($args) {
$args[0]->markCaptured();
}
);
$this->execute($request);
}
function it_must_dispatch_pre_and_post_payment_state_changed_if_state_changed(
$factory,
Notify $request,
OrderInterface $order,
PaymentModelInterface $paymentModel,
PaymentInterface $payment,
ObjectManager $objectManager,
StateMachineInterface $sm,
Collection $payments,
TokenInterface $token
) {
$request->getModel()->willReturn($paymentModel);
$request->getToken()->willReturn($token);
$order->getPayments()->willReturn($payments);
$payments->last()->willReturn($payment);
$paymentModel->getState()->willReturn(Payment::STATE_PENDING);
$factory->get($paymentModel, PaymentTransitions::GRAPH)->willReturn($sm);
$sm->getTransitionToState('cancelled')->willReturn(PaymentTransitions::SYLIUS_CANCEL);
$sm->apply(PaymentTransitions::SYLIUS_CANCEL)->shouldBeCalled()->will(function ($args) use ($paymentModel) {
$paymentModel->getState()->willReturn(Payment::STATE_CANCELLED);
});
$payment->execute(Argument::type('Payum\Core\Request\Sync'))->willReturn(null);
$payment
->execute(Argument::type('Sylius\Bundle\PayumBundle\Payum\Request\GetStatus'))
->will(function ($args) {
$args[0]->markCanceled();
}
);
$objectManager->flush()->shouldBeCalled();
$this->execute($request);
}
}

View file

@ -1,173 +0,0 @@
<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace spec\Sylius\Bundle\PayumBundle\Payum\Request;
use PhpSpec\ObjectBehavior;
use Sylius\Component\Payment\Model\PaymentInterface;
class GetStatusSpec extends ObjectBehavior
{
function let()
{
$this->beConstructedWith(new \stdClass);
}
function it_is_initializable()
{
$this->shouldHaveType('Sylius\Bundle\PayumBundle\Payum\Request\GetStatus');
}
function it_extends_base_status_class()
{
$this->shouldHaveType('Payum\Core\Request\BaseGetStatus');
}
function it_is_new_when_marked_as_new()
{
$this->markNew();
$this->isNew()->shouldReturn(true);
}
function it_is_return_new_status_when_marked_as_new()
{
$this->markNew();
$this->getValue()->shouldReturn(PaymentInterface::STATE_NEW);
}
function it_is_captured_when_marked_as_captured()
{
$this->markCaptured();
$this->isCaptured()->shouldReturn(true);
}
function it_is_return_completed_status_when_marked_as_captured()
{
$this->markCaptured();
$this->getValue()->shouldReturn(PaymentInterface::STATE_COMPLETED);
}
function it_is_authorized_when_marked_as_authorized()
{
$this->markAuthorized();
$this->isAuthorized()->shouldReturn(true);
}
function it_is_return_authorized_status_when_marked_as_authorized()
{
$this->markAuthorized();
$this->getValue()->shouldReturn(PaymentInterface::STATE_AUTHORIZED);
}
function it_is_refunded_when_marked_as_refunded()
{
$this->markRefunded();
$this->isRefunded()->shouldReturn(true);
}
function it_is_return_refunded_status_when_marked_as_refunded()
{
$this->markRefunded();
$this->getValue()->shouldReturn(PaymentInterface::STATE_REFUNDED);
}
function it_is_pending_when_marked_as_pending()
{
$this->markPending();
$this->isPending()->shouldReturn(true);
}
function it_is_return_pending_status_when_marked_as_pending()
{
$this->markPending();
$this->getValue()->shouldReturn(PaymentInterface::STATE_PROCESSING);
}
function it_is_failed_when_marked_as_failed()
{
$this->markFailed();
$this->isFailed()->shouldReturn(true);
}
function it_is_return_failed_status_when_marked_as_failed()
{
$this->markFailed();
$this->getValue()->shouldReturn(PaymentInterface::STATE_FAILED);
}
function it_is_canceled_when_marked_as_canceled()
{
$this->markCanceled();
$this->isCanceled()->shouldReturn(true);
}
function it_is_return_void_status_when_marked_as_canceled()
{
$this->markCanceled();
$this->getValue()->shouldReturn(PaymentInterface::STATE_CANCELLED);
}
function it_is_suspended_when_marked_as_suspended()
{
$this->markSuspended();
$this->isSuspended()->shouldReturn(true);
}
function it_is_return_void_status_when_marked_as_suspended()
{
$this->markSuspended();
$this->getValue()->shouldReturn(PaymentInterface::STATE_PROCESSING);
}
function it_is_expired_when_marked_as_expired()
{
$this->markExpired();
$this->isExpired()->shouldReturn(true);
}
function it_is_return_failed_status_when_marked_as_expired()
{
$this->markExpired();
$this->getValue()->shouldReturn(PaymentInterface::STATE_FAILED);
}
function it_is_unknown_when_marked_as_unknown()
{
$this->markUnknown();
$this->isUnknown()->shouldReturn(true);
}
function it_is_return_unknown_status_when_marked_as_unknown()
{
$this->markUnknown();
$this->getValue()->shouldReturn(PaymentInterface::STATE_UNKNOWN);
}
}