From 1c8b1f0e589b5a534a1f6a77714c09140a6aafd0 Mon Sep 17 00:00:00 2001 From: Franck Allimant Date: Fri, 11 Apr 2014 02:19:08 +0200 Subject: [PATCH] Added this abtract class for payment modules. --- .../Thelia/Module/AbstractPaymentModule.php | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 core/lib/Thelia/Module/AbstractPaymentModule.php diff --git a/core/lib/Thelia/Module/AbstractPaymentModule.php b/core/lib/Thelia/Module/AbstractPaymentModule.php new file mode 100644 index 000000000..f80dd17f9 --- /dev/null +++ b/core/lib/Thelia/Module/AbstractPaymentModule.php @@ -0,0 +1,132 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Module; + +use Symfony\Component\Routing\Router; +use Thelia\Core\HttpFoundation\Response; +use Thelia\Core\Template\ParserInterface; +use Thelia\Core\Template\TemplateHelper; +use Thelia\Exception\TheliaProcessException; +use Thelia\Model\Order; +use Thelia\Tools\URL; + +abstract class AbstractPaymentModule extends BaseModule implements PaymentModuleInterface +{ + /** + * This method is called when the payement gateway needs to be invoked. + * + * If this method return a Response instance, this response is sent to the browser. Return null if you don't want to + * send a response and process the payment yourself. + * + * In many cases, it's necessary to send a form to the payment gateway. On your response you can return this form already + * completed, ready to be sent, instead of redirecting. The generateGatewayFormResponse() may help you in this case :) + * + * @param Order $order processed order + * @return null|Response + */ + abstract public function pay(Order $order); + + /** + * This method is called by the Payment loop, to check if the current module has to be displayed to the customer + * + * If you return true, the payment method will de displayed to the customed + * If you return false, the payment method will not be displayed + * + * @return boolean + */ + abstract public function isValidPayment(); + + + /** + * Render the payment gateway template. The module should provide the gateway URL and the form fields names and values. + * + * @param Order $order the order + * @param string $gateway_url the payment gateway URL + * @param array $form_data an associative array of form data, that will be rendered as hiddent fields + * + * @return Response the HTTP response. + */ + public function generateGatewayFormResponse($order, $gateway_url, $form_data) + { + /** @var ParserInterface $parser */ + $parser = $this->container->get("thelia.parser"); + + $parser->setTemplateDefinition(TemplateHelper::getInstance()->getActiveFrontTemplate()); + + $renderedTemplate = $parser->render( + "order-payment-gateway.html", + array( + "order_id" => $order->getId(), + "cart_count" => $this->getRequest()->getSession()->getCart()->getCartItems()->count(), + "gateway_url" => $gateway_url, + "payment_form_data" => $form_data + ) + ); + + return Response::create($renderedTemplate); + } + + /** + * Return the order payment success page URL + * + * @param int $order_id the order ID + * @return string the order payment success page URL + */ + public function getPayementSuccessPageUrl($order_id) + { + $frontOfficeRouter = $this->container->get('router.front'); + + return URL::getInstance()->absoluteUrl( + $frontOfficeRouter->generate( + "order.placed", + array("order_id" => $order_id), + Router::ABSOLUTE_URL + ) + ); + } + + /** + * Redirect the customer to the failure payment page. if $message is null, a generic message is displayed. + * + * @param int $order_id the order ID + * @param string|null $message an error message. + * + * @return string the order payment failure page URL + */ + public function getPayementFailurePageUrl($order_id, $message) + { + $frontOfficeRouter = $this->container->get('router.front'); + + return URL::getInstance()->absoluteUrl( + $frontOfficeRouter->generate( + "order.failed", + array( + "order_id" => $order_id, + "message" => $message + ), + Router::ABSOLUTE_URL + ) + ); + } +}