Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions DependencyInjection/Factory/Payment/BitcoindPaymentFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?php
namespace Payum\Bundle\PayumBundle\DependencyInjection\Factory\Payment;

use Payum\Core\Bridge\Twig\TwigFactory;
use Payum\Core\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\FileLocator;

class BitcoindPaymentFactory extends AbstractPaymentFactory implements PrependExtensionInterface
{
/**
* {@inheritdoc}
*/
public function create(ContainerBuilder $container, $contextName, array $config)
{
if (false == class_exists('Payum\Bitcoind\PaymentFactory')) {
throw new RuntimeException('Cannot find bitcoind payment factory class. Have you installed payum/bitcoind package?');
}

$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config/payment'));
$loader->load('bitcoind.xml');

return parent::create($container, $contextName, $config);
}

/**
* {@inheritdoc}
*/
public function getName()
{
return 'bitcoind';
}

/**
* {@inheritdoc}
*/
public function addConfiguration(ArrayNodeDefinition $builder)
{
parent::addConfiguration($builder);

$builder->children()
->scalarNode('dsn')->isRequired()->cannotBeEmpty()->end()
->end();
}

/**
* {@inheritDoc}
*/
public function prepend(ContainerBuilder $container)
{
$container->prependExtensionConfig('twig', array(
'paths' => array_flip(array_filter(array(
'PayumCore' => TwigFactory::guessViewsPath('Payum\Core\Payment'),
'PayumBitcoind' => TwigFactory::guessViewsPath('Payum\Bitcoind\PaymentFactory'),
)))
));
}

/**
* {@inheritDoc}
*/
protected function addApis(Definition $paymentDefinition, ContainerBuilder $container, $contextName, array $config)
{
$client = new DefinitionDecorator('payum.bitcoind.client.prototype');
$client->replaceArgument(0, $config['dsn']);
$client->setPublic(true);
$clientId = 'payum.context.'.$contextName.'.client';
$container->setDefinition($clientId, $client);

$bitcoind = new DefinitionDecorator('payum.bitcoind.bitcoind.prototype');
$bitcoind->replaceArgument(0, new Reference($clientId));
$bitcoind->setPublic(true);
$bitcoindId = 'payum.context.'.$contextName.'.bitcoind';
$container->setDefinition($bitcoindId, $bitcoind);

$paymentDefinition->addMethodCall('addApi', array(new Reference($bitcoindId)));
}
}
2 changes: 2 additions & 0 deletions PayumBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Payum\Bundle\PayumBundle\DependencyInjection\Compiler\PayumStorageExtensionsPass;
use Payum\Bundle\PayumBundle\DependencyInjection\Factory\Payment\Be2BillOnsitePaymentFactory;
use Payum\Bundle\PayumBundle\DependencyInjection\Factory\Payment\Be2BillPaymentFactory;
use Payum\Bundle\PayumBundle\DependencyInjection\Factory\Payment\BitcoindPaymentFactory;
use Payum\Bundle\PayumBundle\DependencyInjection\Factory\Payment\KlarnaCheckoutPaymentFactory;
use Payum\Bundle\PayumBundle\DependencyInjection\Factory\Payment\KlarnaInvoicePaymentFactory;
use Payum\Bundle\PayumBundle\DependencyInjection\Factory\Payment\OfflinePaymentFactory;
Expand Down Expand Up @@ -46,6 +47,7 @@ public function build(ContainerBuilder $container)
$extension->addPaymentFactory(new KlarnaInvoicePaymentFactory);
$extension->addPaymentFactory(new StripeJsPaymentFactory);
$extension->addPaymentFactory(new StripeCheckoutPaymentFactory);
$extension->addPaymentFactory(new BitcoindPaymentFactory);

$extension->addStorageFactory(new FilesystemStorageFactory);
$extension->addStorageFactory(new DoctrineStorageFactory);
Expand Down
60 changes: 60 additions & 0 deletions Resources/config/payment/bitcoind.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" ?>

<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

<parameters>
<parameter key="payum.bitcoind.bitcoind.class">Nbobtc\Bitcoind\Bitcoind</parameter>
<parameter key="payum.bitcoind.client.class">Nbobtc\Bitcoind\Client</parameter>
<parameter key="payum.bitcoind.action.capture.class">Payum\Bitcoind\Action\CaptureAction</parameter>
<parameter key="payum.bitcoind.action.status.class">Payum\Bitcoind\Action\StatusAction</parameter>
<parameter key="payum.bitcoind.action.api.get_new_address.class">Payum\Bitcoind\Action\Api\GetNewAddressAction</parameter>
</parameters>

<services>
<service
id="payum.bitcoind.bitcoind.prototype"
class="%payum.bitcoind.bitcoind.class%"
abstract="true"
public="false"
>
<!-- It is template service. The real service will be created by BitcoindPaymentFactory -->
<argument />
</service>

<service
id="payum.bitcoind.client.prototype"
class="%payum.bitcoind.client.class%"
abstract="true"
public="false"
>
<!-- It is template service. The real service will be created by BitcoindPaymentFactory -->
<argument />
</service>

<service
id="payum.bitcoind.action.capture"
class="%payum.bitcoind.action.capture.class%"
public="false"
>
<tag name="payum.action" factory="bitcoind" />
</service>

<service
id="payum.bitcoind.action.status"
class="%payum.bitcoind.action.status.class%"
public="false"
>
<tag name="payum.action" factory="bitcoind" />
</service>

<service
id="payum.bitcoind.action.api.get_new_address"
class="%payum.bitcoind.action.api.get_new_address.class%"
public="false"
>
<tag name="payum.action" factory="bitcoind" />
</service>
</services>
</container>