* @copyright PayPal * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ use PaypalAddons\classes\AbstractMethodPaypal; /** * Update PrestaShop Order after return from PayPal */ class PaypalScOrderModuleFrontController extends PaypalAbstarctModuleFrontController { protected $paymentData; /** @var AbstractMethodPaypal*/ protected $method; public function init() { parent::init(); $this->setPaymentData(json_decode(Tools::getValue('paymentData'))); if ($this->module->paypal_method == 'MB') { $methodType = 'EC'; } else { $methodType = $this->module->paypal_method; } $this->method = AbstractMethodPaypal::load($methodType); } /** * @see FrontController::postProcess() */ public function postProcess() { $paypal = Module::getInstanceByName($this->name); try { $this->redirectUrl = $this->context->link->getPageLink('order', null, null, array('step'=>2)); $this->method->setPaymentId($this->paymentData->orderID); $info = $this->method->getInfo(); $this->prepareOrder($info); if (!empty($this->errors)) { return; } } catch (PayPal\Exception\PPConnectionException $e) { $this->errors['error_msg'] = $paypal->l('Error connecting to ', pathinfo(__FILE__)['filename']) . $e->getUrl(); } catch (PayPal\Exception\PPMissingCredentialException $e) { $this->errors['error_msg'] = $e->errorMessage(); } catch (PayPal\Exception\PPConfigurationException $e) { $this->errors['error_msg'] = $paypal->l('Invalid configuration. Please check your configuration file', pathinfo(__FILE__)['filename']); } catch (PaypalAddons\classes\PaypalException $e) { $this->errors['error_code'] = $e->getCode(); $this->errors['error_msg'] = $e->getMessage(); $this->errors['msg_long'] = $e->getMessageLong(); } catch (Exception $e) { $this->errors['error_code'] = $e->getCode(); $this->errors['error_msg'] = $e->getMessage(); } if (!empty($this->errors)) { $this->redirectUrl = Context::getContext()->link->getModuleLink($this->name, 'error', $this->errors); } } /** * @param $info \PaypalAddons\classes\API\Response\ResponseOrderGet */ public function prepareOrder($info) { $module = Module::getInstanceByName($this->name); if ($this->context->cookie->logged) { $customer = $this->context->customer; } elseif ($id_customer = Customer::customerExists($info->getClient()->getEmail(), true)) { $customer = new Customer($id_customer); } else { $customer = new Customer(); $customer->email = $info->getClient()->getEmail(); $customer->firstname = $info->getClient()->getFirstName(); $customer->lastname = $info->getClient()->getLastName(); $customer->passwd = Tools::encrypt(Tools::passwdGen()); $customer->add(); } $id_cart = $this->context->cart->id; // save id cart // Login Customer $this->context->updateCustomer($customer); $this->context->cart = new Cart($id_cart); // Reload cart $this->context->cart->id_customer = $customer->id; $this->context->cart->update(); Hook::exec('actionAuthentication', array('customer' => $this->context->customer)); // Login information have changed, so we check if the cart rules still apply CartRule::autoRemoveFromCart($this->context); CartRule::autoAddToCart($this->context); // END Login if ($this->method instanceof MethodEC) { $this->context->cookie->__set('paypal_ecs', $this->paymentData->orderID); $this->context->cookie->__set('paypal_ecs_email', $info->getClient()->getEmail()); } elseif ($this->method instanceof MethodPPP) { $this->context->cookie->__set('paypal_pSc', $this->paymentData->orderID); $this->context->cookie->__set('paypal_pSc_email', $info->getClient()->getEmail()); } $addresses = $this->context->customer->getAddresses($this->context->language->id); $address_exist = false; $count = 1; $id_address = 0; $id_state = PayPal::getIdStateByPaypalCode($info->getAddress()->getStateCode(), $info->getAddress()->getCountryCode()); foreach ($addresses as $address) { if ($address['firstname'].' '.$address['lastname'] == $info->getAddress()->getFullName() && $address['address1'] == $info->getAddress()->getAddress1() && $address['address2'] == $info->getAddress()->getAddress2() && $address['id_country'] == Country::getByIso($info->getAddress()->getCountryCode()) && $address['city'] == $info->getAddress()->getCity() && (empty($info->getAddress()->getStateCode()) || $address['id_state'] == $id_state) && $address['postcode'] == $info->getAddress()->getPostCode() && $address['phone'] == $info->getAddress()->getPhone() ) { $address_exist = true; $id_address = $address['id_address']; break; } else { if ((strrpos($address['alias'], 'Paypal_Address')) !== false) { $count = (int)(Tools::substr($address['alias'], -1)) + 1; } } } if (!$address_exist) { $nameArray = explode(" ", $info->getAddress()->getFullName()); $firstName = implode(' ', array_slice($nameArray, 0, count($nameArray) - 1)); $lastName = $nameArray[count($nameArray) - 1]; $orderAddress = new Address(); $orderAddress->firstname = $firstName; $orderAddress->lastname = $lastName; $orderAddress->address1 = $info->getAddress()->getAddress1(); $orderAddress->address2 = $info->getAddress()->getAddress2(); $orderAddress->id_country = Country::getByIso($info->getAddress()->getCountryCode()); $orderAddress->city = $info->getAddress()->getCity(); if ($id_state) { $orderAddress->id_state = $id_state; } $orderAddress->postcode = $info->getAddress()->getPostCode(); $orderAddress->phone = $info->getAddress()->getPhone(); $orderAddress->id_customer = $customer->id; $orderAddress->alias = 'Paypal_Address '.($count); $validationMessage = $orderAddress->validateFields(false, true); if (Country::containsStates($orderAddress->id_country) && $orderAddress->id_state == false) { $validationMessage = $module->l('State is required in order to process payment. Please fill in state field.', pathinfo(__FILE__)['filename']); } $country = new Country($orderAddress->id_country); if ($country->active == false) { $validationMessage = $module->l('Country is not active', pathinfo(__FILE__)['filename']); } if (is_string($validationMessage)) { $vars = array( 'newAddress' => 'delivery', 'address1' => $orderAddress->address1, 'firstname' => $orderAddress->firstname, 'lastname' => $orderAddress->lastname, 'postcode' => $orderAddress->postcode, 'id_country' => $orderAddress->id_country, 'city' => $orderAddress->city, 'phone' => $orderAddress->phone, 'address2' => $orderAddress->address2, 'id_state' => $orderAddress->id_state ); $this->errors[] = $validationMessage; $url = Context::getContext()->link->getPageLink('order', null, null, $vars); $this->redirectUrl = $url; return; } $orderAddress->save(); $id_address = $orderAddress->id; } $this->context->cart->id_address_delivery = $id_address; $this->context->cart->id_address_invoice = $id_address; $invalidAddressIds = []; if(version_compare(_PS_VERSION_, '1.7.3.0', '>=')) { $addressValidator = new AddressValidator(); $invalidAddressIds = $addressValidator->validateCartAddresses($this->context->cart); } if (empty($invalidAddressIds) == false) { $vars = array( 'id_address' => $id_address, 'editAddress' => 'delivery' ); $this->errors[] = $this->l('Your address is incomplete, please update it.'); $url = Context::getContext()->link->getPageLink('order', null, null, $vars); $this->redirectUrl = $url; return; } $products = $this->context->cart->getProducts(); foreach ($products as $key => $product) { $this->context->cart->setProductAddressDelivery($product['id_product'], $product['id_product_attribute'], $product['id_address_delivery'], $id_address); } $this->context->cart->save(); } public function setPaymentData($paymentData) { $this->paymentData = $paymentData; return $this; } }