Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP][bitcoind] Add bitcoind support. #197

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
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>