예제 #1
0
 public function __construct()
 {
     $this->controller_type = 'modulefront';
     $this->module = Module::getInstanceByName(Tools::getValue('module'));
     if (!$this->module->active) {
         Tools::redirect('index');
     }
     $this->page_name = 'module-' . $this->module->name . '-' . Dispatcher::getInstance()->getController();
     parent::__construct();
     header('Content-Type: application/javascript');
     $cookiestring = Tools::getValue('c');
     if ($cookiestring != '') {
         if (isset($this->context->cookie->{$cookiestring})) {
             echo AmzPayments::prepareCookieValueForAmazonPaymentsUse($this->context->cookie->{$cookiestring});
         }
     }
     exit;
 }
예제 #2
0
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 *  @author    patworx multimedia GmbH <*****@*****.**>
 *  @copyright 2013-2015 patworx multimedia GmbH
 *  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
include_once '../../config/config.inc.php';
include_once '../../init.php';
include_once '../../modules/amzpayments/amzpayments.php';
$module_name = Tools::getValue('moduleName');
$amz_payments = new AmzPayments();
if ($amz_payments->cron_status == '1' && Tools::getValue('pw') == $amz_payments->cron_password) {
    if ($amz_payments->capture_mode == 'after_shipping') {
        $amz_payments->shippingCapture();
    }
    $q = 'SELECT * FROM ' . _DB_PREFIX_ . 'amz_transactions WHERE amz_tx_status = \'Pending\' ORDER BY amz_tx_last_update ASC';
    $rs = Db::getInstance()->ExecuteS($q);
    foreach ($rs as $r) {
        $amz_payments->intelligentRefresh($r);
        sleep(1);
    }
    $q = 'SELECT * FROM ' . _DB_PREFIX_ . 'amz_transactions WHERE amz_tx_status != \'Closed\' ORDER BY amz_tx_last_update ASC LIMIT 40';
    $rs = Db::getInstance()->ExecuteS($q);
    foreach ($rs as $r) {
        $amz_payments->intelligentRefresh($r);
        sleep(1);
예제 #3
0
 public function init()
 {
     self::$amz_payments = new AmzPayments();
     $this->isLogged = (bool) $this->context->customer->id && Customer::customerIdExistsStatic((int) $this->context->cookie->id_customer);
     parent::init();
     /* Disable some cache related bugs on the cart/order */
     header('Cache-Control: no-cache, must-revalidate');
     header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
     $this->display_column_left = false;
     $this->display_column_right = false;
     // Service initialisieren
     $this->service = self::$amz_payments->getService();
     if (Tools::isSubmit('ajax')) {
         if (Tools::isSubmit('method')) {
             switch (Tools::getValue('method')) {
                 case 'redirectAuthentication':
                 case 'setusertoshop':
                     if (Tools::getValue('access_token')) {
                         $this->context->cookie->amz_access_token = AmzPayments::prepareCookieValueForPrestaShopUse(Tools::getValue('access_token'));
                         $this->context->cookie->amz_access_token_set_time = time();
                     } else {
                         if (Tools::getValue('method') == 'redirectAuthentication') {
                             Tools::redirect('index');
                         } else {
                             error_log('Error, method not submitted and no token');
                             die('error');
                         }
                     }
                     if (Tools::getValue('action') == 'fromCheckout') {
                         $accessTokenValue = AmzPayments::prepareCookieValueForAmazonPaymentsUse(Tools::getValue('access_token'));
                     } else {
                         $accessTokenValue = Tools::getValue('access_token');
                     }
                     $d = self::$amz_payments->requestTokenInfo($accessTokenValue);
                     if ($d->aud != self::$amz_payments->client_id) {
                         if (Tools::getValue('method') == 'redirectAuthentication') {
                             Tools::redirect('index');
                         } else {
                             error_log('auth error LPA');
                             die('error');
                         }
                     }
                     $d = self::$amz_payments->requestProfile($accessTokenValue);
                     $customer_userid = $d->user_id;
                     $customer_name = $d->name;
                     $customer_email = $d->email;
                     // $postcode = $d->postal_code;
                     if ($customers_local_id = AmazonPaymentsCustomerHelper::findByAmazonCustomerId($customer_userid)) {
                         // Customer already exists - login
                         Hook::exec('actionBeforeAuthentication');
                         $customer = new Customer();
                         $authentication = AmazonPaymentsCustomerHelper::getByCustomerID($customers_local_id, true, $customer);
                         if (isset($authentication->active) && !$authentication->active) {
                             $this->errors[] = Tools::displayError('Your account isn\'t available at this time, please contact us');
                         } elseif (!$authentication || !$customer->id) {
                             $this->errors[] = Tools::displayError('Authentication failed.');
                         } else {
                             $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare : CompareProduct::getIdCompareByIdCustomer($customer->id);
                             $this->context->cookie->id_customer = (int) $customer->id;
                             $this->context->cookie->customer_lastname = $customer->lastname;
                             $this->context->cookie->customer_firstname = $customer->firstname;
                             $this->context->cookie->logged = 1;
                             $customer->logged = 1;
                             $this->context->cookie->is_guest = $customer->isGuest();
                             $this->context->cookie->passwd = $customer->passwd;
                             $this->context->cookie->email = $customer->email;
                             // Add customer to the context
                             $this->context->customer = $customer;
                             if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && ($id_cart = (int) Cart::lastNoneOrderedCart($this->context->customer->id))) {
                                 $this->context->cart = new Cart($id_cart);
                             } else {
                                 $id_carrier = (int) $this->context->cart->id_carrier;
                                 $this->context->cart->id_carrier = 0;
                                 $this->context->cart->setDeliveryOption(null);
                                 $this->context->cart->id_address_delivery = (int) Address::getFirstCustomerAddressId((int) $customer->id);
                                 $this->context->cart->id_address_invoice = (int) Address::getFirstCustomerAddressId((int) $customer->id);
                             }
                             $this->context->cart->id_customer = (int) $customer->id;
                             $this->context->cart->secure_key = $customer->secure_key;
                             if ($this->ajax && isset($id_carrier) && $id_carrier && Configuration::get('PS_ORDER_PROCESS_TYPE')) {
                                 $delivery_option = array($this->context->cart->id_address_delivery => $id_carrier . ',');
                                 $this->context->cart->setDeliveryOption($delivery_option);
                             }
                             $this->context->cart->save();
                             $this->context->cookie->id_cart = (int) $this->context->cart->id;
                             $this->context->cookie->write();
                             $this->context->cart->autosetProductAddress();
                             Hook::exec('actionAuthentication');
                             // Login information have changed, so we check if the cart rules still apply
                             CartRule::autoRemoveFromCart($this->context);
                             CartRule::autoAddToCart($this->context);
                             if (Tools::getValue('action') == 'fromCheckout' && isset($this->context->cookie->amz_connect_order)) {
                                 AmzPayments::switchOrderToCustomer($this->context->customer->id, $this->context->cookie->amz_connect_order, true);
                             }
                             if (Tools::getValue('action') == 'checkout') {
                                 $goto = $this->context->link->getModuleLink('amzpayments', 'amzpayments');
                             } elseif (Tools::getValue('action') == 'fromCheckout') {
                                 $goto = 'index.php?controller=history';
                             } elseif ($this->context->cart->nbProducts()) {
                                 $goto = 'index.php?controller=order';
                             } else {
                                 if (Configuration::get('PS_SSL_ENABLED')) {
                                     $goto = _PS_BASE_URL_SSL_ . __PS_BASE_URI__;
                                 } else {
                                     $goto = _PS_BASE_URL_ . __PS_BASE_URI__;
                                 }
                             }
                             if (Tools::getValue('method') == 'redirectAuthentication') {
                                 Tools::redirect($goto);
                             } else {
                                 echo $goto;
                             }
                         }
                     } else {
                         if (AmazonPaymentsCustomerHelper::findByEmailAddress($customer_email)) {
                             $this->context->cookie->amzConnectEmail = $customer_email;
                             $this->context->cookie->amzConnectCustomerId = $customer_userid;
                             $goto = $this->context->link->getModuleLink('amzpayments', 'connect_accounts');
                             if (Tools::getValue('action') && Tools::getValue('action') == 'checkout') {
                                 if (strpos($goto, '?') > 0) {
                                     $goto .= '&checkout=1';
                                 } else {
                                     $goto .= '?checkout=1';
                                 }
                             }
                             if (Tools::getValue('method') == 'redirectAuthentication') {
                                 Tools::redirect($goto);
                             } else {
                                 echo $goto;
                             }
                         } else {
                             // Customer does not exist - Create account
                             Hook::exec('actionBeforeSubmitAccount');
                             $this->create_account = true;
                             $_POST['passwd'] = md5(time() . _COOKIE_KEY_);
                             $firstname = '';
                             $lastname = '';
                             $customer_name = preg_replace("/[0-9]/", "", $customer_name);
                             if (strpos(trim($customer_name), ' ') !== false) {
                                 list($firstname, $lastname) = explode(' ', trim($customer_name));
                             } elseif (strpos(trim($customer_name), '-') !== false) {
                                 list($firstname, $lastname) = explode('-', trim($customer_name));
                             } else {
                                 $firstname = trim($customer_name);
                                 $lastname = 'Placeholder';
                             }
                             $customer = new Customer();
                             $customer->email = $customer_email;
                             $lastname_address = $lastname;
                             $firstname_address = $firstname;
                             $_POST['lastname'] = Tools::getValue('customer_lastname', $lastname_address);
                             $_POST['firstname'] = Tools::getValue('customer_firstname', $firstname_address);
                             // $addresses_types = array('address');
                             $this->errors = array_unique(array_merge($this->errors, $customer->validateController()));
                             // Check the requires fields which are settings in the BO
                             $this->errors = $this->errors + $customer->validateFieldsRequiredDatabase();
                             if (!count($this->errors)) {
                                 $customer->firstname = Tools::ucwords($customer->firstname);
                                 $customer->is_guest = 0;
                                 $customer->active = 1;
                                 if (!count($this->errors)) {
                                     if ($customer->add()) {
                                         if (!$customer->is_guest) {
                                             if (!$this->sendConfirmationMail($customer)) {
                                                 $this->errors[] = Tools::displayError('The email cannot be sent.');
                                             }
                                         }
                                         AmazonPaymentsCustomerHelper::saveCustomersAmazonReference($customer, $customer_userid);
                                         $this->updateContext($customer);
                                         $this->context->cart->update();
                                         Hook::exec('actionCustomerAccountAdd', array('_POST' => $_POST, 'newCustomer' => $customer));
                                         if (Tools::getValue('action') == 'fromCheckout' && isset($this->context->cookie->amz_connect_order)) {
                                             AmzPayments::switchOrderToCustomer($customer->id, $this->context->cookie->amz_connect_order, true);
                                         }
                                         if (Tools::getValue('action') == 'checkout') {
                                             $goto = $this->context->link->getModuleLink('amzpayments', 'amzpayments');
                                         } elseif (Tools::getValue('action') == 'fromCheckout') {
                                             $goto = 'index.php?controller=history';
                                         } elseif ($this->context->cart->nbProducts()) {
                                             $goto = 'index.php?controller=order';
                                         } else {
                                             if (Configuration::get('PS_SSL_ENABLED')) {
                                                 $goto = _PS_BASE_URL_SSL_ . __PS_BASE_URI__;
                                             } else {
                                                 $goto = _PS_BASE_URL_ . __PS_BASE_URI__;
                                             }
                                         }
                                         if (Tools::getValue('method') == 'redirectAuthentication') {
                                             Tools::redirect($goto);
                                         } else {
                                             echo $goto;
                                         }
                                     } else {
                                         $this->errors[] = Tools::displayError('An error occurred while creating your account.');
                                     }
                                 }
                             } else {
                                 error_log('Error validating customers informations');
                                 die('error');
                             }
                         }
                     }
                     die;
             }
         }
     }
 }
예제 #4
0
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 *  @author    patworx multimedia GmbH <*****@*****.**>
 *  @copyright 2013-2015 patworx multimedia GmbH
 *  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
include_once '../../config/config.inc.php';
include_once '../../init.php';
include_once '../../modules/amzpayments/amzpayments.php';
$module_name = Tools::getValue('moduleName');
$amz_payments = new AmzPayments();
if (Tools::getValue('action')) {
    if (Tools::getValue('action') == 'shippingCapture') {
        $_POST['action'] = 'shippingCapture';
    }
}
switch (Tools::getValue('action')) {
    case 'getHistory':
        echo $amz_payments->getOrderHistory(Tools::getValue('orderRef'));
        break;
    case 'getSummary':
        echo $amz_payments->getOrderSummary(Tools::getValue('orderRef'));
        break;
    case 'getActions':
        echo $amz_payments->getOrderActions(Tools::getValue('orderRef'));
        break;
예제 #5
0
    public function __construct()
    {
        $this->controller_type = 'modulefront';
        $this->module = Module::getInstanceByName(Tools::getValue('module'));
        if (!$this->module->active) {
            Tools::redirect('index');
        }
        file_put_contents(dirname(__FILE__) . '/../../amz.log', '[' . date("Y-m-d H:i:s") . '] IPN wurde aufgerufen' . "\n", FILE_APPEND);
        $headers_tmp = getallheaders();
        $headers = array();
        foreach ($headers_tmp as $k => $v) {
            $headers[Tools::strtolower($k)] = $v;
        }
        $response = Tools::file_get_contents('php://input');
        //file_put_contents(dirname(__FILE__) . '/../../amz.log', '[' . date("Y-m-d H:i:s") . '] Headers: ' . print_r($headers,1) . "\n", FILE_APPEND);
        //file_put_contents(dirname(__FILE__) . '/../../amz.log', '[' . date("Y-m-d H:i:s") . '] Response: ' . $response . "\n", FILE_APPEND);
        $amz_payments = new AmzPayments();
        try {
            $client = $amz_payments->getService(false, 'notification');
            file_put_contents(dirname(__FILE__) . '/../../amz.log', '[' . date("Y-m-d H:i:s") . '] Notification response received' . "\n", FILE_APPEND);
            $result = $client->parseRawMessage($headers, $response);
        } catch (OffAmazonPaymentsNotifications_InvalidMessageException $ex) {
            error_log($ex->getMessage());
            file_put_contents(dirname(__FILE__) . '/../../amz.log', '[' . date("Y-m-d H:i:s") . '] Error: ' . $ex->getMessage() . "\n", FILE_APPEND);
            header("HTTP/1.1 503 Service Unavailable");
            exit(0);
        }
        ob_start();
        $response = $this->jsonCleanDecode($response);
        $message = $this->jsonCleanDecode($response->Message);
        $response_xml = simplexml_load_string($message->NotificationData);
        $response_xml = $response_xml;
        if ($amz_payments->ipn_status == '1') {
            echo '[' . date("Y-m-d H:i:s") . '] [' . $message->NotificationType . '] ';
            switch ($message->NotificationType) {
                case 'PaymentAuthorize':
                    $q = 'SELECT * FROM ' . _DB_PREFIX_ . 'amz_transactions
					WHERE amz_tx_type = \'auth\' AND amz_tx_amz_id = \'' . pSQL($response_xml->AuthorizationDetails->AmazonAuthorizationId) . '\'';
                    $r = Db::getInstance()->getRow($q);
                    $sqlArr = array('amz_tx_status' => pSQL((string) $response_xml->AuthorizationDetails->AuthorizationStatus->State), 'amz_tx_last_change' => time(), 'amz_tx_expiration' => strtotime($response_xml->AuthorizationDetails->ExpirationTimestamp), 'amz_tx_last_update' => time());
                    Db::getInstance()->update('amz_transactions', $sqlArr, ' amz_tx_id = ' . (int) $r['amz_tx_id']);
                    $amz_payments->refreshAuthorization($response_xml->AuthorizationDetails->AmazonAuthorizationId);
                    if ($sqlArr['amz_tx_status'] == 'Open') {
                        AmazonTransactions::setOrderStatusAuthorized($r['amz_tx_order_reference'], true);
                        if ($amz_payments->capture_mode == 'after_auth') {
                            $order_id = AmazonTransactions::getOrdersIdFromOrderRef($r['amz_tx_order_reference']);
                            $order = new Order((int) $order_id);
                            if (Validate::isLoadedObject($order)) {
                                $currency = new Currency($order->id_currency);
                                if (Validate::isLoadedObject($currency)) {
                                    AmazonTransactions::capture($amz_payments, $amz_payments->getService(), $response_xml->AuthorizationDetails->AmazonAuthorizationId, $r['amz_tx_amount'], $currency->iso_code);
                                }
                            }
                        }
                    } elseif ($sqlArr['amz_tx_status'] == 'Declined') {
                        $reason = (string) $response_xml->AuthorizationDetails->AuthorizationStatus->ReasonCode;
                        $amz_payments->intelligentDeclinedMail($response_xml->AuthorizationDetails->AmazonAuthorizationId, $reason);
                        if ($amz_payments->decline_status_id > 0) {
                            AmazonTransactions::setOrderStatusDeclined(r['amz_tx_order_reference']);
                        }
                    }
                    break;
                case 'PaymentCapture':
                    $q = 'SELECT * FROM ' . _DB_PREFIX_ . 'amz_transactions
					WHERE amz_tx_type = \'capture\' AND amz_tx_amz_id = \'' . pSQL($response_xml->CaptureDetails->AmazonCaptureId) . '\'';
                    $r = Db::getInstance()->getRow($q);
                    $sqlArr = array('amz_tx_status' => pSQL((string) $response_xml->CaptureDetails->CaptureStatus->State), 'amz_tx_last_change' => time(), 'amz_tx_amount_refunded' => (double) $response_xml->CaptureDetails->RefundedAmount->Amount, 'amz_tx_last_update' => time());
                    Db::getInstance()->update('amz_transactions', $sqlArr, ' amz_tx_id = ' . (int) $r['amz_tx_id']);
                    $orderTotal = AmazonTransactions::getOrderRefTotal($r['amz_tx_order_reference']);
                    if ($r['amz_tx_amount'] == $orderTotal) {
                        AmazonTransactions::closeOrder($amz_payments, $amz_payments->getService(), $r['amz_tx_order_reference']);
                    }
                    break;
                case 'PaymentRefund':
                    $q = 'SELECT * FROM ' . _DB_PREFIX_ . 'amz_transactions
					WHERE amz_tx_type = \'refund\' AND amz_tx_amz_id = \'' . pSQL($response_xml->RefundDetails->AmazonRefundId) . '\'';
                    $r = Db::getInstance()->getRow($q);
                    $sqlArr = array('amz_tx_status' => pSQL((string) $response_xml->RefundDetails->RefundStatus->State), 'amz_tx_last_change' => time(), 'amz_tx_last_update' => time());
                    Db::getInstance()->update('amz_transactions', $sqlArr, ' amz_tx_id = ' . (int) $r['amz_tx_id']);
                    break;
                case 'OrderReferenceNotification':
                    $q = 'SELECT * FROM ' . _DB_PREFIX_ . 'amz_transactions
					WHERE amz_tx_type = \'order_ref\' AND amz_tx_amz_id = \'' . pSQL($response_xml->OrderReference->AmazonOrderReferenceId) . '\'';
                    $r = Db::getInstance()->getRow($q);
                    $sqlArr = array('amz_tx_status' => pSQL((string) $response_xml->OrderReference->OrderReferenceStatus->State), 'amz_tx_last_change' => time(), 'amz_tx_last_update' => time());
                    Db::getInstance()->update('amz_transactions', $sqlArr, ' amz_tx_id = ' . (int) $r['amz_tx_id']);
                    break;
            }
            if ($amz_payments->capture_mode == 'after_shipping') {
                $amz_payments->shippingCapture();
            }
        }
        $str = ob_get_contents();
        ob_end_clean();
        if (trim($str) != '') {
            $str .= "\n";
        }
        file_put_contents(dirname(__FILE__) . '/../../amz.log', $str, FILE_APPEND);
        echo 'OK';
        exit;
    }
예제 #6
0
 public function init()
 {
     self::$amz_payments = new AmzPayments();
     $this->isLogged = (bool) $this->context->customer->id && Customer::customerIdExistsStatic((int) $this->context->cookie->id_customer);
     parent::init();
     header('Cache-Control: no-cache, must-revalidate');
     header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
     $this->display_column_left = false;
     $this->display_column_right = false;
     $this->service = self::$amz_payments->getService();
     $this->nbProducts = $this->context->cart->nbProducts();
     if (Configuration::get('PS_CATALOG_MODE')) {
         $this->errors[] = Tools::displayError('This store has not accepted your new order.');
     }
     if ($this->nbProducts) {
         if (CartRule::isFeatureActive()) {
             if (Tools::isSubmit('submitAddDiscount')) {
                 if (!($code = trim(Tools::getValue('discount_name')))) {
                     $this->errors[] = Tools::displayError('You must enter a voucher code.');
                 } elseif (!Validate::isCleanHtml($code)) {
                     $this->errors[] = Tools::displayError('The voucher code is invalid.');
                 } else {
                     if (($cart_rule = new CartRule(CartRule::getIdByCode($code))) && Validate::isLoadedObject($cart_rule)) {
                         if ($error = $cart_rule->checkValidity($this->context, false, true)) {
                             $this->errors[] = $error;
                         } else {
                             $this->context->cart->addCartRule($cart_rule->id);
                             if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) {
                                 Tools::redirect('index.php?controller=order-opc&addingCartRule=1');
                             }
                             Tools::redirect('index.php?controller=order&addingCartRule=1');
                         }
                     } else {
                         $this->errors[] = Tools::displayError('This voucher does not exists.');
                     }
                 }
                 $this->context->smarty->assign(array('errors' => $this->errors, 'discount_name' => Tools::safeOutput($code)));
             } elseif (($id_cart_rule = (int) Tools::getValue('deleteDiscount')) && Validate::isUnsignedId($id_cart_rule)) {
                 $this->context->cart->removeCartRule($id_cart_rule);
                 Tools::redirect('index.php?controller=order-opc');
             }
         }
         if ($this->context->cart->isVirtualCart()) {
             $this->setNoCarrier();
         }
     } else {
         Tools::redirect('index.php?controller=order-opc');
     }
     $this->context->smarty->assign('back', Tools::safeOutput(Tools::getValue('back')));
     if ($this->nbProducts) {
         $this->context->smarty->assign('virtual_cart', $this->context->cart->isVirtualCart());
     }
     $this->context->smarty->assign('is_multi_address_delivery', $this->context->cart->isMultiAddressDelivery() || (int) Tools::getValue('multi-shipping') == 1);
     $this->context->smarty->assign('open_multishipping_fancybox', (int) Tools::getValue('multi-shipping') == 1);
     if ($this->context->cart->nbProducts()) {
         if (Tools::isSubmit('ajax')) {
             if (Tools::isSubmit('method')) {
                 switch (Tools::getValue('method')) {
                     case 'setsession':
                         $this->context->cookie->amazon_id = Tools::getValue('amazon_id');
                         $this->context->cookie->amz_access_token = AmzPayments::prepareCookieValueForPrestaShopUse(Tools::getValue('access_token'));
                         $this->context->cookie->amz_access_token_set_time = time();
                         if (!$this->context->customer->isLogged() && self::$amz_payments->lpa_mode != 'pay') {
                             $d = self::$amz_payments->requestTokenInfo(AmzPayments::prepareCookieValueForAmazonPaymentsUse($this->context->cookie->amz_access_token));
                             if ($d->aud != self::$amz_payments->client_id) {
                                 error_log('auth error LPA');
                                 die('error');
                             }
                             $d = self::$amz_payments->requestProfile(AmzPayments::prepareCookieValueForAmazonPaymentsUse($this->context->cookie->amz_access_token));
                             $customer_userid = $d->user_id;
                             $customer_name = $d->name;
                             $customer_email = $d->email;
                             if ($customers_local_id = AmazonPaymentsCustomerHelper::findByAmazonCustomerId($customer_userid)) {
                                 Hook::exec('actionBeforeAuthentication');
                                 $customer = new Customer();
                                 $authentication = AmazonPaymentsCustomerHelper::getByCustomerID($customers_local_id, true, $customer);
                                 if (isset($authentication->active) && !$authentication->active) {
                                     exit;
                                 } elseif (!$authentication || !$customer->id) {
                                     exit;
                                 } else {
                                     $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare : CompareProduct::getIdCompareByIdCustomer($customer->id);
                                     $this->context->cookie->id_customer = (int) $customer->id;
                                     $this->context->cookie->customer_lastname = $customer->lastname;
                                     $this->context->cookie->customer_firstname = $customer->firstname;
                                     $this->context->cookie->logged = 1;
                                     $customer->logged = 1;
                                     $this->context->cookie->is_guest = $customer->isGuest();
                                     $this->context->cookie->passwd = $customer->passwd;
                                     $this->context->cookie->email = $customer->email;
                                     // Add customer to the context
                                     $this->context->customer = $customer;
                                     if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && ($id_cart = (int) Cart::lastNoneOrderedCart($this->context->customer->id))) {
                                         $this->context->cart = new Cart($id_cart);
                                     } else {
                                         $id_carrier = (int) $this->context->cart->id_carrier;
                                         $this->context->cart->id_carrier = 0;
                                         $this->context->cart->setDeliveryOption(null);
                                         $this->context->cart->id_address_delivery = (int) Address::getFirstCustomerAddressId((int) $customer->id);
                                         $this->context->cart->id_address_invoice = (int) Address::getFirstCustomerAddressId((int) $customer->id);
                                     }
                                     $this->context->cart->id_customer = (int) $customer->id;
                                     $this->context->cart->secure_key = $customer->secure_key;
                                     if ($this->ajax && isset($id_carrier) && $id_carrier && Configuration::get('PS_ORDER_PROCESS_TYPE')) {
                                         $delivery_option = array($this->context->cart->id_address_delivery => $id_carrier . ',');
                                         $this->context->cart->setDeliveryOption($delivery_option);
                                     }
                                     $this->context->cart->save();
                                     $this->context->cookie->id_cart = (int) $this->context->cart->id;
                                     $this->context->cookie->write();
                                     $this->context->cart->autosetProductAddress();
                                     Hook::exec('actionAuthentication');
                                     // Login information have changed, so we check if the cart rules still apply
                                     CartRule::autoRemoveFromCart($this->context);
                                     CartRule::autoAddToCart($this->context);
                                 }
                             }
                         }
                         exit;
                     case 'updateMessage':
                         if (Tools::isSubmit('message')) {
                             $txt_message = urldecode(Tools::getValue('message'));
                             $this->_updateMessage($txt_message);
                             if (count($this->errors)) {
                                 die('{"hasError" : true, "errors" : ["' . implode('\',\'', $this->errors) . '"]}');
                             }
                             die(true);
                         }
                         break;
                     case 'updateCarrierAndGetPayments':
                         if ((Tools::isSubmit('delivery_option') || Tools::isSubmit('id_carrier')) && Tools::isSubmit('recyclable') && Tools::isSubmit('gift') && Tools::isSubmit('gift_message')) {
                             $this->_assignWrappingAndTOS();
                             if ($this->_processCarrier()) {
                                 $carriers = $this->context->cart->simulateCarriersOutput();
                                 $return = array_merge(array('HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), 'HOOK_PAYMENT' => $this->_getPaymentMethods(), 'carrier_data' => $this->_getCarrierList(), 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array('carriers' => $carriers))), $this->getFormatedSummaryDetail());
                                 Cart::addExtraCarriers($return);
                                 die(Tools::jsonEncode($return));
                             } else {
                                 $this->errors[] = Tools::displayError('An error occurred while updating the cart.');
                             }
                             if (count($this->errors)) {
                                 die('{"hasError" : true, "errors" : ["' . implode('\',\'', $this->errors) . '"]}');
                             }
                             exit;
                         }
                         break;
                     case 'updateTOSStatusAndGetPayments':
                         if (Tools::isSubmit('checked')) {
                             $this->context->cookie->checkedTOS = (int) Tools::getValue('checked');
                             die(Tools::jsonEncode(array('HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), 'HOOK_PAYMENT' => $this->_getPaymentMethods())));
                         }
                         break;
                     case 'getCarrierList':
                         die(Tools::jsonEncode($this->_getCarrierList()));
                     case 'getAddressBlockAndCarriersAndPayments':
                         if ($this->context->customer->isLogged()) {
                             if (!Customer::getAddressesTotalById($this->context->customer->id)) {
                                 die(Tools::jsonEncode(array('no_address' => 1)));
                             }
                             if (file_exists(_PS_MODULE_DIR_ . 'blockuserinfo/blockuserinfo.php')) {
                                 include_once _PS_MODULE_DIR_ . 'blockuserinfo/blockuserinfo.php';
                                 $block_user_info = new BlockUserInfo();
                             }
                             $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart());
                             $this->_processAddressFormat();
                             $this->_assignAddress();
                             $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false);
                             $wrapping_fees_tax_inc = $wrapping_fees = $this->context->cart->getGiftWrappingPrice();
                             $return = array_merge(array('order_opc_adress' => $this->context->smarty->fetch(_PS_THEME_DIR_ . 'order-address.tpl'), 'block_user_info' => isset($block_user_info) ? $block_user_info->hookTop(array()) : '', 'carrier_data' => $this->_getCarrierList(), 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), 'HOOK_PAYMENT' => $this->_getPaymentMethods(), 'no_address' => 0, 'gift_price' => Tools::displayPrice(Tools::convertPrice(Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, new Currency((int) $this->context->cookie->id_currency)))), $this->getFormatedSummaryDetail());
                             die(Tools::jsonEncode($return));
                         }
                         die(Tools::displayError());
                     case 'makeFreeOrder':
                         if (($id_order = $this->_checkFreeOrder()) && $id_order) {
                             $order = new Order((int) $id_order);
                             $email = $this->context->customer->email;
                             if ($this->context->customer->is_guest) {
                                 $this->context->customer->logout();
                             }
                             die('freeorder:' . $order->reference . ':' . $email);
                         }
                         exit;
                     case 'updateAddressesSelected':
                         $get_order_reference_details_request = new OffAmazonPaymentsService_Model_GetOrderReferenceDetailsRequest();
                         $get_order_reference_details_request->setSellerId(self::$amz_payments->merchant_id);
                         $get_order_reference_details_request->setAmazonOrderReferenceId(Tools::getValue('amazonOrderReferenceId'));
                         if (isset($this->context->cookie->amz_access_token)) {
                             $get_order_reference_details_request->setAddressConsentToken(AmzPayments::prepareCookieValueForAmazonPaymentsUse($this->context->cookie->amz_access_token));
                         }
                         $reference_details_result_wrapper = $this->service->getOrderReferenceDetails($get_order_reference_details_request);
                         $physical_destination = $reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getDestination()->getPhysicalDestination();
                         $iso_code = (string) $physical_destination->GetCountryCode();
                         $city = (string) $physical_destination->GetCity();
                         $postcode = (string) $physical_destination->GetPostalCode();
                         $state = (string) $physical_destination->GetStateOrRegion();
                         $address_delivery = AmazonPaymentsAddressHelper::findByAmazonOrderReferenceIdOrNew(Tools::getValue('amazonOrderReferenceId'));
                         $address_delivery->id_country = Country::getByIso($iso_code);
                         $address_delivery->alias = 'Amazon Payments Delivery';
                         $address_delivery->lastname = 'amzLastname';
                         $address_delivery->firstname = 'amzFirstname';
                         $address_delivery->address1 = 'amzAddress1';
                         $address_delivery->city = $city;
                         $address_delivery->postcode = $postcode;
                         if ($state != '') {
                             $state_id = State::getIdByIso($state, Country::getByIso($iso_code));
                             if (!$state_id) {
                                 $state_id = State::getIdByName($state);
                             }
                             if ($state_id) {
                                 $address_delivery->id_state = $state_id;
                             }
                         }
                         $address_delivery->save();
                         AmazonPaymentsAddressHelper::saveAddressAmazonReference($address_delivery, Tools::getValue('amazonOrderReferenceId'));
                         $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart());
                         $old_delivery_address_id = $this->context->cart->id_address_delivery;
                         $this->context->cart->id_address_delivery = $address_delivery->id;
                         $this->context->cart->id_address_invoice = $address_delivery->id;
                         $this->context->cart->setNoMultishipping();
                         $this->context->cart->updateAddressId($old_delivery_address_id, $address_delivery->id);
                         if (!$this->context->cart->update()) {
                             $this->errors[] = Tools::displayError('An error occurred while updating your cart.');
                         }
                         $infos = Address::getCountryAndState((int) $this->context->cart->id_address_delivery);
                         if (isset($infos['id_country']) && $infos['id_country']) {
                             $country = new Country((int) $infos['id_country']);
                             $this->context->country = $country;
                         }
                         $cart_rules = $this->context->cart->getCartRules();
                         CartRule::autoRemoveFromCart($this->context);
                         CartRule::autoAddToCart($this->context);
                         if ((int) Tools::getValue('allow_refresh')) {
                             $cart_rules2 = $this->context->cart->getCartRules();
                             if (count($cart_rules2) != count($cart_rules)) {
                                 $this->ajax_refresh = true;
                             } else {
                                 $rule_list = array();
                                 foreach ($cart_rules2 as $rule) {
                                     $rule_list[] = $rule['id_cart_rule'];
                                 }
                                 foreach ($cart_rules as $rule) {
                                     if (!in_array($rule['id_cart_rule'], $rule_list)) {
                                         $this->ajax_refresh = true;
                                         break;
                                     }
                                 }
                             }
                         }
                         if (!$this->context->cart->isMultiAddressDelivery()) {
                             $this->context->cart->setNoMultishipping();
                         }
                         if (!count($this->errors)) {
                             $result = $this->_getCarrierList();
                             if (isset($result['hasError'])) {
                                 unset($result['hasError']);
                             }
                             if (isset($result['errors'])) {
                                 unset($result['errors']);
                             }
                             $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false);
                             $wrapping_fees_tax_inc = $wrapping_fees = $this->context->cart->getGiftWrappingPrice();
                             $result = array_merge($result, array('HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), 'HOOK_PAYMENT' => $this->_getPaymentMethods(), 'gift_price' => Tools::displayPrice(Tools::convertPrice(Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, new Currency((int) $this->context->cookie->id_currency))), 'carrier_data' => $this->_getCarrierList(), 'refresh' => (bool) $this->ajax_refresh), $this->getFormatedSummaryDetail());
                             die(Tools::jsonEncode($result));
                         }
                         if (count($this->errors)) {
                             die(Tools::jsonEncode(array('hasError' => true, 'errors' => $this->errors)));
                         }
                         break;
                     case 'multishipping':
                         $this->_assignSummaryInformations();
                         $this->context->smarty->assign('product_list', $this->context->cart->getProducts());
                         if ($this->context->customer->id) {
                             $this->context->smarty->assign('address_list', $this->context->customer->getAddresses($this->context->language->id));
                         } else {
                             $this->context->smarty->assign('address_list', array());
                         }
                         $this->setTemplate(_PS_THEME_DIR_ . 'order-address-multishipping-products.tpl');
                         $this->display();
                         die;
                     case 'cartReload':
                         $this->_assignSummaryInformations();
                         if ($this->context->customer->id) {
                             $this->context->smarty->assign('address_list', $this->context->customer->getAddresses($this->context->language->id));
                         } else {
                             $this->context->smarty->assign('address_list', array());
                         }
                         $this->context->smarty->assign('opc', true);
                         $this->setTemplate(_PS_THEME_DIR_ . 'shopping-cart.tpl');
                         $this->display();
                         die;
                     case 'noMultiAddressDelivery':
                         $this->context->cart->setNoMultishipping();
                         die;
                     case 'executeOrder':
                         $customer = new Customer((int) $this->context->cart->id_customer);
                         if (!Validate::isLoadedObject($customer)) {
                             $customer->is_guest = true;
                             $customer->lastname = 'AmazonPayments';
                             $customer->firstname = 'AmazonPayments';
                             $customer->email = 'amazon' . time() . '@localshop.xyz';
                             $customer->passwd = Tools::substr(md5(time()), 0, 10);
                             $customer->save();
                         }
                         if (Tools::getValue('confirm')) {
                             $total = $this->context->cart->getOrderTotal(true, Cart::BOTH);
                             $currency_order = new Currency((int) $this->context->cart->id_currency);
                             $currency_code = $currency_order->iso_code;
                             if (!AmazonTransactions::isAlreadyConfirmedOrder(Tools::getValue('amazonOrderReferenceId'))) {
                                 $set_order_reference_details_request = new OffAmazonPaymentsService_Model_SetOrderReferenceDetailsRequest();
                                 $set_order_reference_details_request->setSellerId(self::$amz_payments->merchant_id);
                                 $set_order_reference_details_request->setAmazonOrderReferenceId(Tools::getValue('amazonOrderReferenceId'));
                                 $set_order_reference_details_request->setOrderReferenceAttributes(new OffAmazonPaymentsService_Model_OrderReferenceAttributes());
                                 $set_order_reference_details_request->getOrderReferenceAttributes()->setOrderTotal(new OffAmazonPaymentsService_Model_OrderTotal());
                                 $set_order_reference_details_request->getOrderReferenceAttributes()->getOrderTotal()->setCurrencyCode($currency_code);
                                 $set_order_reference_details_request->getOrderReferenceAttributes()->getOrderTotal()->setAmount($total);
                                 $set_order_reference_details_request->getOrderReferenceAttributes()->setPlatformId(self::$amz_payments->getPfId());
                                 $set_order_reference_details_request->getOrderReferenceAttributes()->setSellerOrderAttributes(new OffAmazonPaymentsService_Model_SellerOrderAttributes());
                                 $set_order_reference_details_request->getOrderReferenceAttributes()->getSellerOrderAttributes()->setSellerOrderId(self::$amz_payments->createUniqueOrderId((int) $this->context->cart->id));
                                 $set_order_reference_details_request->getOrderReferenceAttributes()->getSellerOrderAttributes()->setStoreName(Configuration::get('PS_SHOP_NAME'));
                                 $this->service->setOrderReferenceDetails($set_order_reference_details_request);
                                 $confirm_order_reference_request = new OffAmazonPaymentsService_Model_ConfirmOrderReferenceRequest();
                                 $confirm_order_reference_request->setAmazonOrderReferenceId(Tools::getValue('amazonOrderReferenceId'));
                                 $confirm_order_reference_request->setSellerId(self::$amz_payments->merchant_id);
                                 $this->service->confirmOrderReference($confirm_order_reference_request);
                                 $get_order_reference_details_request = new OffAmazonPaymentsService_Model_GetOrderReferenceDetailsRequest();
                                 $get_order_reference_details_request->setSellerId(self::$amz_payments->merchant_id);
                                 $get_order_reference_details_request->setAmazonOrderReferenceId(Tools::getValue('amazonOrderReferenceId'));
                                 if (isset($this->context->cookie->amz_access_token)) {
                                     $get_order_reference_details_request->setAddressConsentToken(AmzPayments::prepareCookieValueForAmazonPaymentsUse($this->context->cookie->amz_access_token));
                                 }
                                 $reference_details_result_wrapper = $this->service->getOrderReferenceDetails($get_order_reference_details_request);
                                 $sql_arr = array('amz_tx_time' => pSQL(time()), 'amz_tx_type' => 'order_ref', 'amz_tx_status' => pSQL($reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getOrderReferenceStatus()->getState()), 'amz_tx_order_reference' => pSQL(Tools::getValue('amazonOrderReferenceId')), 'amz_tx_expiration' => pSQL(strtotime($reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getExpirationTimestamp())), 'amz_tx_reference' => pSQL(Tools::getValue('amazonOrderReferenceId')), 'amz_tx_amz_id' => pSQL(Tools::getValue('amazonOrderReferenceId')), 'amz_tx_last_change' => pSQL(time()), 'amz_tx_amount' => pSQL($reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getOrderTotal()->getAmount()));
                                 Db::getInstance()->insert('amz_transactions', $sql_arr);
                             } else {
                                 $get_order_reference_details_request = new OffAmazonPaymentsService_Model_GetOrderReferenceDetailsRequest();
                                 $get_order_reference_details_request->setSellerId(self::$amz_payments->merchant_id);
                                 $get_order_reference_details_request->setAmazonOrderReferenceId(Tools::getValue('amazonOrderReferenceId'));
                                 if (isset($this->context->cookie->amz_access_token)) {
                                     $get_order_reference_details_request->setAddressConsentToken(AmzPayments::prepareCookieValueForAmazonPaymentsUse($this->context->cookie->amz_access_token));
                                 }
                                 $reference_details_result_wrapper = $this->service->getOrderReferenceDetails($get_order_reference_details_request);
                             }
                             $physical_destination = $reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getDestination()->getPhysicalDestination();
                             $iso_code = (string) $physical_destination->GetCountryCode();
                             $city = (string) $physical_destination->GetCity();
                             $postcode = (string) $physical_destination->GetPostalCode();
                             $state = (string) $physical_destination->GetStateOrRegion();
                             $names_array = explode(' ', (string) $physical_destination->getName(), 2);
                             $regex = '/[^a-zA-ZäöüÄÖÜßÂâÀÁáàÇçÈÉËëéèÎîÏïÙÛùúòóûêôíÍŸÿªñÑ\\s]/u';
                             $names_array[0] = preg_replace($regex, '', $names_array[0]);
                             $names_array[1] = preg_replace($regex, '', $names_array[1]);
                             if ($customer->is_guest) {
                                 $customer->lastname = $names_array[1];
                                 $customer->firstname = $names_array[0];
                                 $customer->email = (string) $reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getBuyer()->getEmail();
                                 $customer->save();
                                 $this->context->cart->id_customer = $customer->id;
                                 $this->context->cart->save();
                             }
                             $s_company_name = '';
                             if ((string) $physical_destination->getAddressLine3() != '') {
                                 $s_street = Tools::substr($physical_destination->getAddressLine3(), 0, Tools::strrpos($physical_destination->getAddressLine3(), ' '));
                                 $s_street_nr = Tools::substr($physical_destination->getAddressLine3(), Tools::strrpos($physical_destination->getAddressLine3(), ' ') + 1);
                                 $s_company_name = trim($physical_destination->getAddressLine1() . $physical_destination->getAddressLine2());
                             } else {
                                 if ((string) $physical_destination->getAddressLine2() != '') {
                                     $s_street = Tools::substr($physical_destination->getAddressLine2(), 0, Tools::strrpos($physical_destination->getAddressLine2(), ' '));
                                     $s_street_nr = Tools::substr($physical_destination->getAddressLine2(), Tools::strrpos($physical_destination->getAddressLine2(), ' ') + 1);
                                     $s_company_name = trim($physical_destination->getAddressLine1());
                                 } else {
                                     $s_street = Tools::substr($physical_destination->getAddressLine1(), 0, Tools::strrpos($physical_destination->getAddressLine1(), ' '));
                                     $s_street_nr = Tools::substr($physical_destination->getAddressLine1(), Tools::strrpos($physical_destination->getAddressLine1(), ' ') + 1);
                                 }
                             }
                             $phone = '';
                             if ((string) $physical_destination->getPhone() != '' && ValidateCore::isPhoneNumber((string) $physical_destination->getPhone())) {
                                 $phone = (string) $physical_destination->getPhone();
                             }
                             $address_delivery = AmazonPaymentsAddressHelper::findByAmazonOrderReferenceIdOrNew(Tools::getValue('amazonOrderReferenceId'));
                             $address_delivery->lastname = $names_array[1];
                             $address_delivery->firstname = $names_array[0];
                             if ($s_company_name != '') {
                                 $address_delivery->company = $s_company_name;
                             }
                             $address_delivery->address1 = (string) $s_street . ' ' . (string) $s_street_nr;
                             $address_delivery->postcode = (string) $physical_destination->getPostalCode();
                             $address_delivery->id_country = Country::getByIso((string) $physical_destination->getCountryCode());
                             if ($phone != '') {
                                 $address_delivery->phone = $phone;
                             }
                             if ($state != '') {
                                 $state_id = State::getIdByIso($state, Country::getByIso((string) $physical_destination->getCountryCode()));
                                 if (!$state_id) {
                                     $state_id = State::getIdByName($state);
                                 }
                                 if ($state_id) {
                                     $address_delivery->id_state = $state_id;
                                 }
                             }
                             $address_delivery->save();
                             AmazonPaymentsAddressHelper::saveAddressAmazonReference($address_delivery, Tools::getValue('amazonOrderReferenceId'));
                             $this->context->cart->id_address_delivery = $address_delivery->id;
                             $billing_address_object = $reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getBillingAddress();
                             if (method_exists($billing_address_object, 'getPhysicalAddress')) {
                                 $amz_billing_address = $reference_details_result_wrapper->GetOrderReferenceDetailsResult->getOrderReferenceDetails()->getBillingAddress()->getPhysicalAddress();
                                 $iso_code = (string) $amz_billing_address->GetCountryCode();
                                 $city = (string) $amz_billing_address->GetCity();
                                 $postcode = (string) $amz_billing_address->GetPostalCode();
                                 $state = (string) $amz_billing_address->GetStateOrRegion();
                                 $invoice_names_array = explode(' ', (string) $amz_billing_address->getName(), 2);
                                 $regex = '/[^a-zA-ZäöüÄÖÜßÂâÀÁáàÇçÈÉËëéèÎîÏïÙÛùúòóûêôíÍŸÿªñÑ\\s]/u';
                                 $invoice_names_array[0] = preg_replace($regex, '', $invoice_names_array[0]);
                                 $invoice_names_array[1] = preg_replace($regex, '', $invoice_names_array[1]);
                                 $s_company_name = '';
                                 if ((string) $amz_billing_address->getAddressLine3() != '') {
                                     $s_street = Tools::substr($amz_billing_address->getAddressLine3(), 0, Tools::strrpos($amz_billing_address->getAddressLine3(), ' '));
                                     $s_street_nr = Tools::substr($amz_billing_address->getAddressLine3(), Tools::strrpos($amz_billing_address->getAddressLine3(), ' ') + 1);
                                     $s_company_name = trim($amz_billing_address->getAddressLine1() . $amz_billing_address->getAddressLine2());
                                 } else {
                                     if ((string) $amz_billing_address->getAddressLine2() != '') {
                                         $s_street = Tools::substr($amz_billing_address->getAddressLine2(), 0, Tools::strrpos($amz_billing_address->getAddressLine2(), ' '));
                                         $s_street_nr = Tools::substr($amz_billing_address->getAddressLine2(), Tools::strrpos($amz_billing_address->getAddressLine2(), ' ') + 1);
                                         $s_company_name = trim($amz_billing_address->getAddressLine1());
                                     } else {
                                         $s_street = Tools::substr($amz_billing_address->getAddressLine1(), 0, Tools::strrpos($amz_billing_address->getAddressLine1(), ' '));
                                         $s_street_nr = Tools::substr($amz_billing_address->getAddressLine1(), Tools::strrpos($amz_billing_address->getAddressLine1(), ' ') + 1);
                                     }
                                 }
                                 $phone = '';
                                 if ((string) $amz_billing_address->getPhone() != '' && ValidateCore::isPhoneNumber((string) $amz_billing_address->getPhone())) {
                                     $phone = (string) $amz_billing_address->getPhone();
                                 }
                                 $address_invoice = AmazonPaymentsAddressHelper::findByAmazonOrderReferenceIdOrNew(Tools::getValue('amazonOrderReferenceId') . '-inv');
                                 $address_invoice->alias = 'Amazon Payments Invoice';
                                 $address_invoice->lastname = $invoice_names_array[1];
                                 $address_invoice->firstname = $invoice_names_array[0];
                                 if ($s_company_name != '') {
                                     $address_invoice->company = $s_company_name;
                                 }
                                 $address_invoice->address1 = (string) $s_street . ' ' . (string) $s_street_nr;
                                 $address_invoice->postcode = (string) $amz_billing_address->getPostalCode();
                                 $address_invoice->city = $city;
                                 $address_invoice->id_country = Country::getByIso((string) $amz_billing_address->getCountryCode());
                                 if ($phone != '') {
                                     $address_invoice->phone = $phone;
                                 }
                                 if ($state != '') {
                                     $state_id = State::getIdByIso($state, Country::getByIso((string) $amz_billing_address->getCountryCode()));
                                     if (!$state_id) {
                                         $state_id = State::getIdByName($state);
                                     }
                                     if ($state_id) {
                                         $address_invoice->id_state = $state_id;
                                     }
                                 }
                                 $address_invoice->save();
                                 AmazonPaymentsAddressHelper::saveAddressAmazonReference($address_invoice, Tools::getValue('amazonOrderReferenceId') . '-inv');
                                 $this->context->cart->id_address_invoice = $address_invoice->id;
                             } else {
                                 $this->context->cart->id_address_invoice = $address_delivery->id;
                                 $address_invoice = $address_delivery;
                             }
                             $this->context->cart->save();
                             if (self::$amz_payments->authorization_mode == 'fast_auth') {
                                 $authorization_reference_id = Tools::getValue('amazonOrderReferenceId');
                                 if (isset($this->context->cookie->setHadErrorNowWallet) && $this->context->cookie->setHadErrorNowWallet == 1) {
                                     $confirm_order_ref_req_model = new OffAmazonPaymentsService_Model_ConfirmOrderReferenceRequest();
                                     $confirm_order_ref_req_model->setAmazonOrderReferenceId(Tools::getValue('amazonOrderReferenceId'));
                                     $confirm_order_ref_req_model->setSellerId(self::$amz_payments->merchant_id);
                                     try {
                                         $this->service->confirmOrderReference($confirm_order_ref_req_model);
                                     } catch (OffAmazonPaymentsService_Exception $e) {
                                         echo 'ERROR: ' . $e->getMessage();
                                     }
                                     unset($this->context->cookie->setHadErrorNowWallet);
                                 }
                                 $authorization_response_wrapper = AmazonTransactions::fastAuth(self::$amz_payments, $this->service, $authorization_reference_id, $total, $currency_code);
                                 if (is_object($authorization_response_wrapper)) {
                                     $details = $authorization_response_wrapper->getAuthorizeResult()->getAuthorizationDetails();
                                     $status = $details->getAuthorizationStatus()->getState();
                                     if ($status == 'Declined') {
                                         $reason = $details->getAuthorizationStatus()->getReasonCode();
                                         if ($reason == 'InvalidPaymentMethod') {
                                             $this->context->cookie->setHadErrorNowWallet = 1;
                                             die(Tools::jsonEncode(array('hasError' => true, 'errors' => array(Tools::displayError(self::$amz_payments->l('Your selected payment method is currently not available. Please select another one.'))))));
                                         } else {
                                             die(Tools::jsonEncode(array('hasError' => true, 'redirection' => 'index.php?controller=order', 'errors' => array(Tools::displayError(self::$amz_payments->l('Your selected payment method has been declined. Please chose another one.'))))));
                                         }
                                     }
                                     $amazon_authorization_id = $authorization_response_wrapper->getAuthorizeResult()->getAuthorizationDetails()->getAmazonAuthorizationId();
                                     /*
                                     if (self::$amz_payments->capture_mode == 'after_auth') {
                                         $amazon_capture_response = AmazonTransactions::capture(self::$amz_payments, $this->service, $amazon_authorization_id, $total, $currency_code);
                                         if (is_object($amazon_capture_response)) {
                                             $amazon_capture_id = $amazon_capture_response->getCaptureResult()
                                                 ->getCaptureDetails()
                                                 ->getAmazonCaptureId();
                                             $amazon_capture_reference_id = $amazon_capture_response->getCaptureResult()
                                                 ->getCaptureDetails()
                                                 ->getCaptureReferenceId();
                                         }
                                     }
                                     */
                                 }
                             }
                             if ($this->context->cart->secure_key == '') {
                                 $this->context->cart->secure_key = $customer->secure_key;
                                 $this->context->cart->save();
                             }
                             $new_order_status_id = (int) Configuration::get('PS_OS_PREPARATION');
                             if ((int) Configuration::get('AMZ_ORDER_STATUS_ID') > 0) {
                                 $new_order_status_id = Configuration::get('AMZ_ORDER_STATUS_ID');
                             }
                             $this->module->validateOrder((int) $this->context->cart->id, $new_order_status_id, $total, $this->module->displayName, null, array(), null, false, $customer->secure_key);
                             if (self::$amz_payments->authorization_mode == 'after_checkout') {
                                 $authorization_reference_id = Tools::getValue('amazonOrderReferenceId');
                                 $authorization_response_wrapper = AmazonTransactions::authorize(self::$amz_payments, $this->service, $authorization_reference_id, $total, $currency_code);
                                 $amazon_authorization_id = @$authorization_response_wrapper->getAuthorizeResult()->getAuthorizationDetails()->getAmazonAuthorizationId();
                                 /*
                                 if (self::$amz_payments->capture_mode == 'after_auth' && isset($amazon_authorization_id) && $amazon_authorization_id !== false && $amazon_authorization_id != null) {
                                     $amazon_capture_response = AmazonTransactions::capture(self::$amz_payments, $this->service, $amazon_authorization_id, $total, $currency_code);
                                     if (is_object($amazon_capture_response)) {
                                         $amazon_capture_id = $amazon_capture_response->getCaptureResult()
                                             ->getCaptureDetails()
                                             ->getAmazonCaptureId();
                                         $amazon_capture_reference_id = $amazon_capture_response->getCaptureResult()
                                             ->getCaptureDetails()
                                             ->getCaptureReferenceId();
                                     }
                                 }
                                 */
                             }
                             self::$amz_payments->setAmazonReferenceIdForOrderId(Tools::getValue('amazonOrderReferenceId'), $this->module->currentOrder);
                             self::$amz_payments->setAmazonReferenceIdForOrderTransactionId(Tools::getValue('amazonOrderReferenceId'), $this->module->currentOrder);
                             if (isset($authorization_reference_id)) {
                                 self::$amz_payments->setAmazonAuthorizationReferenceIdForOrderId($authorization_reference_id, $this->module->currentOrder);
                             }
                             if (isset($amazon_authorization_id)) {
                                 self::$amz_payments->setAmazonAuthorizationIdForOrderId($amazon_authorization_id, $this->module->currentOrder);
                             }
                             /*
                             if (isset($amazon_capture_reference_id)) {
                                 self::$amz_payments->setAmazonCaptureReferenceIdForOrderId($amazon_capture_reference_id, $this->module->currentOrder);
                             }
                             if (isset($amazon_capture_id)) {
                                 self::$amz_payments->setAmazonCaptureIdForOrderId($amazon_capture_id, $this->module->currentOrder);
                             }
                             */
                             if (isset($this->context->cookie->amzSetStatusAuthorized)) {
                                 $tmpOrderRefs = Tools::unSerialize($this->context->cookie->amzSetStatusAuthorized);
                                 if (is_array($tmpOrderRefs)) {
                                     foreach ($tmpOrderRefs as $order_ref) {
                                         AmazonTransactions::setOrderStatusAuthorized($order_ref);
                                     }
                                 }
                                 unset($this->context->cookie->amzSetStatusAuthorized);
                             }
                             if (isset($this->context->cookie->amzSetStatusCaptured)) {
                                 $tmpOrderRefs = Tools::unSerialize($this->context->cookie->amzSetStatusCaptured);
                                 if (is_array($tmpOrderRefs)) {
                                     foreach ($tmpOrderRefs as $order_ref) {
                                         AmazonTransactions::setOrderStatusCaptured($order_ref);
                                     }
                                 }
                                 unset($this->context->cookie->amzSetStatusCaptured);
                             }
                             if (Tools::getValue('connect_amz_account') == '1') {
                                 $this->context->cookie->amz_connect_order = $this->module->currentOrder;
                                 $this->context->cookie->amz_payments_address_id = $address_delivery->id;
                                 $this->context->cookie->amz_payments_invoice_address_id = $address_invoice->id;
                                 $login_redirect = $this->context->link->getModuleLink('amzpayments', 'process_login');
                                 $login_redirect = str_replace('http://', 'https://', $login_redirect);
                                 $login_redirect .= '?fromCheckout=1&access_token=' . $this->context->cookie->amz_access_token;
                                 die(Tools::jsonEncode(array('orderSucceed' => true, 'redirection' => $login_redirect)));
                             }
                             if (!$customer->is_guest) {
                                 if (!AmzPayments::addressAlreadyExists($address_delivery, $customer)) {
                                     $address_delivery->id_customer = $customer->id;
                                     $address_delivery->save();
                                 }
                                 if (!AmzPayments::addressAlreadyExists($address_invoice, $customer)) {
                                     $address_invoice->id_customer = $customer->id;
                                     $address_invoice->save();
                                 }
                             } else {
                                 if ($registered_customer = AmazonPaymentsCustomerHelper::findByEmailAddress($customer->email)) {
                                     if (!AmzPayments::addressAlreadyExists($address_delivery, $registered_customer)) {
                                         $address_delivery->id_customer = $registered_customer->id;
                                         $address_delivery->save();
                                     }
                                     if (!AmzPayments::addressAlreadyExists($address_invoice, $registered_customer)) {
                                         $address_invoice->id_customer = $registered_customer->id;
                                         $address_invoice->save();
                                     }
                                 }
                                 $this->context->cookie->show_success_amz_message = true;
                             }
                             die(Tools::jsonEncode(array('orderSucceed' => true, 'redirection' => __PS_BASE_URI__ . 'index.php?controller=order-confirmation&id_cart=' . (int) $this->context->cart->id . '&id_module=' . $this->module->id . '&id_order=' . $this->module->currentOrder . '&key=' . $customer->secure_key)));
                         }
                         die;
                     default:
                         throw new PrestaShopException('Unknown method "' . Tools::getValue('method') . '"');
                 }
             } else {
                 throw new PrestaShopException('Method is not defined');
             }
         }
     } elseif (Tools::isSubmit('ajax')) {
         throw new PrestaShopException('Method is not defined');
     }
 }