Des modules ajoutés et mise en page du CSS
This commit is contained in:
113
local/modules/PayPal/Controller/ConfigurationController.php
Executable file
113
local/modules/PayPal/Controller/ConfigurationController.php
Executable file
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
/*************************************************************************************/
|
||||
/* */
|
||||
/* Thelia */
|
||||
/* */
|
||||
/* Copyright (c) OpenStudio */
|
||||
/* email : info@thelia.net */
|
||||
/* web : http://www.thelia.net */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation; either version 3 of the License */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/*************************************************************************************/
|
||||
|
||||
namespace PayPal\Controller;
|
||||
|
||||
use PayPal\Form\ConfigurationForm;
|
||||
use PayPal\PayPal;
|
||||
use Thelia\Controller\Admin\BaseAdminController;
|
||||
use Thelia\Core\Security\AccessManager;
|
||||
use Thelia\Core\Security\Resource\AdminResources;
|
||||
use Thelia\Core\Thelia;
|
||||
use Thelia\Form\Exception\FormValidationException;
|
||||
use Thelia\Tools\URL;
|
||||
use Thelia\Tools\Version\Version;
|
||||
|
||||
/**
|
||||
* Class ConfigurePaypal
|
||||
* @package Paypal\Controller
|
||||
*/
|
||||
class ConfigurationController extends BaseAdminController
|
||||
{
|
||||
/*
|
||||
* Checks paypal.configure || paypal.configure.sandbox form and save config into json file
|
||||
*/
|
||||
/**
|
||||
* @return mixed|\Symfony\Component\HttpFoundation\Response|\Thelia\Core\HttpFoundation\Response
|
||||
*/
|
||||
public function configureAction()
|
||||
{
|
||||
if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'Paypal', AccessManager::UPDATE)) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
$configurationForm = $this->createForm(ConfigurationForm::FORM_NAME);
|
||||
|
||||
try {
|
||||
$form = $this->validateForm($configurationForm, "POST");
|
||||
|
||||
// Get the form field values
|
||||
$data = $form->getData();
|
||||
|
||||
foreach ($data as $name => $value) {
|
||||
if (is_array($value)) {
|
||||
$value = implode(';', $value);
|
||||
}
|
||||
|
||||
Paypal::setConfigValue($name, $value);
|
||||
}
|
||||
|
||||
$this->adminLogAppend(
|
||||
"paypal.configuration.message",
|
||||
AccessManager::UPDATE,
|
||||
sprintf("Paypal configuration updated")
|
||||
);
|
||||
|
||||
if ($this->getRequest()->get('save_mode') == 'stay') {
|
||||
// If we have to stay on the same page, redisplay the configuration page/
|
||||
$url = '/admin/module/Paypal';
|
||||
} else {
|
||||
// If we have to close the page, go back to the module back-office page.
|
||||
$url = '/admin/modules';
|
||||
}
|
||||
|
||||
return $this->generateRedirect(URL::getInstance()->absoluteUrl($url));
|
||||
} catch (FormValidationException $ex) {
|
||||
$error_msg = $this->createStandardFormValidationErrorMessage($ex);
|
||||
} catch (\Exception $ex) {
|
||||
$error_msg = $ex->getMessage();
|
||||
}
|
||||
|
||||
$this->setupFormErrorContext(
|
||||
$this->getTranslator()->trans("Paypal configuration", [], PayPal::DOMAIN_NAME),
|
||||
$error_msg,
|
||||
$configurationForm,
|
||||
$ex
|
||||
);
|
||||
|
||||
// Before 2.2, the errored form is not stored in session
|
||||
if (Version::test(Thelia::THELIA_VERSION, '2.2', false, "<")) {
|
||||
return $this->render('module-configure', [ 'module_code' => PayPal::getModuleCode()]);
|
||||
} else {
|
||||
return $this->generateRedirect(URL::getInstance()->absoluteUrl('/admin/module/PayPal'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Thelia\Core\HttpFoundation\Response
|
||||
*/
|
||||
public function logAction()
|
||||
{
|
||||
return $this->render('paypal/paypal-log');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,315 @@
|
||||
<?php
|
||||
/*************************************************************************************/
|
||||
/* */
|
||||
/* Thelia */
|
||||
/* */
|
||||
/* Copyright (c) OpenStudio */
|
||||
/* email : info@thelia.net */
|
||||
/* web : http://www.thelia.net */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation; either version 3 of the License */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/*************************************************************************************/
|
||||
|
||||
namespace PayPal\Controller;
|
||||
|
||||
use PayPal\Event\PayPalEvents;
|
||||
use PayPal\Event\PayPalPlanifiedPaymentEvent;
|
||||
use PayPal\Form\PayPalFormFields;
|
||||
use PayPal\Form\PayPalPlanifiedPaymentCreateForm;
|
||||
use PayPal\Form\PayPalPlanifiedPaymentUpdateForm;
|
||||
use PayPal\Model\PaypalPlanifiedPayment;
|
||||
use PayPal\Model\PaypalPlanifiedPaymentQuery;
|
||||
use PayPal\PayPal;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Thelia\Controller\Admin\AbstractCrudController;
|
||||
use Thelia\Core\Security\AccessManager;
|
||||
|
||||
/**
|
||||
* Class PayPalPlanifiedPaymentController
|
||||
* @package PayPal\Controller
|
||||
*/
|
||||
class PayPalPlanifiedPaymentController extends AbstractCrudController
|
||||
{
|
||||
/** @var string */
|
||||
protected $currentRouter = PayPal::ROUTER;
|
||||
|
||||
/**
|
||||
* PayPalPlanifiedPaymentController constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(
|
||||
'team',
|
||||
'id',
|
||||
'order',
|
||||
'paypal.back.planified.payment',
|
||||
PayPalEvents::PAYPAL_PLANIFIED_PAYMENT_CREATE,
|
||||
PayPalEvents::PAYPAL_PLANIFIED_PAYMENT_UPDATE,
|
||||
PayPalEvents::PAYPAL_PLANIFIED_PAYMENT_DELETE
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The default action is displaying the list.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function defaultAction()
|
||||
{
|
||||
// Check current user authorization
|
||||
if (null !== $response = $this->checkAuth($this->resourceCode, $this->getModuleCode(), AccessManager::VIEW)) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
return $this->renderList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the creation form for this object
|
||||
* @return PayPalPlanifiedPaymentCreateForm
|
||||
*/
|
||||
protected function getCreationForm()
|
||||
{
|
||||
return $this->createForm(PayPalPlanifiedPaymentCreateForm::FORM_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the update form for this object
|
||||
* @return PayPalPlanifiedPaymentUpdateForm
|
||||
*/
|
||||
protected function getUpdateForm()
|
||||
{
|
||||
return $this->createForm(PayPalPlanifiedPaymentUpdateForm::FORM_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hydrate the update form for this object, before passing it to the update template
|
||||
*
|
||||
* @param PaypalPlanifiedPayment $object
|
||||
* @return PayPalPlanifiedPaymentUpdateForm
|
||||
*/
|
||||
protected function hydrateObjectForm($object)
|
||||
{
|
||||
/** @var \Thelia\Model\Lang $lang */
|
||||
$lang = $this->getRequest()->getSession()->get('thelia.current.lang');
|
||||
$object->getTranslation($lang->getLocale());
|
||||
|
||||
$data = [
|
||||
PayPalFormFields::FIELD_PP_ID => $object->getId(),
|
||||
PayPalFormFields::FIELD_PP_TITLE => $object->getTitle(),
|
||||
PayPalFormFields::FIELD_PP_DESCRIPTION => $object->getDescription(),
|
||||
PayPalFormFields::FIELD_PP_FREQUENCY => $object->getFrequency(),
|
||||
PayPalFormFields::FIELD_PP_FREQUENCY_INTERVAL => $object->getFrequencyInterval(),
|
||||
PayPalFormFields::FIELD_PP_CYCLE => $object->getCycle(),
|
||||
PayPalFormFields::FIELD_PP_MIN_AMOUNT => $object->getMinAmount(),
|
||||
PayPalFormFields::FIELD_PP_MAX_AMOUNT => $object->getMaxAmount(),
|
||||
PayPalFormFields::FIELD_PP_POSITION => $object->getPosition()
|
||||
];
|
||||
|
||||
return $this->createForm(PayPalPlanifiedPaymentUpdateForm::FORM_NAME, 'form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the creation event with the provided form data
|
||||
*
|
||||
* @param mixed $formData
|
||||
* @return PayPalPlanifiedPaymentEvent
|
||||
*/
|
||||
protected function getCreationEvent($formData)
|
||||
{
|
||||
$planifiedPayment = new PaypalPlanifiedPayment();
|
||||
|
||||
$planifiedPayment = $this->fillObjectWithDataForm($planifiedPayment, $formData);
|
||||
|
||||
$planifiedPaymentEvent = new PayPalPlanifiedPaymentEvent($planifiedPayment);
|
||||
|
||||
return $planifiedPaymentEvent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the update event with the provided form data
|
||||
*
|
||||
* @param mixed $formData
|
||||
* @return PayPalPlanifiedPaymentEvent
|
||||
*/
|
||||
protected function getUpdateEvent($formData)
|
||||
{
|
||||
if (null === $planifiedPayment = PaypalPlanifiedPaymentQuery::create()->findOneById($formData[PayPalFormFields::FIELD_PP_ID])) {
|
||||
throw new \InvalidArgumentException(
|
||||
$this->getTranslator()->trans(
|
||||
'Invalid planified payment id : %id',
|
||||
['%id' => $formData[PayPalFormFields::FIELD_PP_ID]],
|
||||
PayPal::DOMAIN_NAME
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$planifiedPayment = $this->fillObjectWithDataForm($planifiedPayment, $formData);
|
||||
|
||||
$planifiedPaymentEvent = new PayPalPlanifiedPaymentEvent($planifiedPayment);
|
||||
|
||||
return $planifiedPaymentEvent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PaypalPlanifiedPayment $planifiedPayment
|
||||
* @param $formData
|
||||
* @return PaypalPlanifiedPayment
|
||||
*/
|
||||
protected function fillObjectWithDataForm(PaypalPlanifiedPayment $planifiedPayment, $formData)
|
||||
{
|
||||
$planifiedPayment
|
||||
->setFrequency($formData[PayPalFormFields::FIELD_PP_FREQUENCY])
|
||||
->setFrequencyInterval($formData[PayPalFormFields::FIELD_PP_FREQUENCY_INTERVAL])
|
||||
->setCycle($formData[PayPalFormFields::FIELD_PP_CYCLE])
|
||||
->setMinAmount($formData[PayPalFormFields::FIELD_PP_MIN_AMOUNT])
|
||||
->setMaxAmount($formData[PayPalFormFields::FIELD_PP_MAX_AMOUNT])
|
||||
->setLocale($formData[PayPalFormFields::FIELD_PP_LOCALE])
|
||||
->setTitle($formData[PayPalFormFields::FIELD_PP_TITLE])
|
||||
->setDescription($formData[PayPalFormFields::FIELD_PP_DESCRIPTION])
|
||||
;
|
||||
|
||||
return $planifiedPayment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the delete event with the provided form data
|
||||
* @return PayPalPlanifiedPaymentEvent
|
||||
*/
|
||||
protected function getDeleteEvent()
|
||||
{
|
||||
return new PayPalPlanifiedPaymentEvent(
|
||||
$this->getExistingObject()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the event contains the object, e.g. the action has updated the object in the event.
|
||||
*
|
||||
* @param PayPalPlanifiedPaymentEvent $event
|
||||
* @return bool
|
||||
*/
|
||||
protected function eventContainsObject($event)
|
||||
{
|
||||
return $event->getPayPalPlanifiedPayment() ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the created object from an event.
|
||||
* @param PayPalPlanifiedPaymentEvent $event
|
||||
* @return PaypalPlanifiedPayment
|
||||
*/
|
||||
protected function getObjectFromEvent($event)
|
||||
{
|
||||
return $event->getPayPalPlanifiedPayment();
|
||||
}
|
||||
|
||||
/**
|
||||
* Load an existing object from the database
|
||||
* @return PaypalPlanifiedPayment
|
||||
*/
|
||||
protected function getExistingObject()
|
||||
{
|
||||
if (null === $planifiedPayment = PaypalPlanifiedPaymentQuery::create()->findOneById((int)$this->getRequest()->get('planifiedPaymentId'))) {
|
||||
throw new \InvalidArgumentException(
|
||||
$this->getTranslator()->trans('Invalid planified payment id : %id',
|
||||
['%id' => (int)$this->getRequest()->get('planifiedPaymentId')], PayPal::DOMAIN_NAME)
|
||||
);
|
||||
}
|
||||
|
||||
return $planifiedPayment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the object label form the object event (name, title, etc.)
|
||||
*
|
||||
* @param PaypalPlanifiedPayment $object
|
||||
* @return string
|
||||
*/
|
||||
protected function getObjectLabel($object)
|
||||
{
|
||||
return $object->getTitle();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the object ID from the object
|
||||
*
|
||||
* @param PaypalPlanifiedPayment $object
|
||||
* @return int
|
||||
*/
|
||||
protected function getObjectId($object)
|
||||
{
|
||||
return $object->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the main list template
|
||||
*
|
||||
* @param mixed $currentOrder , if any, null otherwise.
|
||||
* @return Response
|
||||
*/
|
||||
protected function renderListTemplate($currentOrder)
|
||||
{
|
||||
$this->getListOrderFromSession('planified_payment', 'order', 'manual');
|
||||
|
||||
return $this->render(
|
||||
'paypal/planified-payment',
|
||||
[
|
||||
'order' => $currentOrder,
|
||||
'selected_menu' => 'planified'
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the edition template
|
||||
* @return Response
|
||||
*/
|
||||
protected function renderEditionTemplate()
|
||||
{
|
||||
return $this->render('paypal/planified-payment-edit', $this->getEditionArguments());
|
||||
}
|
||||
|
||||
/**
|
||||
* Must return a RedirectResponse instance
|
||||
* @return Response
|
||||
*/
|
||||
protected function redirectToEditionTemplate()
|
||||
{
|
||||
return $this->generateRedirectFromRoute(
|
||||
'paypal.admin.configuration.planified.update',
|
||||
[],
|
||||
$this->getEditionArguments()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Must return a RedirectResponse instance
|
||||
* @return Response
|
||||
*/
|
||||
protected function redirectToListTemplate()
|
||||
{
|
||||
return $this->generateRedirectFromRoute('paypal.admin.configuration.planified');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
private function getEditionArguments()
|
||||
{
|
||||
return [
|
||||
'planifiedPaymentId' => (int)$this->getRequest()->get('planifiedPaymentId')
|
||||
];
|
||||
}
|
||||
}
|
||||
936
local/modules/PayPal/Controller/PayPalResponseController.php
Normal file
936
local/modules/PayPal/Controller/PayPalResponseController.php
Normal file
@@ -0,0 +1,936 @@
|
||||
<?php
|
||||
/*************************************************************************************/
|
||||
/* */
|
||||
/* Thelia */
|
||||
/* */
|
||||
/* Copyright (c) OpenStudio */
|
||||
/* email : info@thelia.net */
|
||||
/* web : http://www.thelia.net */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation; either version 3 of the License */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/*************************************************************************************/
|
||||
|
||||
namespace PayPal\Controller;
|
||||
|
||||
use Front\Controller\OrderController;
|
||||
use Monolog\Logger;
|
||||
use PayPal\Api\Details;
|
||||
use PayPal\Api\PayerInfo;
|
||||
use PayPal\Event\PayPalCartEvent;
|
||||
use PayPal\Event\PayPalCustomerEvent;
|
||||
use PayPal\Event\PayPalEvents;
|
||||
use PayPal\Event\PayPalOrderEvent;
|
||||
use PayPal\Exception\PayPalConnectionException;
|
||||
use PayPal\Model\PaypalCart;
|
||||
use PayPal\Model\PaypalCartQuery;
|
||||
use PayPal\Model\PaypalCustomer;
|
||||
use PayPal\Model\PaypalCustomerQuery;
|
||||
use PayPal\Model\PaypalOrder;
|
||||
use PayPal\Model\PaypalOrderQuery;
|
||||
use PayPal\PayPal;
|
||||
use PayPal\Service\PayPalAgreementService;
|
||||
use PayPal\Service\PayPalCustomerService;
|
||||
use PayPal\Service\PayPalLoggerService;
|
||||
use PayPal\Service\PayPalPaymentService;
|
||||
use Propel\Runtime\Propel;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Symfony\Component\Routing\Router;
|
||||
use Thelia\Core\Event\Address\AddressCreateOrUpdateEvent;
|
||||
use Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent;
|
||||
use Thelia\Core\Event\Customer\CustomerLoginEvent;
|
||||
use Thelia\Core\Event\Delivery\DeliveryPostageEvent;
|
||||
use Thelia\Core\Event\Order\OrderEvent;
|
||||
use Thelia\Core\Event\Order\OrderManualEvent;
|
||||
use Thelia\Core\Event\TheliaEvents;
|
||||
use Thelia\Core\Translation\Translator;
|
||||
use Thelia\Model\AddressQuery;
|
||||
use Thelia\Model\CartQuery;
|
||||
use Thelia\Model\Country;
|
||||
use Thelia\Model\CountryQuery;
|
||||
use Thelia\Model\CustomerQuery;
|
||||
use Thelia\Model\CustomerTitleQuery;
|
||||
use Thelia\Model\ModuleQuery;
|
||||
use Thelia\Model\Order;
|
||||
use Thelia\Model\OrderQuery;
|
||||
use Thelia\Model\OrderStatusQuery;
|
||||
use Thelia\Module\Exception\DeliveryException;
|
||||
use Thelia\Tools\URL;
|
||||
|
||||
|
||||
/**
|
||||
* Class PayPalResponseController
|
||||
* @package PayPal\Controller
|
||||
*/
|
||||
class PayPalResponseController extends OrderController
|
||||
{
|
||||
/**
|
||||
* @param $orderId
|
||||
*/
|
||||
public function cancelAction($orderId)
|
||||
{
|
||||
if (null !== $order = OrderQuery::create()->findOneById($orderId)) {
|
||||
$event = new OrderEvent($order);
|
||||
$event->setStatus(OrderStatusQuery::getCancelledStatus()->getId());
|
||||
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $orderId
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function okAction($orderId)
|
||||
{
|
||||
$con = Propel::getConnection();
|
||||
$con->beginTransaction();
|
||||
|
||||
try {
|
||||
$payerId = $this->getRequest()->query->get('PayerID');
|
||||
$token = $this->getRequest()->query->get('token');
|
||||
$payPalOrder = PaypalOrderQuery::create()->findOneById($orderId);
|
||||
|
||||
if (null !== $payPalOrder && null !== $payerId) {
|
||||
|
||||
$response = $this->executePayment($payPalOrder, $payPalOrder->getPaymentId(), $payerId, $token);
|
||||
} else {
|
||||
$con->rollBack();
|
||||
$message = Translator::getInstance()->trans(
|
||||
'Method okAction => One of this parameter is invalid : $payerId = %payer_id, $orderId = %order_id',
|
||||
[
|
||||
'%payer_id' => $payerId,
|
||||
'%order_id' => $orderId
|
||||
],
|
||||
PayPal::DOMAIN_NAME
|
||||
);
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$message,
|
||||
[
|
||||
'order_id' => $orderId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
|
||||
$response = $this->getPaymentFailurePageUrl($orderId, $message);
|
||||
}
|
||||
} catch (PayPalConnectionException $e) {
|
||||
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
|
||||
PayPalLoggerService::log(
|
||||
$message,
|
||||
[
|
||||
'order_id' => $orderId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
|
||||
} catch (\Exception $e) {
|
||||
PayPalLoggerService::log(
|
||||
$e->getMessage(),
|
||||
[
|
||||
'order_id' => $orderId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
|
||||
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
|
||||
}
|
||||
|
||||
$con->commit();
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $routeId
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function expressCheckoutAction($routeId = 'cart.view', $fromCartView = true)
|
||||
{
|
||||
$session = $this->getRequest()->getSession();
|
||||
$cart = $session->getSessionCart($this->getDispatcher());
|
||||
|
||||
if (null !== $cart) {
|
||||
/** @var PayPalPaymentService $payPalService */
|
||||
$payPalService = $this->getContainer()->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
|
||||
|
||||
$payment = $payPalService->makePaymentFromCart(
|
||||
$cart,
|
||||
null,
|
||||
false,
|
||||
$fromCartView
|
||||
);
|
||||
$response = new RedirectResponse($payment->getApprovalLink());
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
return $this->getUrlFromRouteId('cart.view');
|
||||
}
|
||||
|
||||
public function invoiceExpressCheckoutAction()
|
||||
{
|
||||
return $this->expressCheckoutAction('order.invoice', false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $cartId
|
||||
* @return RedirectResponse
|
||||
* @throws PayPalConnectionException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function invoiceExpressCheckoutOkAction($cartId)
|
||||
{
|
||||
$con = Propel::getConnection();
|
||||
$con->beginTransaction();
|
||||
|
||||
try {
|
||||
$this->fillCartWithExpressCheckout();
|
||||
|
||||
$response = $this->executeExpressCheckoutAction(false);
|
||||
|
||||
} catch (PayPalConnectionException $e) {
|
||||
$con->rollBack();
|
||||
|
||||
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
|
||||
$customerId = null;
|
||||
if (isset($customer)) {
|
||||
$customerId = $customer->getId();
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$message,
|
||||
[
|
||||
'customer_id' => $customerId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
throw $e;
|
||||
} catch(\Exception $e) {
|
||||
$con->rollBack();
|
||||
|
||||
$customerId = null;
|
||||
if (isset($customer)) {
|
||||
$customerId = $customer->getId();
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$e->getMessage(),
|
||||
[
|
||||
'customer_id' => $customerId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
throw $e;
|
||||
}
|
||||
|
||||
$con->commit();
|
||||
return $response;
|
||||
}
|
||||
|
||||
public function invoiceExpressCheckoutKoAction($cartId)
|
||||
{
|
||||
return $this->getUrlFromRouteId('order.invoice');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return RedirectResponse
|
||||
* @throws PayPalConnectionException
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function expressCheckoutOkAction()
|
||||
{
|
||||
$con = Propel::getConnection();
|
||||
$con->beginTransaction();
|
||||
|
||||
try {
|
||||
$this->fillCartWithExpressCheckout();
|
||||
|
||||
$response = $this->getUrlFromRouteId('order.delivery');
|
||||
|
||||
|
||||
} catch (PayPalConnectionException $e) {
|
||||
$con->rollBack();
|
||||
|
||||
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
|
||||
$customerId = null;
|
||||
if (isset($customer)) {
|
||||
$customerId = $customer->getId();
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$message,
|
||||
[
|
||||
'customer_id' => $customerId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
throw $e;
|
||||
} catch(\Exception $e) {
|
||||
$con->rollBack();
|
||||
|
||||
$customerId = null;
|
||||
if (isset($customer)) {
|
||||
$customerId = $customer->getId();
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$e->getMessage(),
|
||||
[
|
||||
'customer_id' => $customerId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
throw $e;
|
||||
}
|
||||
|
||||
$con->commit();
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return RedirectResponse|\Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function executeExpressCheckoutAction($fromCartView = true)
|
||||
{
|
||||
if (null === $responseParent = parent::deliver()) {
|
||||
|
||||
if ($fromCartView) {
|
||||
return $responseParent;
|
||||
}
|
||||
}
|
||||
|
||||
$con = Propel::getConnection();
|
||||
$con->beginTransaction();
|
||||
|
||||
try {
|
||||
$session = $this->getRequest()->getSession();
|
||||
$cart = $session->getSessionCart($this->getDispatcher());
|
||||
|
||||
if (null === $payPalCart = PaypalCartQuery::create()->findOneById($cart->getId())) {
|
||||
$con->rollBack();
|
||||
return $responseParent;
|
||||
}
|
||||
|
||||
if (null === $payPalCart->getExpressPaymentId() || null === $payPalCart->getExpressPayerId() || null === $payPalCart->getExpressToken()) {
|
||||
$con->rollBack();
|
||||
return $responseParent;
|
||||
}
|
||||
|
||||
/** @var PayPalPaymentService $payPalPaymentService */
|
||||
$payPalPaymentService = $this->container->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
|
||||
$payment = $payPalPaymentService->getPaymentDetails($payPalCart->getExpressPaymentId());
|
||||
|
||||
$payerInfo = $payment->getPayer()->getPayerInfo();
|
||||
|
||||
//Check if invoice adresse already exist
|
||||
if (null === $payerInfo->getBillingAddress()) {
|
||||
$line1 = $payerInfo->getShippingAddress()->getLine1();
|
||||
$zipCode = $payerInfo->getShippingAddress()->getPostalCode();
|
||||
} else {
|
||||
$line1 = $payerInfo->getBillingAddress()->getLine1();
|
||||
$zipCode = $payerInfo->getBillingAddress()->getPostalCode();
|
||||
}
|
||||
|
||||
/** @var \Thelia\Model\Address $invoiceAddress */
|
||||
if (null === $invoiceAddress = AddressQuery::create()
|
||||
->filterByCustomerId($cart->getCustomerId())
|
||||
->filterByIsDefault(0)
|
||||
->filterByAddress1($line1)
|
||||
->filterByZipcode($zipCode)
|
||||
->findOne()) {
|
||||
|
||||
$event = $this->createAddressEvent($payerInfo);
|
||||
$event->setCustomer($cart->getCustomer());
|
||||
|
||||
$this->dispatch(TheliaEvents::ADDRESS_CREATE, $event);
|
||||
$invoiceAddress = $event->getAddress();
|
||||
}
|
||||
|
||||
if (null === $payPalCustomer = PaypalCustomerQuery::create()->findOneById($cart->getCustomerId())) {
|
||||
$payPalCustomer = new PaypalCustomer();
|
||||
$payPalCustomer->setId($cart->getCustomerId());
|
||||
}
|
||||
|
||||
$payPalCustomer
|
||||
->setPaypalUserId($payerInfo->getPayerId())
|
||||
->setName($payerInfo->getFirstName())
|
||||
->setGivenName($payerInfo->getFirstName() . ' ' . $payerInfo->getLastName())
|
||||
->setFamilyName($payerInfo->getLastName())
|
||||
->setMiddleName($payerInfo->getMiddleName())
|
||||
->setBirthday($payerInfo->getBirthDate())
|
||||
->setLocale($this->getRequest()->getSession()->getLang()->getLocale())
|
||||
->setPhoneNumber($payerInfo->getPhone())
|
||||
->setPayerId($payerInfo->getPayerId())
|
||||
->setPostalCode($payerInfo->getShippingAddress()->getPostalCode())
|
||||
->setCountry($payerInfo->getShippingAddress()->getCountryCode())
|
||||
->setStreetAddress($payerInfo->getShippingAddress()->getLine1() . $payerInfo->getShippingAddress()->getLine2())
|
||||
;
|
||||
|
||||
$payPalCustomerEvent = new PayPalCustomerEvent($payPalCustomer);
|
||||
$this->dispatch(PayPalEvents::PAYPAL_CUSTOMER_UPDATE, $payPalCustomerEvent);
|
||||
|
||||
/** @var \Thelia\Model\Address $deliveryAddress */
|
||||
$deliveryAddress = $cart->getCustomer()->getDefaultAddress();
|
||||
|
||||
/** @var \Thelia\Model\Module $deliveryModule */
|
||||
$deliveryModule = ModuleQuery::create()->filterByActivate(1)->findOne();
|
||||
/** @var \Thelia\Model\Module $paymentModule */
|
||||
$paymentModule = ModuleQuery::create()->findPk(PayPal::getModuleId());
|
||||
|
||||
/** @var \Thelia\Model\Currency $currency */
|
||||
$currency = $cart->getCurrency();
|
||||
$lang = $this->getRequest()->getSession()->getLang();
|
||||
|
||||
$order = new Order();
|
||||
$order
|
||||
->setCustomerId($cart->getCustomerId())
|
||||
->setCurrencyId($currency->getId())
|
||||
->setCurrencyRate($currency->getRate())
|
||||
->setStatusId(OrderStatusQuery::getNotPaidStatus()->getId())
|
||||
->setLangId($lang->getDefaultLanguage()->getId())
|
||||
->setChoosenDeliveryAddress($deliveryAddress)
|
||||
->setChoosenInvoiceAddress($invoiceAddress)
|
||||
;
|
||||
|
||||
$orderEvent = new OrderEvent($order);
|
||||
|
||||
/* get postage amount */
|
||||
$moduleInstance = $deliveryModule->getDeliveryModuleInstance($this->container);
|
||||
$deliveryPostageEvent = new DeliveryPostageEvent($moduleInstance, $cart, $deliveryAddress);
|
||||
|
||||
$this->getDispatcher()->dispatch(
|
||||
TheliaEvents::MODULE_DELIVERY_GET_POSTAGE,
|
||||
$deliveryPostageEvent
|
||||
);
|
||||
|
||||
if (!$deliveryPostageEvent->isValidModule() || null === $deliveryPostageEvent->getPostage()) {
|
||||
throw new DeliveryException(
|
||||
$this->getTranslator()->trans('The delivery module is not valid.', [], PayPal::DOMAIN_NAME)
|
||||
);
|
||||
}
|
||||
|
||||
$postage = $deliveryPostageEvent->getPostage();
|
||||
|
||||
$orderEvent->setPostage($postage->getAmount());
|
||||
$orderEvent->setPostageTax($postage->getAmountTax());
|
||||
$orderEvent->setPostageTaxRuleTitle($postage->getTaxRuleTitle());
|
||||
$orderEvent->setDeliveryAddress($deliveryAddress->getId());
|
||||
$orderEvent->setInvoiceAddress($invoiceAddress->getId());
|
||||
$orderEvent->setDeliveryModule($deliveryModule->getId());
|
||||
$orderEvent->setPaymentModule($paymentModule->getId());
|
||||
|
||||
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_ADDRESS, $orderEvent);
|
||||
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_INVOICE_ADDRESS, $orderEvent);
|
||||
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent);
|
||||
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent);
|
||||
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_PAYMENT_MODULE, $orderEvent);
|
||||
|
||||
$orderManualEvent = new OrderManualEvent(
|
||||
$orderEvent->getOrder(),
|
||||
$orderEvent->getOrder()->getCurrency(),
|
||||
$orderEvent->getOrder()->getLang(),
|
||||
$cart,
|
||||
$cart->getCustomer()
|
||||
);
|
||||
|
||||
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_CREATE_MANUAL, $orderManualEvent);
|
||||
$order = $orderManualEvent->getPlacedOrder();
|
||||
|
||||
$payPalOrderEvent = $payPalPaymentService->generatePayPalOrder($order);
|
||||
$payPalPaymentService->updatePayPalOrder($payPalOrderEvent->getPayPalOrder(), $payment->getState(), $payment->getId());
|
||||
|
||||
$response = $this->executePayment(
|
||||
$payPalOrderEvent->getPayPalOrder(),
|
||||
$payPalCart->getExpressPaymentId(),
|
||||
$payPalCart->getExpressPayerId(),
|
||||
$payPalCart->getExpressToken(),
|
||||
PayPal::PAYPAL_METHOD_EXPRESS_CHECKOUT,
|
||||
$payPalPaymentService->createDetails(
|
||||
$order->getPostage(),
|
||||
$order->getPostageTax(),
|
||||
$order->getTotalAmount($tax, false)
|
||||
)
|
||||
);
|
||||
|
||||
$con->commit();
|
||||
} catch (PayPalConnectionException $e) {
|
||||
$con->rollBack();
|
||||
|
||||
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
|
||||
$customerId = null;
|
||||
if (isset($customer)) {
|
||||
$customerId = $customer->getId();
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$message,
|
||||
[
|
||||
'customer_id' => $customerId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
$response = $responseParent;
|
||||
} catch(\Exception $e) {
|
||||
$con->rollBack();
|
||||
|
||||
$customerId = null;
|
||||
if (isset($customer)) {
|
||||
$customerId = $customer->getId();
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$e->getMessage(),
|
||||
[
|
||||
'customer_id' => $customerId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
$response = $responseParent;
|
||||
}
|
||||
|
||||
$con->commit();
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function expressCheckoutKoAction()
|
||||
{
|
||||
PayPalLoggerService::log(
|
||||
Translator::getInstance()->trans('Express Checkout login failed', [], PayPal::DOMAIN_NAME),
|
||||
[],
|
||||
Logger::WARNING
|
||||
);
|
||||
return $this->getUrlFromRouteId('cart.view');
|
||||
}
|
||||
|
||||
/**
|
||||
* Method called when a customer log in with PayPal.
|
||||
* @return RedirectResponse
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function loginOkAction()
|
||||
{
|
||||
if (null !== $authorizationCode = $this->getRequest()->query->get('code')) {
|
||||
|
||||
/** @var PayPalCustomerService $payPalCustomerService */
|
||||
$payPalCustomerService = $this->container->get(PayPal::PAYPAL_CUSTOMER_SERVICE_ID);
|
||||
$openIdUserinfo = $payPalCustomerService->getUserInfoWithAuthorizationCode($authorizationCode);
|
||||
|
||||
$payPalCustomer = $payPalCustomerService->getCurrentPayPalCustomer();
|
||||
$payPalCustomer
|
||||
->setPaypalUserId($openIdUserinfo->getUserId())
|
||||
->setName($openIdUserinfo->getName())
|
||||
->setGivenName($openIdUserinfo->getGivenName())
|
||||
->setFamilyName($openIdUserinfo->getFamilyName())
|
||||
->setMiddleName($openIdUserinfo->getMiddleName())
|
||||
->setPicture($openIdUserinfo->getPicture())
|
||||
->setEmailVerified($openIdUserinfo->getEmailVerified())
|
||||
->setGender($openIdUserinfo->getGender())
|
||||
->setBirthday($openIdUserinfo->getBirthday())
|
||||
->setZoneinfo($openIdUserinfo->getZoneinfo())
|
||||
->setLocale($openIdUserinfo->getLocale())
|
||||
->setLanguage($openIdUserinfo->getLanguage())
|
||||
->setVerified($openIdUserinfo->getVerified())
|
||||
->setPhoneNumber($openIdUserinfo->getPhoneNumber())
|
||||
->setVerifiedAccount($openIdUserinfo->getVerifiedAccount())
|
||||
->setAccountType($openIdUserinfo->getAccountType())
|
||||
->setAgeRange($openIdUserinfo->getAgeRange())
|
||||
->setPayerId($openIdUserinfo->getPayerId())
|
||||
->setPostalCode($openIdUserinfo->getAddress()->getPostalCode())
|
||||
->setLocality($openIdUserinfo->getAddress()->getLocality())
|
||||
->setRegion($openIdUserinfo->getAddress()->getRegion())
|
||||
->setCountry($openIdUserinfo->getAddress()->getCountry())
|
||||
->setStreetAddress($openIdUserinfo->getAddress()->getStreetAddress())
|
||||
;
|
||||
|
||||
$payPalCustomerEvent = new PayPalCustomerEvent($payPalCustomer);
|
||||
$this->dispatch(PayPalEvents::PAYPAL_CUSTOMER_UPDATE, $payPalCustomerEvent);
|
||||
|
||||
$this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($payPalCustomerEvent->getPayPalCustomer()->getCustomer()));
|
||||
}
|
||||
|
||||
return new RedirectResponse(URL::getInstance()->absoluteUrl($this->getSession()->getReturnToUrl()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $orderId
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function agreementOkAction($orderId)
|
||||
{
|
||||
$con = Propel::getConnection();
|
||||
$con->beginTransaction();
|
||||
|
||||
$token = $this->getRequest()->query->get('token');
|
||||
$payPalOrder = PaypalOrderQuery::create()->findOneById($orderId);
|
||||
|
||||
if (null !== $payPalOrder && null !== $token) {
|
||||
|
||||
try {
|
||||
/** @var PayPalAgreementService $payPalAgreementService */
|
||||
$payPalAgreementService = $this->container->get(PayPal::PAYPAL_AGREEMENT_SERVICE_ID);
|
||||
$agreement = $payPalAgreementService->activateBillingAgreementByToken($token);
|
||||
|
||||
$payPalOrder
|
||||
->setState($agreement->getState())
|
||||
->setAgreementId($agreement->getId())
|
||||
->setPayerId($agreement->getPayer()->getPayerInfo()->getPayerId())
|
||||
->setToken($token)
|
||||
;
|
||||
$payPalOrderEvent = new PayPalOrderEvent($payPalOrder);
|
||||
$this->dispatch(PayPalEvents::PAYPAL_ORDER_UPDATE, $payPalOrderEvent);
|
||||
|
||||
$event = new OrderEvent($payPalOrder->getOrder());
|
||||
$event->setStatus(OrderStatusQuery::getPaidStatus()->getId());
|
||||
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
|
||||
|
||||
$response = $this->getPaymentSuccessPageUrl($orderId);
|
||||
PayPalLoggerService::log(
|
||||
Translator::getInstance()->trans(
|
||||
'Order payed with success in PayPal with method : %method',
|
||||
[
|
||||
'%method' => PayPal::PAYPAL_METHOD_PLANIFIED_PAYMENT
|
||||
],
|
||||
PayPal::DOMAIN_NAME
|
||||
),
|
||||
[
|
||||
'order_id' => $payPalOrder->getId(),
|
||||
'customer_id' => $payPalOrder->getOrder()->getCustomerId()
|
||||
],
|
||||
Logger::INFO
|
||||
);
|
||||
} catch (PayPalConnectionException $e) {
|
||||
$con->rollBack();
|
||||
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
|
||||
PayPalLoggerService::log(
|
||||
$message,
|
||||
[
|
||||
'customer_id' => $orderId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
|
||||
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
|
||||
} catch (\Exception $e) {
|
||||
$con->rollBack();
|
||||
PayPalLoggerService::log(
|
||||
$e->getMessage(),
|
||||
[
|
||||
'order_id' => $orderId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
|
||||
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
|
||||
}
|
||||
|
||||
} else {
|
||||
$con->rollBack();
|
||||
$message = Translator::getInstance()->trans(
|
||||
'Method agreementOkAction => One of this parameter is invalid : $token = %token, $orderId = %order_id',
|
||||
[
|
||||
'%token' => $token,
|
||||
'%order_id' => $orderId
|
||||
],
|
||||
PayPal::DOMAIN_NAME
|
||||
);
|
||||
|
||||
PayPalLoggerService::log(
|
||||
$message,
|
||||
[
|
||||
'order_id' => $orderId
|
||||
],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
|
||||
$response = $this->getPaymentFailurePageUrl($orderId, $message);
|
||||
}
|
||||
|
||||
$con->commit();
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $orderId
|
||||
*/
|
||||
public function ipnAction($orderId)
|
||||
{
|
||||
PayPalLoggerService::log('GUIGIT', ['hook' => 'guigit', 'order_id' => $orderId], Logger::DEBUG);
|
||||
|
||||
PayPalLoggerService::log(
|
||||
print_r($this->getRequest()->request, true),
|
||||
[
|
||||
'hook' => 'guigit',
|
||||
'order_id' => $orderId
|
||||
],
|
||||
Logger::DEBUG
|
||||
);
|
||||
PayPalLoggerService::log(
|
||||
print_r($this->getRequest()->attributes, true),
|
||||
[
|
||||
'hook' => 'guigit',
|
||||
'order_id' => $orderId
|
||||
],
|
||||
Logger::DEBUG
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the order payment success page URL
|
||||
*
|
||||
* @param $orderId
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function getPaymentSuccessPageUrl($orderId)
|
||||
{
|
||||
return $this->getUrlFromRouteId('order.placed', ['order_id' => $orderId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \Exception
|
||||
* @throws \Propel\Runtime\Exception\PropelException
|
||||
*/
|
||||
protected function fillCartWithExpressCheckout()
|
||||
{
|
||||
$paymentId = $this->getRequest()->get('paymentId');
|
||||
$token = $this->getRequest()->get('token');
|
||||
$payerId = $this->getRequest()->get('PayerID');
|
||||
$cartId = $this->getRequest()->get('cartId');
|
||||
$cart = CartQuery::create()->findOneById($this->getRequest()->get('cartId'));
|
||||
|
||||
if (null === $paymentId || null === $token || null === $payerId || null === $cart) {
|
||||
PayPalLoggerService::log(
|
||||
Translator::getInstance()->trans('Express checkout failed in expressCheckoutOkAction() function', [], PayPal::DOMAIN_NAME),
|
||||
[],
|
||||
Logger::CRITICAL
|
||||
);
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
Translator::getInstance()->trans('Express checkout begin with cart %id', ['%id' => $cartId], PayPal::DOMAIN_NAME)
|
||||
);
|
||||
|
||||
/** @var PayPalPaymentService $payPalPaymentService */
|
||||
$payPalPaymentService = $this->container->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
|
||||
$payment = $payPalPaymentService->getPaymentDetails($paymentId);
|
||||
|
||||
$payerInfo = $payment->getPayer()->getPayerInfo();
|
||||
if (null === $customer = CustomerQuery::create()->findOneByEmail($payment->getPayer()->getPayerInfo()->getEmail())) {
|
||||
|
||||
$customerCreateEvent = $this->createEventInstance($payerInfo);
|
||||
|
||||
$this->dispatch(TheliaEvents::CUSTOMER_CREATEACCOUNT, $customerCreateEvent);
|
||||
|
||||
$customer = $customerCreateEvent->getCustomer();
|
||||
|
||||
}
|
||||
|
||||
//Save informations to use them after customer has choosen the delivery method
|
||||
if (null === $payPalCart = PaypalCartQuery::create()->findOneById($cartId)) {
|
||||
$payPalCart = new PaypalCart();
|
||||
$payPalCart->setId($cartId);
|
||||
}
|
||||
|
||||
$payPalCart
|
||||
->setExpressPaymentId($paymentId)
|
||||
->setExpressPayerId($payerId)
|
||||
->setExpressToken($token)
|
||||
;
|
||||
$payPalCartEvent = new PayPalCartEvent($payPalCart);
|
||||
$this->getDispatcher()->dispatch(PayPalEvents::PAYPAL_CART_UPDATE, $payPalCartEvent);
|
||||
|
||||
$cart->setCustomerId($customer->getId())->save();
|
||||
$clonedCart = clone $cart;
|
||||
$this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($customer));
|
||||
|
||||
//In case of the current customer has changed, re affect the correct cart and customer session
|
||||
$this->getSecurityContext()->setCustomerUser($customer);
|
||||
$clonedCart->save();
|
||||
$this->getRequest()->getSession()->set("thelia.cart_id", $clonedCart->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $routeId
|
||||
* @param array $params
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
protected function getUrlFromRouteId($routeId, $params = [])
|
||||
{
|
||||
$frontOfficeRouter = $this->getContainer()->get('router.front');
|
||||
|
||||
return new RedirectResponse(
|
||||
URL::getInstance()->absoluteUrl(
|
||||
$frontOfficeRouter->generate(
|
||||
$routeId,
|
||||
$params,
|
||||
Router::ABSOLUTE_URL
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirect the customer to the failure payment page. if $message is null, a generic message is displayed.
|
||||
*
|
||||
* @param $orderId
|
||||
* @param $message
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
public function getPaymentFailurePageUrl($orderId, $message)
|
||||
{
|
||||
$frontOfficeRouter = $this->getContainer()->get('router.front');
|
||||
|
||||
return new RedirectResponse(
|
||||
URL::getInstance()->absoluteUrl(
|
||||
$frontOfficeRouter->generate(
|
||||
"order.failed",
|
||||
array(
|
||||
"order_id" => $orderId,
|
||||
"message" => $message
|
||||
),
|
||||
Router::ABSOLUTE_URL
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PaypalOrder $payPalOrder
|
||||
* @param $paymentId
|
||||
* @param $payerId
|
||||
* @param $token
|
||||
* @param string $method
|
||||
* @param Details|null $details
|
||||
* @return RedirectResponse
|
||||
*/
|
||||
protected function executePayment(PaypalOrder $payPalOrder, $paymentId, $payerId, $token, $method = PayPal::PAYPAL_METHOD_PAYPAL, Details $details = null)
|
||||
{
|
||||
/** @var PayPalPaymentService $payPalService */
|
||||
$payPalService = $this->getContainer()->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
|
||||
$payment = $payPalService->executePayment($paymentId, $payerId, $details);
|
||||
|
||||
$payPalOrder
|
||||
->setState($payment->getState())
|
||||
->setPayerId($payerId)
|
||||
->setToken($token)
|
||||
;
|
||||
$payPalOrderEvent = new PayPalOrderEvent($payPalOrder);
|
||||
$this->dispatch(PayPalEvents::PAYPAL_ORDER_UPDATE, $payPalOrderEvent);
|
||||
|
||||
$event = new OrderEvent($payPalOrder->getOrder());
|
||||
$event->setStatus(OrderStatusQuery::getPaidStatus()->getId());
|
||||
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
|
||||
|
||||
$response = $this->getPaymentSuccessPageUrl($payPalOrder->getId());
|
||||
|
||||
PayPalLoggerService::log(
|
||||
Translator::getInstance()->trans(
|
||||
'Order payed with success in PayPal with method : %method',
|
||||
[
|
||||
'%method' => $method
|
||||
],
|
||||
PayPal::DOMAIN_NAME
|
||||
),
|
||||
[
|
||||
'order_id' => $payPalOrder->getId(),
|
||||
'customer_id' => $payPalOrder->getOrder()->getCustomerId()
|
||||
],
|
||||
Logger::INFO
|
||||
);
|
||||
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PayerInfo $payerInfo
|
||||
* @return \Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent
|
||||
*/
|
||||
protected function createEventInstance(PayerInfo $payerInfo)
|
||||
{
|
||||
if (null === $country = CountryQuery::create()->findOneByIsoalpha2($payerInfo->getShippingAddress()->getCountryCode())) {
|
||||
$country = Country::getDefaultCountry();
|
||||
}
|
||||
|
||||
$customerCreateEvent = new CustomerCreateOrUpdateEvent(
|
||||
CustomerTitleQuery::create()->findOne()->getId(),
|
||||
$payerInfo->getFirstName(),
|
||||
$payerInfo->getLastName(),
|
||||
$payerInfo->getShippingAddress()->getLine1(),
|
||||
$payerInfo->getShippingAddress()->getLine2(),
|
||||
null,
|
||||
$payerInfo->getPhone(),
|
||||
null,
|
||||
$payerInfo->getShippingAddress()->getPostalCode(),
|
||||
$payerInfo->getShippingAddress()->getCity(),
|
||||
$country->getId(),
|
||||
$payerInfo->getEmail(),
|
||||
'random',
|
||||
$this->getRequest()->getSession()->getLang()->getId(),
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
return $customerCreateEvent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PayerInfo $payerInfo
|
||||
* @return AddressCreateOrUpdateEvent
|
||||
*/
|
||||
protected function createAddressEvent(PayerInfo $payerInfo)
|
||||
{
|
||||
if (null !== $payerInfo->getBillingAddress()) {
|
||||
$countryCode = $payerInfo->getBillingAddress()->getCountryCode();
|
||||
$line1 = $payerInfo->getBillingAddress()->getLine1();
|
||||
$line2 = $payerInfo->getBillingAddress()->getLine2();
|
||||
$zipCode = $payerInfo->getBillingAddress()->getPostalCode();
|
||||
$city = $payerInfo->getBillingAddress()->getCity();
|
||||
} else {
|
||||
$countryCode = $payerInfo->getShippingAddress()->getCountryCode();
|
||||
$line1 = $payerInfo->getShippingAddress()->getLine1();
|
||||
$line2 = $payerInfo->getShippingAddress()->getLine2();
|
||||
$zipCode = $payerInfo->getShippingAddress()->getPostalCode();
|
||||
$city = $payerInfo->getShippingAddress()->getCity();
|
||||
}
|
||||
|
||||
if (null === $country = CountryQuery::create()->findOneByIsoalpha2($countryCode)) {
|
||||
$country = Country::getDefaultCountry();
|
||||
}
|
||||
|
||||
return new AddressCreateOrUpdateEvent(
|
||||
'Express checkout PayPal',
|
||||
CustomerTitleQuery::create()->findOne()->getId(),
|
||||
$payerInfo->getFirstName(),
|
||||
$payerInfo->getLastName(),
|
||||
$line1,
|
||||
($line2)?$line2:'',
|
||||
'',
|
||||
$zipCode,
|
||||
$city,
|
||||
$country->getId(),
|
||||
$payerInfo->getPhone(),
|
||||
$payerInfo->getPhone(),
|
||||
'',
|
||||
0,
|
||||
null
|
||||
);
|
||||
}
|
||||
}
|
||||
336
local/modules/PayPal/Controller/PayPalWebHookController.php
Normal file
336
local/modules/PayPal/Controller/PayPalWebHookController.php
Normal file
@@ -0,0 +1,336 @@
|
||||
<?php
|
||||
/*************************************************************************************/
|
||||
/* */
|
||||
/* Thelia */
|
||||
/* */
|
||||
/* Copyright (c) OpenStudio */
|
||||
/* email : info@thelia.net */
|
||||
/* web : http://www.thelia.net */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation; either version 3 of the License */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/*************************************************************************************/
|
||||
|
||||
namespace PayPal\Controller;
|
||||
|
||||
use Monolog\Logger;
|
||||
use PayPal\Event\PayPalEvents;
|
||||
use PayPal\Event\PayPalOrderEvent;
|
||||
use PayPal\Exception\PayPalConnectionException;
|
||||
use PayPal\Model\PaypalOrderQuery;
|
||||
use PayPal\Model\PaypalPlanQuery;
|
||||
use PayPal\PayPal;
|
||||
use PayPal\Service\PayPalAgreementService;
|
||||
use PayPal\Service\PayPalLoggerService;
|
||||
use Propel\Runtime\Propel;
|
||||
use Thelia\Controller\Front\BaseFrontController;
|
||||
use Thelia\Core\Event\Order\OrderEvent;
|
||||
use Thelia\Core\Event\TheliaEvents;
|
||||
use Thelia\Core\HttpFoundation\Request;
|
||||
use Thelia\Core\Translation\Translator;
|
||||
use Thelia\Model\OrderStatusQuery;
|
||||
|
||||
/**
|
||||
* Class PayPalWebHookController
|
||||
* @package PayPal\Controller
|
||||
*/
|
||||
class PayPalWebHookController extends BaseFrontController
|
||||
{
|
||||
const HOOK_BILLING_PLAN_CREATED = 'BILLING.PLAN.CREATED';
|
||||
const HOOK_BILLING_PLAN_UPDATED = 'BILLING.PLAN.UPDATED';
|
||||
const HOOK_BILLING_SUBSCRIPTION_CREATED = 'BILLING.SUBSCRIPTION.CREATED';
|
||||
|
||||
const HOOK_PAYMENT_SALE_COMPLETED = 'PAYMENT.SALE.COMPLETED';
|
||||
const HOOK_PAYMENT_SALE_DENIED = 'PAYMENT.SALE.DENIED';
|
||||
|
||||
//Classic PayPal payment
|
||||
const RESOURCE_TYPE_SALE = 'sale';
|
||||
|
||||
//Planified payment
|
||||
const RESOURCE_TYPE_PLAN = 'plan';
|
||||
const RESOURCE_TYPE_AGREEMENT = 'agreement';
|
||||
|
||||
/**
|
||||
* Example of array received in posted params :
|
||||
*
|
||||
*
|
||||
* Array (
|
||||
* 'id' => 'WH-0LU96374794024348-4WG31854RU4949452',
|
||||
* 'event_version' => 1.0,
|
||||
* 'create_time' => '2017-02-03T15:31:29Z',
|
||||
* 'resource_type' => 'plan',
|
||||
* 'event_type' => 'BILLING.PLAN.CREATED',
|
||||
* 'summary' => 'A billing plan was created',
|
||||
* 'resource' => Array (
|
||||
* 'merchant_preferences' => Array (
|
||||
* 'setup_fee' => Array (
|
||||
* 'currency' => 'EUR',
|
||||
* 'value' => 0
|
||||
* ),
|
||||
* 'return_url' => 'http://25b3ee89.ngrok.io/thelia_2_3_3/web/module/paypal/agreement/ok/208',
|
||||
* 'cancel_url' => 'http://25b3ee89.ngrok.io/thelia_2_3_3/web/module/paypal/agreement/ko/208',
|
||||
* 'auto_bill_amount' => 'NO',
|
||||
* 'initial_fail_amount_action' => 'CONTINUE',
|
||||
* 'max_fail_attempts' => 0
|
||||
* ),
|
||||
* 'update_time' => '2017-02-03T15:31:29.348Z',
|
||||
* 'create_time' => '2017-02-03T15:31:29.348Z',
|
||||
* 'name' => 'plan for order 208',
|
||||
* 'description' => false,
|
||||
* 'links' => Array (
|
||||
* 0 => Array (
|
||||
* 'href' => 'api.sandbox.paypal.com/v1/payments/billing-plans/P-2DV20774VJ3968037ASNA3RA',
|
||||
* 'rel' => 'self',
|
||||
* 'method' => 'GET'
|
||||
* )
|
||||
* ),
|
||||
* 'payment_definitions' => Array (
|
||||
* 0 => Array (
|
||||
* 'name' => 'payment definition for order 208',
|
||||
* 'type' => 'REGULAR',
|
||||
* 'frequency' => 'Day',
|
||||
* 'frequency_interval' => 1,
|
||||
* 'amount' => Array (
|
||||
* 'currency' => 'EUR',
|
||||
* 'value' => 3.9
|
||||
* ),
|
||||
* 'cycles' => 5,
|
||||
* 'charge_models' => Array (
|
||||
* 0 => Array (
|
||||
* 'type' => 'SHIPPING',
|
||||
* 'amount' => Array (
|
||||
* 'currency' => 'EUR',
|
||||
* 'value' => 0
|
||||
* ),
|
||||
* 'id' => 'CHM-26B03456D8799461GASNA3RA'
|
||||
* )
|
||||
* ),
|
||||
* 'id' => 'PD-3FB00313143031422ASNA3RA'
|
||||
* )
|
||||
* ),
|
||||
* 'id' => 'P-2DV20774VJ3968037ASNA3RA',
|
||||
* 'state' => 'CREATED',
|
||||
* 'type' => 'FIXED'
|
||||
* ),
|
||||
* 'links' => Array (
|
||||
* 0 => Array (
|
||||
* 'href' => 'https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-0LU96374794024348-4WG31854RU4949452',
|
||||
* 'rel' => 'self',
|
||||
* 'method' => 'GET'
|
||||
* ),
|
||||
* 1 => Array (
|
||||
* 'href' => 'https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-0LU96374794024348-4WG31854RU4949452/resend',
|
||||
* 'rel' => 'resend',
|
||||
* 'method' => 'POST'
|
||||
* )
|
||||
* )
|
||||
* );
|
||||
*/
|
||||
public function allAction()
|
||||
{
|
||||
$eventType = $this->getRequest()->request->get('event_type');
|
||||
$resource = $this->getRequest()->request->get('resource');
|
||||
$resourceType = $this->getRequest()->request->get('resource_type');
|
||||
|
||||
$details = [
|
||||
'request' => $this->getRequest()->request->all()
|
||||
];
|
||||
|
||||
$params = [
|
||||
'hook' => $eventType
|
||||
];
|
||||
|
||||
$con = Propel::getConnection();
|
||||
$con->beginTransaction();
|
||||
|
||||
try {
|
||||
|
||||
$title = $this->getTitle($this->getRequest());
|
||||
|
||||
if (is_array($resource)) {
|
||||
|
||||
switch (strtolower($resourceType)) {
|
||||
|
||||
case self::RESOURCE_TYPE_SALE:
|
||||
if (isset($resource['parent_payment'])) {
|
||||
$params = $this->getParamsForSale($resource['parent_payment'], $params, $eventType);
|
||||
}
|
||||
if (isset($resource['billing_agreement_id'])) {
|
||||
$params = $this->getParamsForAgreement($resource['billing_agreement_id'], $params);
|
||||
}
|
||||
break;
|
||||
|
||||
case self::RESOURCE_TYPE_PLAN:
|
||||
if (isset($resource['id'])) {
|
||||
$params = $this->getParamsForPlan($resource['id'], $params);
|
||||
}
|
||||
break;
|
||||
|
||||
case self::RESOURCE_TYPE_AGREEMENT:
|
||||
if (isset($resource['id'])) {
|
||||
$params = $this->getParamsForAgreement($resource['id'], $params);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PayPalLoggerService::log(
|
||||
'<h3>' . $title . '</h3>' . $this->printRecursiveData($details),
|
||||
$params,
|
||||
Logger::INFO
|
||||
);
|
||||
|
||||
$con->commit();
|
||||
} catch (PayPalConnectionException $e) {
|
||||
|
||||
$con->rollBack();
|
||||
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
|
||||
PayPalLoggerService::log($message, $params, Logger::CRITICAL);
|
||||
PayPalLoggerService::log($this->printRecursiveData($this->getRequest()->request), $params, Logger::CRITICAL);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
|
||||
$con->rollBack();
|
||||
PayPalLoggerService::log($e->getMessage(), $params, Logger::CRITICAL);
|
||||
PayPalLoggerService::log($this->printRecursiveData($this->getRequest()->request), $params, Logger::CRITICAL);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return string
|
||||
*/
|
||||
protected function getTitle(Request $request)
|
||||
{
|
||||
$summary = $request->request->get('summary');
|
||||
|
||||
$title = '';
|
||||
if (null !== $request->get('event_type')) {
|
||||
$title .= $request->get('event_type') . ' : ';
|
||||
}
|
||||
$title .= $summary;
|
||||
|
||||
return $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null $paymentId
|
||||
* @param array $params
|
||||
* @param null $eventType
|
||||
* @return array
|
||||
*/
|
||||
protected function getParamsForSale($paymentId = null, $params = [], $eventType = null)
|
||||
{
|
||||
if (null !== $payPalOrder = PaypalOrderQuery::create()->findOneByPaymentId($paymentId)) {
|
||||
$params['order_id'] = $payPalOrder->getId();
|
||||
$params['customer_id'] = $payPalOrder->getOrder()->getCustomerId();
|
||||
|
||||
if ($eventType === self::HOOK_PAYMENT_SALE_DENIED) {
|
||||
$event = new OrderEvent($payPalOrder->getOrder());
|
||||
$event->setStatus(OrderStatusQuery::getCancelledStatus()->getId());
|
||||
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
|
||||
}
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null $planId
|
||||
* @param array $params
|
||||
* @return array
|
||||
*/
|
||||
protected function getParamsForPlan($planId = null, $params = [])
|
||||
{
|
||||
if (null !== $payPalPlan = PaypalPlanQuery::create()->findOneByPlanId($planId)) {
|
||||
|
||||
$params['order_id'] = $payPalPlan->getPaypalOrderId();
|
||||
$params['customer_id'] = $payPalPlan->getPaypalOrder()->getOrder()->getCustomerId();
|
||||
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null $agreementId
|
||||
* @param array $params
|
||||
* @return array
|
||||
*/
|
||||
protected function getParamsForAgreement($agreementId = null, $params = [])
|
||||
{
|
||||
if (null !== $payPalOrder = PaypalOrderQuery::create()->filterByAgreementId($agreementId)->orderById()->findOne()) {
|
||||
|
||||
// Do not duplicate order for the first PayPal payment because order has just been created.
|
||||
// We will duplicate this order for the next PayPal payment :)
|
||||
if ($payPalOrder->getPlanifiedActualCycle() > 0) {
|
||||
$params['order_id'] = $payPalOrder->getId();
|
||||
$params['customer_id'] = $payPalOrder->getOrder()->getCustomerId();
|
||||
|
||||
/** @var PayPalAgreementService $payPalAgreementService */
|
||||
$payPalAgreementService = $this->container->get(PayPal::PAYPAL_AGREEMENT_SERVICE_ID);
|
||||
$newOrder = $payPalAgreementService->duplicateOrder($payPalOrder->getOrder());
|
||||
|
||||
Translator::getInstance()->trans(
|
||||
'New recursive invoice from order %id',
|
||||
['%id' => $payPalOrder->getId()],
|
||||
PayPal::DOMAIN_NAME
|
||||
);
|
||||
|
||||
PayPalLoggerService::log(
|
||||
'<h3>New recursive invoice from order ' . $payPalOrder->getId() . '</h3>',
|
||||
[
|
||||
'order_id' => $newOrder->getId(),
|
||||
'customer_id' => $payPalOrder->getOrder()->getCustomerId()
|
||||
],
|
||||
Logger::INFO
|
||||
);
|
||||
}
|
||||
|
||||
$payPalOrder->setPlanifiedActualCycle($payPalOrder->getPlanifiedActualCycle() + 1);
|
||||
$payPalOrderEvent = new PayPalOrderEvent($payPalOrder);
|
||||
$this->getDispatcher()->dispatch(PayPalEvents::PAYPAL_ORDER_UPDATE, $payPalOrderEvent);
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @param int $deep
|
||||
* @return string
|
||||
*/
|
||||
protected function printRecursiveData($data = [], $deep = 0)
|
||||
{
|
||||
$formatedString = '';
|
||||
foreach ($data as $key => $value) {
|
||||
|
||||
for ($i = 0; $i <= $deep; $i++) {
|
||||
$formatedString .= ' ';
|
||||
}
|
||||
|
||||
if (is_array($value)) {
|
||||
$formatedString .= '<strong>' . $key . ' : </strong><br />' . $this->printRecursiveData($value, $deep + 1);
|
||||
} else {
|
||||
$formatedString .= '<strong>' . $key . ' : </strong>' . $value . '<br />';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $formatedString;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user