/**
     * {@inheritDoc}
     */
    public function createConfig(array $config = array())
    {
        $config = ArrayObject::ensureArrayObject($config);
        $config->defaults($this->defaultConfig);
        $config->defaults(array(
            'payum.template.layout' => '@PayumCore/layout.html.twig',

            'buzz.client' => ClientFactory::createCurl(),
            'twig.env' => TwigFactory::createGeneric(),

            'payum.action.get_http_request' => new GetHttpRequestAction(),
            'payum.action.capture_order' => new CaptureOrderAction(),
            'payum.action.execute_same_request_with_model_details' => new ExecuteSameRequestWithModelDetailsAction(),
            'payum.action.render_template' => function (ArrayObject $config) {
                return new RenderTemplateAction($config['twig.env'], $config['payum.template.layout']);
            },
            'payum.extension.endless_cycle_detector' => new EndlessCycleDetectorExtension(),

            'payum.prepend_actions' => array(),
            'payum.prepend_extensions' => array(),
            'payum.prepend_apis' => array(),
            'payum.default_options' => array(),
            'payum.required_options' => array(),
        ));

        return (array) $config;
    }
 /**
  * @test
  */
 public function shouldRenderObtainCheckoutTokenTemplate()
 {
     $twig = TwigFactory::createGeneric();
     $result = $twig->render('@PayumStripe/Action/obtain_checkout_token.html.twig', array('publishable_key' => 'theKey'));
     $this->assertContains('data-key="theKey"', $result);
     $this->assertContains('https://checkout.stripe.com/checkout.js', $result);
 }
 /**
  * {@inheritDoc}
  */
 public function prepend(ContainerBuilder $container)
 {
     $container->prependExtensionConfig('twig', array(
         'paths' => array_flip(array_filter(array(
             'PayumCore' => TwigFactory::guessViewsPath('Payum\Core\Payment'),
             'PayumKlarnaCheckout' => TwigFactory::guessViewsPath('Payum\Klarna\Checkout\PaymentFactory'),
         )))
     ));
 }
Beispiel #4
0
 /**
  * @param \Klarna_Checkout_ConnectorInterface $connector
  *
  * @return \Payum\Core\Payment
  */
 public static function create(\Klarna_Checkout_ConnectorInterface $connector, ActionInterface $renderTemplateAction = null, $layoutTemplate = null, $captureTemplate = null)
 {
     $layoutTemplate = $layoutTemplate ?: '@PayumCore/layout.html.twig';
     $captureTemplate = $captureTemplate ?: '@PayumKlarnaCheckout/Action/capture.html.twig';
     $renderTemplateAction = $renderTemplateAction ?: new RenderTemplateAction(TwigFactory::createGeneric(), $layoutTemplate);
     $payment = new Payment();
     $payment->addApi($connector);
     $payment->addAction(new CaptureAction($captureTemplate));
     $payment->addAction(new NotifyAction());
     $payment->addAction(new StatusAction());
     $payment->addAction(new CreateOrderAction());
     $payment->addAction(new UpdateOrderAction());
     $payment->addAction($renderTemplateAction);
     return $payment;
 }
Beispiel #5
0
 /**
  * @param Keys $keys
  *
  * @return PaymentInterface
  */
 public static function createCheckout(Keys $keys, ActionInterface $renderTemplateAction = null, $layoutTemplate = null, $obtainTokenTemplate = null)
 {
     $layoutTemplate = $layoutTemplate ?: '@PayumCore/layout.html.twig';
     $obtainTokenTemplate = $obtainTokenTemplate ?: '@PayumStripe/Action/obtain_checkout_token.html.twig';
     $renderTemplateAction = $renderTemplateAction ?: new RenderTemplateAction(TwigFactory::createGeneric(), $layoutTemplate);
     $payment = new Payment();
     $payment->addApi($keys);
     $payment->addExtension(new EndlessCycleDetectorExtension());
     $payment->addAction(new CaptureAction());
     $payment->addAction(new StatusAction());
     $payment->addAction(new ExecuteSameRequestWithModelDetailsAction());
     $payment->addAction($renderTemplateAction);
     $payment->addAction(new ObtainTokenAction($obtainTokenTemplate));
     $payment->addAction(new CreateChargeAction());
     return $payment;
 }
    /**
     * @test
     */
    public function shouldRenderExpectedResult()
    {
        $twig = TwigFactory::createGeneric();
        $actualResult = $twig->render('@PayumKlarnaCheckout/Action/capture.html.twig', array('snippet' => 'theSnippet'));
        $expectedResult = <<<HTML
<!DOCTYPE html>
<html>
    <head>
            </head>
    <body>
            theSnippet
            </body>
</html>
HTML;
        $this->assertEquals($expectedResult, $actualResult);
    }
    /**
     * {@inheritDoc}
     */
    public function prepend(ContainerBuilder $container)
    {
        $bundles = $container->getParameter('kernel.bundles');

        if (isset($bundles['TwigBundle'])) {
            $container->prependExtensionConfig('twig', array(
                'paths' => array(
                    TwigFactory::guessViewsPath('Payum\Core\Payment') => 'PayumCore',
                    TwigFactory::guessViewsPath('Payum\Core\Bridge\Symfony\ReplyToSymfonyResponseConverter') => 'PayumSymfonyBridge',
                )
            ));

            foreach ($this->paymentFactories as $factory) {
                if ($factory instanceof PrependExtensionInterface) {
                    $factory->prepend($container);
                }
            }
        }

        if (isset($bundles['DoctrineBundle'])) {
            foreach ($container->getExtensionConfig('doctrine') as $config) {
                // do not register mappings if dbal not configured.
                if (false == empty($config['dbal'])) {
                    $rc = new \ReflectionClass('Payum\Core\Payment');
                    $payumRootDir = dirname($rc->getFileName());

                    $container->prependExtensionConfig('doctrine', array(
                        'orm' => array(
                            'mappings' => array(
                                'payum' => array(
                                    'is_bundle' => false,
                                    'type' => 'xml',
                                    'dir' => $payumRootDir.'/Bridge/Doctrine/Resources/mapping',
                                    'prefix' => 'Payum\Core\Model',
                                ),
                            ),
                        ),
                    ));

                    break;
                }
            }
        }
    }
 /**
  * @test
  */
 public function shouldRenderCheckoutTokenWithDollarsIfNoCurrencySet()
 {
     $twig = TwigFactory::createGeneric();
     $result = $twig->render('@PayumStripe/Action/obtain_checkout_token.html.twig', array('model' => array('currency' => '')));
     $this->assertContains('data-currency="USD"', $result);
 }
 /**
  * {@inheritDoc}
  */
 public function prepend(ContainerBuilder $container)
 {
     $container->prependExtensionConfig('twig', array('paths' => array_flip(array_filter(array('PayumCore' => TwigFactory::guessViewsPath('Payum\\Core\\Gateway'), 'PayumStripe' => TwigFactory::guessViewsPath('Payum\\Stripe\\StripeCheckoutGatewayFactory'))))));
 }
Beispiel #10
0
 /**
  * {@inheritDoc}
  */
 public function register(SilexApplication $app)
 {
     $app['debug'] = (bool) getenv('PAYUM_SERVER_DEBUG');
     $app['mongo.database'] = getenv('PAYUM_MONGO_DATABASE') ?: 'payum_server';
     $app['mongo.server'] = getenv('PAYUM_MONGO_SERVER') ?: 'mongodb://localhost:27017';
     $app['payum.gateway_config_storage'] = $app->share(function ($app) {
         /** @var Database $db */
         $db = $app['doctrine.mongo.database'];
         return new MongoStorage(GatewayConfig::class, $db->selectCollection('gateway_configs'));
     });
     $app['payum.builder'] = $app->share($app->extend('payum.builder', function (PayumBuilder $builder) use($app) {
         /** @var Database $db */
         $db = $app['doctrine.mongo.database'];
         $builder->setTokenStorage(new MongoStorage(SecurityToken::class, $db->selectCollection('security_tokens')))->setGatewayConfigStorage($app['payum.gateway_config_storage'])->addStorage(Payment::class, new MongoStorage(Payment::class, $db->selectCollection('payments')))->addCoreGatewayFactoryConfig(['payum.extension.update_payment_status' => new UpdatePaymentStatusExtension(), 'payum.prepend_extensions' => ['payum.extension.update_payment_status'], 'payum.action.server.capture_payment' => new CapturePaymentAction(), 'payum.action.server.authorize_payment' => new AuthorizePaymentAction(), 'payum.action.server.execute_same_request_with_payment_details' => new ExecuteSameRequestWithPaymentDetailsAction(), 'payum.action.server.obtain_missing_details' => function () use($app) {
             return new ObtainMissingDetailsAction($app['form.factory'], '@PayumServer/obtainMissingDetails.html.twig');
         }])->addGatewayFactoryConfig('be2bill_offsite', ['payum.action.server.obtain_missing_details' => function () use($app) {
             return new ObtainMissingDetailsForBe2BillAction($app['form.factory'], '@PayumServer/obtainMissingDetails.html.twig');
         }])->addGatewayFactoryConfig('be2bill_direct', ['payum.action.server.obtain_missing_details' => function () use($app) {
             return new ObtainMissingDetailsForBe2BillAction($app['form.factory'], '@PayumServer/obtainMissingDetails.html.twig');
         }]);
         return $builder;
     }));
     $app['form.types'] = $app->share($app->extend('form.types', function ($types) use($app) {
         $types[] = new CreatePaymentType();
         $types[] = new UpdatePaymentType();
         $types[] = new CreateTokenType();
         $types[] = new ChooseGatewayType();
         return $types;
     }));
     $app['payum.reply_to_json_response_converter'] = $app->share(function ($app) {
         return new ReplyToJsonResponseConverter();
     });
     $app['doctrine.mongo.connection'] = $app->share(function ($app) {
         return new Connection($app['mongo.server']);
     });
     $app['doctrine.mongo.database'] = $app->share(function ($app) {
         return $app['doctrine.mongo.connection']->selectDatabase($app['mongo.database']);
     });
     $app['payum.gateway_choices'] = $app->extend('payum.gateway_choices', function (array $choices) use($app) {
         /** @var StorageInterface $gatewayConfigStorage */
         $gatewayConfigStorage = $app['payum.gateway_config_storage'];
         foreach ($gatewayConfigStorage->findBy([]) as $config) {
             /** @var GatewayConfigInterface $config */
             $choices[$config->getGatewayName()] = ucwords(str_replace(['_'], ' ', $config->getGatewayName()));
         }
         return $choices;
     });
     $app['twig.loader.filesystem'] = $app->share($app->extend('twig.loader.filesystem', function (\Twig_Loader_Filesystem $loader, $app) {
         $loader->addPath(__DIR__ . '/Resources/views', 'PayumServer');
         foreach (TwigFactory::createGenericPaths() as $path => $namespace) {
             $loader->addPath($path, $namespace);
         }
         return $loader;
     }));
     $app['payum.listener.choose_gateway'] = $app->share(function () use($app) {
         return function (Request $request, Application $app) {
             /** @var Payum $payum */
             $payum = $app['payum'];
             /** @var SecurityToken $token */
             $token = $payum->getHttpRequestVerifier()->verify($request);
             /** @var Payment $payment */
             $payment = $token->getPayment();
             if ($payment && false == $payment->getGatewayName()) {
                 /** @var FormFactoryInterface $formFactory */
                 $formFactory = $app['form.factory'];
                 $form = $formFactory->createNamed('', 'choose_gateway', $payment, ['action' => $token->getTargetUrl()]);
                 $form->handleRequest($request);
                 if ($form->isSubmitted() && $form->isValid()) {
                     $payum->getStorage($payment)->update($payment);
                 } else {
                     /** @var \Twig_Environment $twig */
                     $twig = $app['twig'];
                     return new Response($twig->render('@PayumServer/chooseGateway.html.twig', ['form' => $form->createView(), 'payment' => $payment, 'layout' => '@PayumCore/layout.html.twig']));
                 }
             }
             // do not verify it second time.
             $request->attributes->set('payum_token', $token);
         };
     });
     $app->before(function (Request $request, Application $app) {
         if (0 === strpos($request->getPathInfo(), '/payment/capture') || 0 === strpos($request->getPathInfo(), '/payment/authorize')) {
             return call_user_func($app['payum.listener.choose_gateway'], $request, $app);
         }
     });
     $app->after($app["cors"]);
     /** @var ControllerCollection $payment */
     $payment = $app['payum.payments_controller_collection'];
     $payment->after(function (Request $request, Response $response) use($app) {
         if ('OPTIONS' == $request->getMethod()) {
             return;
         }
         if ('application/vnd.payum+json' == $response->headers->get('Content-Type')) {
             return;
         }
         if ('application/json' == $response->headers->get('Content-Type')) {
             return;
         }
         if ('application/vnd.payum+json' == $request->headers->get('Accept')) {
             throw new HttpResponse($response);
         }
     });
     $app->error(function (\Exception $e, $code) use($app) {
         if ('OPTIONS' === $app['request']->getMethod()) {
             return;
         }
         if (false == $e instanceof ReplyInterface) {
             return;
         }
         if ('application/vnd.payum+json' == $app['request']->headers->get('Accept')) {
             /** @var ReplyToJsonResponseConverter $converter */
             $converter = $app['payum.reply_to_json_response_converter'];
             return $converter->convert($e);
         }
     }, $priority = -7);
     $app->error(function (\Exception $e, $code) use($app) {
         if ('OPTIONS' === $app['request']->getMethod()) {
             return;
         }
         if ('json' == $app['request']->getContentType() || 'application/vnd.payum+json' == $app['request']->headers->get('Accept')) {
             return new JsonResponse(['exception' => get_class($e), 'message' => $e->getMessage(), 'code' => $e->getCode(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'stackTrace' => $e->getTraceAsString()], 200, ['Content-Type' => 'application/vnd.payum+json']);
         }
     }, $priority = -100);
 }
 /**
  * {@inheritDoc}
  */
 public function prepend(ContainerBuilder $container)
 {
     $container->prependExtensionConfig('twig', array('paths' => array_flip(array_filter(array('PayumCore' => TwigFactory::guessViewsPath('Payum\\Core\\Gateway'), 'PayumSips' => TwigFactory::guessViewsPath('Ekyna\\Component\\Payum\\Sips\\SipsGatewayFactory'))))));
 }
 /**
  * {@inheritDoc}
  */
 public function prepend(ContainerBuilder $container)
 {
     $container->prependExtensionConfig('twig', array('paths' => array_flip(array_filter(array('PayumCore' => TwigFactory::guessViewsPath(GatewayInterface::class), 'PayumPaypalExpressCheckout' => TwigFactory::guessViewsPath(PaypalExpressCheckoutGatewayFactory::class))))));
 }