/** * {@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'), ))) )); }
/** * @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; }
/** * @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')))))); }
/** * {@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)))))); }