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