shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

amazon_login_pay.php (36674B)


      1 <?php
      2 class ControllerExtensionPaymentAmazonLoginPay extends Controller {
      3 	public function address() {
      4 		$this->load->language('extension/payment/amazon_login_pay');
      5 		$this->document->setTitle($this->language->get('heading_title'));
      6 
      7 		$this->load->model('extension/payment/amazon_login_pay');
      8 
      9 		// capital L in Amazon cookie name is required, do not alter for coding standards
     10 		if (!isset($this->request->cookie['amazon_Login_state_cache'])) {
     11 			$this->session->data['lpa']['error'] = $this->language->get('error_login');
     12 			$this->response->redirect($this->url->link('extension/payment/amazon_login_pay/failure', '', true));
     13 		}
     14 
     15 		if ($this->config->get('payment_amazon_login_pay_minimum_total') > 0 && $this->config->get('payment_amazon_login_pay_minimum_total') > $this->cart->getSubTotal()) {
     16 			$this->failure(sprintf($this->language->get('error_minimum'), $this->currency->format($this->config->get('payment_amazon_login_pay_minimum_total'), $this->session->data['currency'])));
     17 		}
     18 
     19 		$data['merchant_id'] = $this->config->get('payment_amazon_login_pay_merchant_id');
     20 		$data['shipping_quotes'] = $this->url->link('extension/payment/amazon_login_pay/shippingquotes', '', true);
     21 		$data['payment_method'] = $this->url->link('extension/payment/amazon_login_pay/paymentmethod', '', true);
     22 
     23 		$data['cart'] = $this->url->link('checkout/cart');
     24 		$data['text_cart'] = $this->language->get('text_cart');
     25 
     26 		$data['payment_amazon_login_pay_merchant_id'] = $this->config->get('payment_amazon_login_pay_merchant_id');
     27 		$data['payment_amazon_login_pay_client_id'] = $this->config->get('payment_amazon_login_pay_client_id');
     28 		$data['payment_amazon_login_pay_client_secret'] = $this->config->get('payment_amazon_login_pay_client_secret');
     29 		if ($this->config->get('payment_amazon_login_pay_test') == 'sandbox') {
     30 			$data['payment_amazon_login_pay_test'] = true;
     31 		}
     32 
     33 		$amazon_payment_js = $this->model_extension_payment_amazon_login_pay->getWidgetJs();
     34 		$this->document->addScript($amazon_payment_js);
     35 
     36 		$data['column_left'] = $this->load->controller('common/column_left');
     37 		$data['column_right'] = $this->load->controller('common/column_right');
     38 		$data['content_top'] = $this->load->controller('common/content_top');
     39 		$data['content_bottom'] = $this->load->controller('common/content_bottom');
     40 		$data['footer'] = $this->load->controller('common/footer');
     41 		$data['header'] = $this->load->controller('common/header');
     42 
     43 		$this->response->setOutput($this->load->view('extension/payment/amazon_login_pay_address', $data));
     44 	}
     45 
     46 	public function paymentMethod() {
     47 		$this->load->language('extension/payment/amazon_login_pay');
     48 		$this->document->setTitle($this->language->get('heading_title'));
     49 
     50 		$this->load->model('extension/payment/amazon_login_pay');
     51 
     52 		// capital L in Amazon cookie name is required, do not alter for coding standards
     53 		if (!isset($this->request->cookie['amazon_Login_state_cache'])) {
     54 			$this->session->data['lpa']['error'] = $this->language->get('error_login');
     55 			$this->response->redirect($this->url->link('extension/payment/amazon_login_pay/failure', '', true));
     56 		}
     57 
     58 		if ($this->config->get('payment_amazon_login_pay_minimum_total') > 0 && $this->config->get('payment_amazon_login_pay_minimum_total') > $this->cart->getSubTotal()) {
     59 			$this->failure(sprintf($this->language->get('error_minimum'), $this->currency->format($this->config->get('payment_amazon_login_pay_minimum_total'), $this->session->data['currency'])));
     60 		}
     61 
     62 		$data['payment_amazon_login_pay_merchant_id'] = $this->config->get('payment_amazon_login_pay_merchant_id');
     63 		$data['payment_amazon_login_pay_client_id'] = $this->config->get('payment_amazon_login_pay_client_id');
     64 		$data['payment_amazon_login_pay_client_secret'] = $this->config->get('payment_amazon_login_pay_client_secret');
     65 		if ($this->config->get('payment_amazon_login_pay_test') == 'sandbox') {
     66 			$data['payment_amazon_login_pay_test'] = true;
     67 		}
     68 		$data['confirm_order'] = $this->url->link('extension/payment/amazon_login_pay/confirm', '', true);
     69 
     70 		$amazon_payment_js = $this->model_extension_payment_amazon_login_pay->getWidgetJs();
     71 		$this->document->addScript($amazon_payment_js);
     72 
     73 		if ($this->customer->islogged() && isset($this->session->data['lpa']['address'])) {
     74 			$this->model_extension_payment_amazon_login_pay->addAddress($this->session->data['lpa']['address']);
     75 		}
     76 
     77 		$data['continue'] = $this->url->link('extension/payment/amazon_login_pay/confirm', '', true);
     78 		$data['back'] = $this->url->link('extension/payment/amazon_login_pay/address', '', true);
     79 
     80 		$data['column_left'] = $this->load->controller('common/column_left');
     81 		$data['column_right'] = $this->load->controller('common/column_right');
     82 		$data['content_top'] = $this->load->controller('common/content_top');
     83 		$data['content_bottom'] = $this->load->controller('common/content_bottom');
     84 		$data['footer'] = $this->load->controller('common/footer');
     85 		$data['header'] = $this->load->controller('common/header');
     86 
     87 		$this->response->setOutput($this->load->view('extension/payment/amazon_login_pay_payment', $data));
     88 	}
     89 
     90 	public function confirm() {
     91 		$this->load->language('extension/payment/amazon_login_pay');
     92 		$this->load->language('checkout/checkout');
     93 		$this->document->setTitle($this->language->get('heading_title'));
     94 
     95 		$this->load->model('setting/extension');
     96 		$this->load->model('extension/payment/amazon_login_pay');
     97 
     98 		// capital L in Amazon cookie name is required, do not alter for coding standards
     99 		if (!isset($this->request->cookie['amazon_Login_state_cache'])) {
    100 			$this->session->data['lpa']['error'] = $this->language->get('error_login');
    101 			$this->response->redirect($this->url->link('extension/payment/amazon_login_pay/loginFailure', '', true));
    102 		}
    103 
    104 		if ($this->config->get('payment_amazon_login_pay_minimum_total') > 0 && $this->config->get('payment_amazon_login_pay_minimum_total') > $this->cart->getSubTotal()) {
    105 			$this->failure(sprintf($this->language->get('error_minimum'), $this->currency->format($this->config->get('payment_amazon_login_pay_minimum_total'), $this->session->data['currency'])));
    106 		}
    107 
    108 		$data['payment_amazon_login_pay_merchant_id'] = $this->config->get('payment_amazon_login_pay_merchant_id');
    109 		$data['payment_amazon_login_pay_client_id'] = $this->config->get('payment_amazon_login_pay_client_id');
    110 		if ($this->config->get('payment_amazon_login_pay_test') == 'sandbox') {
    111 			$data['payment_amazon_login_pay_test'] = true;
    112 		}
    113 
    114 		$amazon_payment_js = $this->model_extension_payment_amazon_login_pay->getWidgetJs();
    115 		$this->document->addScript($amazon_payment_js);
    116 
    117 		if (isset($this->session->data['lpa']['AmazonOrderReferenceId'])) {
    118 			$data['AmazonOrderReferenceId'] = $this->session->data['lpa']['AmazonOrderReferenceId'];
    119 		} else {
    120 			$this->failure($this->language->get('error_process_order'));
    121 		}
    122 
    123 		if (!empty($this->session->data['vouchers']) || !$this->cart->hasProducts() || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
    124 			$this->response->redirect($this->url->link('checkout/cart'));
    125 		}
    126 
    127 		$data['heading_confirm'] = $this->language->get('heading_confirm');
    128 		$data['column_name'] = $this->language->get('column_name');
    129 		$data['column_model'] = $this->language->get('column_model');
    130 		$data['column_quantity'] = $this->language->get('column_quantity');
    131 		$data['column_price'] = $this->language->get('column_price');
    132 		$data['column_total'] = $this->language->get('column_total');
    133 		$data['text_confirm'] = $this->language->get('text_confirm');
    134 
    135 		$products = $this->cart->getProducts();
    136 
    137 		foreach ($products as $product) {
    138 			$product_total = 0;
    139 
    140 			foreach ($products as $product_2) {
    141 				if ($product_2['product_id'] == $product['product_id']) {
    142 					$product_total += $product_2['quantity'];
    143 				}
    144 			}
    145 
    146 			if ($product['minimum'] > $product_total) {
    147 				$this->response->redirect($this->url->link('checkout/cart'));
    148 			}
    149 		}
    150 
    151 		if (!isset($this->session->data['lpa']['shipping_method']) || !isset($this->session->data['lpa']['address'])) {
    152 			$this->response->redirect($this->url->link('extension/payment/amazon_login_pay/address', '', true));
    153 		}
    154 
    155 		// Totals
    156 		$totals = array();
    157 		$taxes = $this->cart->getTaxes();
    158 		$total = 0;
    159 
    160 		// Because __call can not keep var references so we put them into an array.
    161 		$total_data = array(
    162 			'totals' => &$totals,
    163 			'taxes' => &$taxes,
    164 			'total' => &$total
    165 		);
    166 
    167 		$old_taxes = $taxes;
    168 		$lpa_tax = array();
    169 
    170 		$sort_order = array();
    171 
    172 		$results = $this->model_setting_extension->getExtensions('total');
    173 
    174 		foreach ($results as $key => $value) {
    175 			if (isset($value['code'])) {
    176 				$code = $value['code'];
    177 			} else {
    178 				$code = $value['key'];
    179 			}
    180 
    181 			$sort_order[$key] = $this->config->get('total_' . $code . '_sort_order');
    182 		}
    183 
    184 		array_multisort($sort_order, SORT_ASC, $results);
    185 
    186 		foreach ($results as $result) {
    187 			if (isset($result['code'])) {
    188 				$code = $result['code'];
    189 			} else {
    190 				$code = $result['key'];
    191 			}
    192 
    193 			if ($this->config->get('total_' . $code . '_status')) {
    194 				$this->load->model('extension/total/' . $code);
    195 
    196 				// We have to put the totals in an array so that they pass by reference.
    197 				$this->{'model_extension_total_' . $code}->getTotal($total_data);
    198 
    199 				if (!empty($totals[count($totals) - 1]) && !isset($totals[count($totals) - 1]['code'])) {
    200 					$totals[count($totals) - 1]['code'] = $code;
    201 				}
    202 
    203 				$tax_difference = 0;
    204 
    205 				foreach ($taxes as $tax_id => $value) {
    206 					if (isset($old_taxes[$tax_id])) {
    207 						$tax_difference += $value - $old_taxes[$tax_id];
    208 					} else {
    209 						$tax_difference += $value;
    210 					}
    211 				}
    212 
    213 				if ($tax_difference != 0) {
    214 					$lpa_tax[$code] = $tax_difference;
    215 				}
    216 
    217 				$old_taxes = $taxes;
    218 			}
    219 		}
    220 
    221 		$sort_order = array();
    222 
    223 		foreach ($totals as $key => $value) {
    224 			$sort_order[$key] = $value['sort_order'];
    225 
    226 			if (isset($lpa_tax[$value['code']])) {
    227 				$total_data['totals'][$key]['lpa_tax'] = $lpa_tax[$value['code']];
    228 			} else {
    229 				$total_data['totals'][$key]['lpa_tax'] = '';
    230 			}
    231 		}
    232 
    233 		array_multisort($sort_order, SORT_ASC, $totals);
    234 
    235 		$order_data = array();
    236 
    237 		$order_data['invoice_prefix'] = $this->config->get('config_invoice_prefix');
    238 		$order_data['store_id'] = $this->config->get('config_store_id');
    239 		$order_data['store_name'] = $this->config->get('config_name');
    240 
    241 		if ($order_data['store_id']) {
    242 			$order_data['store_url'] = $this->config->get('config_url');
    243 		} else {
    244 			$order_data['store_url'] = HTTP_SERVER;
    245 		}
    246 
    247 		$address = $this->session->data['lpa']['address'];
    248 
    249 		if ($this->customer->isLogged()) {
    250 			$this->load->model('account/customer');
    251 
    252 			$customer_info = $this->model_account_customer->getCustomer($this->customer->getId());
    253 
    254 			$order_data['customer_id'] = $this->customer->getId();
    255 			$order_data['customer_group_id'] = $customer_info['customer_group_id'];
    256 			$order_data['firstname'] = $customer_info['firstname'];
    257 			$order_data['lastname'] = $customer_info['lastname'];
    258 			$order_data['email'] = $customer_info['email'];
    259 			$order_data['telephone'] = $customer_info['telephone'];
    260 			$order_data['custom_field'] = json_decode($customer_info['custom_field'], true);
    261 		} elseif (isset($this->session->data['guest'])) {
    262 			$order_data['customer_id'] = 0;
    263 			$order_data['customer_group_id'] = $this->session->data['guest']['customer_group_id'];
    264 			$order_data['firstname'] = $this->session->data['guest']['firstname'];
    265 			$order_data['lastname'] = $this->session->data['guest']['lastname'];
    266 			$order_data['email'] = $this->session->data['guest']['email'];
    267 			$order_data['telephone'] = $this->session->data['guest']['telephone'];
    268 		}
    269 
    270 		if (isset($this->session->data['coupon'])) {
    271 			$this->load->model('extension/total/coupon');
    272 
    273 			$coupon = $this->model_extension_total_coupon->getCoupon($this->session->data['coupon']);
    274 
    275 			if ($coupon) {
    276 				$order_data['coupon_id'] = $coupon['coupon_id'];
    277 				$order_data['lpa_free_shipping'] = $coupon['shipping'];
    278 			} else {
    279 				$order_data['coupon_id'] = 0;
    280 				$order_data['lpa_free_shipping'] = '0';
    281 			}
    282 		} else {
    283 			$order_data['coupon_id'] = 0;
    284 			$order_data['lpa_free_shipping'] = '0';
    285 		}
    286 
    287 		$order_data['payment_firstname'] = $order_data['firstname'];
    288 		$order_data['payment_lastname'] = $order_data['lastname'];
    289 		$order_data['payment_company'] = $address['company'];
    290 		$order_data['payment_company_id'] = $address['company_id'];
    291 		$order_data['payment_tax_id'] = $address['tax_id'];
    292 		$order_data['payment_address_1'] = $address['address_1'];
    293 		$order_data['payment_address_2'] = $address['address_2'];
    294 		$order_data['payment_city'] = $address['city'];
    295 		$order_data['payment_postcode'] = $address['postcode'];
    296 		$order_data['payment_zone'] = $address['zone'];
    297 		$order_data['payment_zone_id'] = $address['zone_id'];
    298 		$order_data['payment_country'] = $address['country'];
    299 		$order_data['payment_country_id'] = $address['country_id'];
    300 		$order_data['payment_address_format'] = $address['address_format'];
    301 
    302 		$order_data['payment_method'] = $this->language->get('text_lpa');
    303 		$order_data['payment_code'] = 'amazon_login_pay';
    304 
    305 		$order_data['shipping_firstname'] = $address['firstname'];
    306 		$order_data['shipping_lastname'] = $address['lastname'];
    307 		$order_data['shipping_company'] = $address['company'];
    308 		$order_data['shipping_address_1'] = $address['address_1'];
    309 		$order_data['shipping_address_2'] = $address['address_2'];
    310 		$order_data['shipping_city'] = $address['city'];
    311 		$order_data['shipping_postcode'] = $address['postcode'];
    312 		$order_data['shipping_zone'] = $address['zone'];
    313 		$order_data['shipping_zone_id'] = $address['zone_id'];
    314 		$order_data['shipping_country'] = $address['country'];
    315 		$order_data['shipping_country_id'] = $address['country_id'];
    316 		$order_data['shipping_address_format'] = $address['address_format'];
    317 		$order_data['shipping_method'] = $this->session->data['lpa']['shipping_method']['title'];
    318 
    319 		if (isset($this->session->data['lpa']['shipping_method']['code'])) {
    320 			$order_data['shipping_code'] = $this->session->data['lpa']['shipping_method']['code'];
    321 		} else {
    322 			$order_data['shipping_code'] = '';
    323 		}
    324 
    325 		$product_data = array();
    326 
    327 		foreach ($this->cart->getProducts() as $product) {
    328 			$option_data = array();
    329 
    330 			foreach ($product['option'] as $option) {
    331 				if ($option['type'] != 'file') {
    332 					$value = $option['value'];
    333 				} else {
    334 					$value = $this->encryption->decrypt($option['value']);
    335 				}
    336 
    337 				$option_data[] = array(
    338 					'product_option_id' => $option['product_option_id'],
    339 					'product_option_value_id' => $option['product_option_value_id'],
    340 					'option_id' => $option['option_id'],
    341 					'option_value_id' => $option['option_value_id'],
    342 					'name' => $option['name'],
    343 					'value' => $value,
    344 					'type' => $option['type']
    345 				);
    346 			}
    347 
    348 			$product_data[] = array(
    349 				'product_id' => $product['product_id'],
    350 				'name' => $product['name'],
    351 				'model' => $product['model'],
    352 				'option' => $option_data,
    353 				'download' => $product['download'],
    354 				'quantity' => $product['quantity'],
    355 				'subtract' => $product['subtract'],
    356 				'price' => $product['price'],
    357 				'total' => $product['total'],
    358 				'tax' => $this->tax->getTax($product['price'], $product['tax_class_id']),
    359 				'reward' => $product['reward']
    360 			);
    361 		}
    362 
    363 		$order_data['products'] = $product_data;
    364 		$order_data['vouchers'] = array();
    365 		$order_data['totals'] = $total_data['totals'];
    366 
    367 		$order_data['comment'] = '';
    368 		$order_data['total'] = $total;
    369 
    370 		if (isset($this->request->cookie['tracking'])) {
    371 			$order_data['tracking'] = $this->request->cookie['tracking'];
    372 
    373 			$subtotal = $this->cart->getSubTotal();
    374 
    375 			$this->load->model('affiliate/affiliate');
    376 
    377 			$affiliate_info = $this->model_affiliate_affiliate->getAffiliateByCode($this->request->cookie['tracking']);
    378 
    379 			if ($affiliate_info) {
    380 				$order_data['affiliate_id'] = $affiliate_info['affiliate_id'];
    381 				$order_data['commission'] = ($subtotal / 100) * $affiliate_info['commission'];
    382 			} else {
    383 				$order_data['affiliate_id'] = 0;
    384 				$order_data['commission'] = 0;
    385 			}
    386 
    387 			$this->load->model('checkout/marketing');
    388 
    389 			$marketing_info = $this->model_checkout_marketing->getMarketingByCode($this->request->cookie['tracking']);
    390 
    391 			if ($marketing_info) {
    392 				$order_data['marketing_id'] = $marketing_info['marketing_id'];
    393 			} else {
    394 				$order_data['marketing_id'] = 0;
    395 			}
    396 		} else {
    397 			$order_data['affiliate_id'] = 0;
    398 			$order_data['commission'] = 0;
    399 			$order_data['marketing_id'] = 0;
    400 			$order_data['tracking'] = '';
    401 		}
    402 
    403 		$order_data['language_id'] = $this->config->get('config_language_id');
    404 		$order_data['currency_id'] = $this->currency->getId($this->session->data['currency']);
    405 		$order_data['currency_code'] = $this->session->data['currency'];
    406 		$order_data['currency'] = $this->session->data['currency'];
    407 		$order_data['currency_value'] = $this->currency->getValue($this->session->data['currency']);
    408 		$order_data['value'] = $this->currency->getValue($this->session->data['currency']);
    409 		$order_data['ip'] = $this->request->server['REMOTE_ADDR'];
    410 
    411 		if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) {
    412 			$order_data['forwarded_ip'] = $this->request->server['HTTP_X_FORWARDED_FOR'];
    413 		} elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) {
    414 			$order_data['forwarded_ip'] = $this->request->server['HTTP_CLIENT_IP'];
    415 		} else {
    416 			$order_data['forwarded_ip'] = '';
    417 		}
    418 
    419 		if (isset($this->request->server['HTTP_USER_AGENT'])) {
    420 			$order_data['user_agent'] = $this->request->server['HTTP_USER_AGENT'];
    421 		} else {
    422 			$order_data['user_agent'] = '';
    423 		}
    424 
    425 		if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) {
    426 			$order_data['accept_language'] = $this->request->server['HTTP_ACCEPT_LANGUAGE'];
    427 		} else {
    428 			$order_data['accept_language'] = '';
    429 		}
    430 
    431 		$this->load->model('checkout/order');
    432 
    433 		$this->session->data['order_id'] = $this->model_checkout_order->addOrder($order_data);
    434 
    435 		$this->model_extension_payment_amazon_login_pay->addTaxesForTotals($this->session->data['order_id'], $total_data['totals']);
    436 
    437 		$this->session->data['lpa']['amazon_login_pay_order_id'] = $this->model_extension_payment_amazon_login_pay->setOrderShipping($this->session->data['order_id'], $order_data['lpa_free_shipping']);
    438 
    439 		$data['merchant_id'] = $this->config->get('payment_amazon_login_pay_merchant_id');
    440 		$data['process_order'] = $this->url->link('extension/payment/amazon_login_pay/processorder', '', true);
    441 
    442 		foreach ($this->cart->getProducts() as $product) {
    443 			$option_data = array();
    444 
    445 			foreach ($product['option'] as $option) {
    446 				if ($option['type'] != 'file') {
    447 					$value = $option['value'];
    448 				} else {
    449 					$filename = $this->encryption->decrypt($option['value']);
    450 
    451 					$value = utf8_substr($filename, 0, utf8_strrpos($filename, '.'));
    452 				}
    453 
    454 				$option_data[] = array(
    455 					'name' => $option['name'],
    456 					'value' => ((utf8_strlen($value) > 20) ? utf8_substr($value, 0, 20) . '..' : $value)
    457 				);
    458 			}
    459 
    460 			$data['products'][] = array(
    461 				'product_id' => $product['product_id'],
    462 				'name' => $product['name'],
    463 				'model' => $product['model'],
    464 				'option' => $option_data,
    465 				'quantity' => $product['quantity'],
    466 				'price' => $this->currency->format($this->tax->calculate($product['price'], $product['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']),
    467 				'total' => $this->currency->format($this->tax->calculate($product['price'], $product['tax_class_id'], $this->config->get('config_tax')) * $product['quantity'], $this->session->data['currency'])
    468 			);
    469 		}
    470 
    471 		$data['vouchers'] = array();
    472 
    473 		$data['totals'] = array();
    474 
    475 		foreach ($totals as $total) {
    476 			$data['totals'][] = array(
    477 				'title' => $total['title'],
    478 				'text' => $this->currency->format($total['value'], $this->session->data['currency'])
    479 			);
    480 		}
    481 
    482 		$data['back'] = $this->url->link('extension/payment/amazon_login_pay/paymentMethod', '', true);
    483 		$data['text_back'] = $this->language->get('text_back');
    484 
    485 		$data['column_left'] = $this->load->controller('common/column_left');
    486 		$data['column_right'] = $this->load->controller('common/column_right');
    487 		$data['content_top'] = $this->load->controller('common/content_top');
    488 		$data['content_bottom'] = $this->load->controller('common/content_bottom');
    489 		$data['footer'] = $this->load->controller('common/footer');
    490 		$data['header'] = $this->load->controller('common/header');
    491 
    492 		$this->response->setOutput($this->load->view('extension/payment/amazon_login_pay_confirm', $data));
    493 	}
    494 
    495 	public function processOrder() {
    496 		$this->load->language('extension/payment/amazon_login_pay');
    497 		$this->load->model('checkout/order');
    498 		$this->load->model('extension/total/coupon');
    499 		$this->load->model('account/order');
    500 		$this->load->model('extension/payment/amazon_login_pay');
    501 
    502 		if (!isset($this->session->data['order_id'])) {
    503 			$this->response->redirect($this->url->link('common/home'));
    504 		}
    505 
    506 		if (isset($this->session->data['coupon'])) {
    507 			$coupon = $this->model_extension_total_coupon->getCoupon($this->session->data['coupon']);
    508 		} else {
    509 			$coupon = array();
    510 		}
    511 
    512 		$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
    513 
    514 		$currency_code = $this->config->get('payment_amazon_login_pay_payment_region');
    515 
    516 		$ordered_products = $this->model_account_order->getOrderProducts($order_info['order_id']);
    517 
    518 		$total = 0;
    519 
    520 		$free_shipping = $this->model_extension_payment_amazon_login_pay->hasFreeShipping($order_info['order_id']);
    521 		$shipping_cost = $this->model_extension_payment_amazon_login_pay->getShippingPrice($order_info['order_id']);
    522 
    523 		if (!$free_shipping) {
    524 			$total += $shipping_cost;
    525 		}
    526 
    527 		foreach ($ordered_products as $product) {
    528 			$total += ($product['price'] + $product['tax']) * $product['quantity'];
    529 		}
    530 
    531 		$order_totals = $this->model_extension_payment_amazon_login_pay->getAdditionalCharges($order_info['order_id']);
    532 
    533 		foreach ($order_totals as $order_total) {
    534 			$total += $order_total['price'];
    535 		}
    536 		if (!isset($this->session->data['lpa']['AmazonOrderReferenceId'])) {
    537 			$this->failure($this->language->get('error_process_order'));
    538 		}
    539 
    540 		$total = $this->currency->format($total, $currency_code, false, false);
    541 
    542 		$response = $this->model_extension_payment_amazon_login_pay->sendOrder($order_info['order_id'], $total, $currency_code);
    543 		$this->model_extension_payment_amazon_login_pay->logger($response);
    544 
    545 		if (isset($response['redirect'])) {
    546 			$this->$response['redirect']($this->language->get('error_process_order'));
    547 			$this->session->data['lpa']['error'] = $this->language->get('error_process_order');
    548 			$this->response->redirect($this->url->link('extension/payment/amazon_login_pay/' . $response['redirect'], '', true));
    549 		}
    550 
    551 		if ($response['status'] == 'Closed' || $response['status'] == 'Open') {
    552 			$this->model_extension_payment_amazon_login_pay->addAmazonOrderId($order_info['order_id'], $response['amazon_authorization_id'], $response['capture_status'], $total, $currency_code);
    553 
    554 			$this->model_extension_payment_amazon_login_pay->addTransaction($this->session->data['lpa']['amazon_login_pay_order_id'], $response['amazon_authorization_id'], null, 'authorization', $response['status'], $total);
    555 
    556 			if (isset($response['amazon_capture_id'])) {
    557 				$this->model_extension_payment_amazon_login_pay->closeOrderRef($this->session->data['lpa']['AmazonOrderReferenceId']);
    558 				$this->model_extension_payment_amazon_login_pay->addTransaction($this->session->data['lpa']['amazon_login_pay_order_id'], $response['amazon_authorization_id'], $response['amazon_capture_id'], 'capture', $response['status'], $total);
    559 			}
    560 
    561 			if (isset($response['billing_address'])) {
    562 				$this->setBillingAddress($order_info, $response['billing_address']);
    563 			}
    564 
    565 			$this->model_checkout_order->addOrderHistory($order_info['order_id'], $this->config->get('payment_amazon_login_pay_pending_status'));
    566 			unset($this->session->data['lpa']);
    567 
    568 			$this->response->redirect($this->url->link('extension/payment/amazon_login_pay/success', '', true));
    569 		} else {
    570 			$this->failure($this->language->get('error_process_order'));
    571 		}
    572 	}
    573 
    574 	public function success() {
    575 		unset($this->session->data['lpa']);
    576 		$this->response->redirect($this->url->link('checkout/success', '', true));
    577 	}
    578 
    579 	public function failure($error) {
    580 		unset($this->session->data['lpa']);
    581 		$this->session->data['error'] = $error;
    582 		$this->response->redirect($this->url->link('checkout/cart', '', true));
    583 	}
    584 
    585 	public function loginFailure() {
    586 		$this->load->language('extension/payment/amazon_login_pay');
    587 		$this->document->setTitle($this->language->get('heading_title'));
    588 		$data['heading_title'] = $this->language->get('heading_title');
    589 
    590 		if (isset($this->session->data['lpa']['error'])) {
    591 			$data['error'] = $this->session->data['lpa']['error'];
    592 		} else {
    593 			$data['error'] = '';
    594 		}
    595 
    596 		unset($this->session->data['lpa']);
    597 
    598 		$data['column_left'] = $this->load->controller('common/column_left');
    599 		$data['column_right'] = $this->load->controller('common/column_right');
    600 		$data['content_top'] = $this->load->controller('common/content_top');
    601 		$data['content_bottom'] = $this->load->controller('common/content_bottom');
    602 		$data['footer'] = $this->load->controller('common/footer');
    603 		$data['header'] = $this->load->controller('common/header');
    604 
    605 		$this->response->setOutput($this->load->view('extension/payment/amazon_login_pay_failure', $data));
    606 	}
    607 
    608 	public function shippingQuotes() {
    609 		$this->load->language('extension/payment/amazon_login_pay');
    610 
    611 		$this->load->model('setting/extension');
    612 		$this->load->model('extension/payment/amazon_login_pay');
    613 
    614 		$json = array();
    615 
    616 		if (isset($this->request->get['AmazonOrderReferenceId'])) {
    617 			$this->session->data['lpa']['AmazonOrderReferenceId'] = $this->request->get['AmazonOrderReferenceId'];
    618 		} else {
    619 			$json['error'] = $this->language->get('error_shipping_methods');
    620 			$this->response->addHeader('Content-Type: application/json');
    621 			$this->response->setOutput(json_encode($json));
    622 		}
    623 
    624 		$address_xml = $this->model_extension_payment_amazon_login_pay->getAddress();
    625 
    626 		if (isset($address_xml)) {
    627 
    628 			$result = $this->model_extension_payment_amazon_login_pay->getCountry((string)$address_xml->CountryCode);
    629 
    630 			if (!empty($result)) {
    631 				$iso_code2 = $result['iso_code_2'];
    632 				$iso_code3 = $result['iso_code_3'];
    633 				$address_format = $result['address_format'];
    634 				$country_name = $result['name'];
    635 				$country_id = (int)$result['country_id'];
    636 
    637 				$zone = (string)$address_xml->StateOrRegion;
    638 
    639 				$result = $this->model_extension_payment_amazon_login_pay->getZone($zone, $country_id);
    640 
    641 				if (isset($result['zone_id'])) {
    642 					$zone_id = $result['zone_id'];
    643 					$zone_code = $result['code'];
    644 				} else {
    645 					$zone_id = 0;
    646 					$zone_code = '';
    647 				}
    648 			} else {
    649 				$iso_code2 = '';
    650 				$iso_code3 = '';
    651 				$address_format = '';
    652 				$country_name = '';
    653 				$country_id = 0;
    654 				$zone_id = 0;
    655 				$zone_code = '';
    656 				$zone = '';
    657 			}
    658 
    659 			$this->tax->setShippingAddress($country_id, $zone_id);
    660 
    661 			$AddressLine1 = (string)$address_xml->AddressLine1;
    662 			$AddressLine2 = (string)$address_xml->AddressLine2;
    663 			$AddressLine3 = (string)$address_xml->AddressLine3;
    664 
    665 			if ($AddressLine3 != '') {
    666 				$address_1 = $AddressLine3;
    667 				$address_2 = $AddressLine1 + $AddressLine2;
    668 			} elseif ($AddressLine2 != '') {
    669 				$address_1 = $AddressLine2;
    670 				$address_2 = $AddressLine1;
    671 			} elseif ($AddressLine1 != '') {
    672 				$address_1 = $AddressLine1;
    673 				$address_2 = '';
    674 			}
    675 
    676 			$full_name = explode(' ', (string)$address_xml->Name);
    677 			$last_name = array_pop($full_name);
    678 			$first_name = implode(' ', $full_name);
    679 
    680 			$address = array(
    681 				'firstname' => $first_name,
    682 				'lastname' => $last_name,
    683 				'company' => '',
    684 				'company_id' => '',
    685 				'tax_id' => '',
    686 				'telephone' => (string)$address_xml->Phone,
    687 				'address_1' => $address_1,
    688 				'address_2' => $address_2,
    689 				'postcode' => (string)$address_xml->PostalCode,
    690 				'city' => (string)$address_xml->City,
    691 				'zone_id' => $zone_id,
    692 				'zone' => (string)$address_xml->StateOrRegion,
    693 				'zone_code' => $zone_code,
    694 				'country_id' => $country_id,
    695 				'country' => $country_name,
    696 				'iso_code_2' => $iso_code2,
    697 				'iso_code_3' => $iso_code3,
    698 				'address_format' => $address_format
    699 			);
    700 
    701 			$quotes = array();
    702 
    703 			$results = $this->model_setting_extension->getExtensions('shipping');
    704 
    705 			foreach ($results as $result) {
    706 
    707 				if (isset($result['code'])) {
    708 					$code = $result['code'];
    709 				} else {
    710 					$code = $result['key'];
    711 				}
    712 
    713 				if ($this->config->get('shipping_' . $code . '_status')) {
    714 					$this->load->model('extension/shipping/' . $code);
    715 
    716 					$quote = $this->{'model_extension_shipping_' . $code}->getQuote($address);
    717 
    718 					if ($quote && empty($quote['error'])) {
    719 						$quotes[$code] = array(
    720 							'title' => $quote['title'],
    721 							'quote' => $quote['quote'],
    722 							'sort_order' => $quote['sort_order'],
    723 							'error' => $quote['error']
    724 						);
    725 					}
    726 				}
    727 			}
    728 
    729 			$sort_order = array();
    730 
    731 			foreach ($quotes as $key => $value) {
    732 				$sort_order[$key] = $value['sort_order'];
    733 			}
    734 
    735 			array_multisort($sort_order, SORT_ASC, $quotes);
    736 
    737 			$this->session->data['lpa']['shipping_methods'] = $quotes;
    738 			$this->session->data['lpa']['address'] = $address;
    739 
    740 			if (empty($quotes)) {
    741 				$json['error'] = $this->language->get('error_no_shipping_methods');
    742 			} else {
    743 				$json['quotes'] = $quotes;
    744 			}
    745 
    746 			if (isset($this->session->data['lpa']['shipping_method']) && !empty($this->session->data['lpa']['shipping_method']) && isset($this->session->data['lpa']['shipping_method']['code'])) {
    747 				$json['selected'] = $this->session->data['lpa']['shipping_method']['code'];
    748 			} else {
    749 				$json['selected'] = '';
    750 			}
    751 		} else {
    752 			$json['error'] = $this->language->get('error_shipping_methods');
    753 		}
    754 
    755 		$this->response->addHeader('Content-Type: application/json');
    756 		$this->response->setOutput(json_encode($json));
    757 	}
    758 
    759 	public function setShipping() {
    760 		$json = array();
    761 
    762 		if (isset($this->request->post['shipping_method'])) {
    763 			$shipping_method = explode('.', $this->request->post['shipping_method']);
    764 
    765 			if (!isset($shipping_method[0]) || !isset($shipping_method[1]) || !isset($this->session->data['lpa']['shipping_methods'][$shipping_method[0]]['quote'][$shipping_method[1]])) {
    766 				$this->response->redirect($this->url->link('common/home'));
    767 			}
    768 
    769 			$this->session->data['lpa']['shipping_method'] = $this->session->data['lpa']['shipping_methods'][$shipping_method[0]]['quote'][$shipping_method[1]];
    770 			$this->session->data['shipping_method'] = $this->session->data['lpa']['shipping_method'];
    771 			$this->session->data['payment_address'] = $this->session->data['lpa']['address'];
    772 			$this->session->data['shipping_address'] = $this->session->data['lpa']['address'];
    773 			$this->session->data['shipping_country_id'] = $this->session->data['lpa']['address']['country_id'];
    774 			$this->session->data['shipping_zone_id'] = $this->session->data['lpa']['address']['zone_id'];
    775 
    776 			$json['redirect'] = $this->url->link('extension/payment/amazon_login_pay/paymentMethod', '', true);
    777 		} else {
    778 			$json['redirect'] = $this->url->link('extension/payment/amazon_login_pay/paymentMethod', '', true);
    779 		}
    780 
    781 		$this->response->addHeader('Content-Type: application/json');
    782 		$this->response->setOutput(json_encode($json));
    783 	}
    784 
    785 	public function setBillingAddress($order_info, $billing_address) {
    786 		$this->load->model('extension/payment/amazon_login_pay');
    787 
    788 		$full_name = explode(' ', $billing_address->Name);
    789 		$last_name = array_pop($full_name);
    790 		$first_name = implode(' ', $full_name);
    791 
    792 		$AddressLine1 = (string)$billing_address->AddressLine1;
    793 		$AddressLine2 = (string)$billing_address->AddressLine2;
    794 		$AddressLine3 = (string)$billing_address->AddressLine3;
    795 
    796 		if ($AddressLine3 != '') {
    797 			$address_1 = $AddressLine3;
    798 			$address_2 = $AddressLine1 + $AddressLine2;
    799 		} elseif ($AddressLine2 != '') {
    800 			$address_1 = $AddressLine2;
    801 			$address_2 = $AddressLine1;
    802 		} elseif ($AddressLine1 != '') {
    803 			$address_1 = $AddressLine1;
    804 			$address_2 = '';
    805 		}
    806 
    807 		$result = $this->model_extension_payment_amazon_login_pay->getCountry((string)$billing_address->CountryCode);
    808 
    809 		if (!empty($result)) {
    810 			$iso_code2 = $result['iso_code_2'];
    811 			$iso_code3 = $result['iso_code_3'];
    812 			$address_format = $result['address_format'];
    813 			$country_name = $result['name'];
    814 			$country_id = (int)$result['country_id'];
    815 		}
    816 
    817 		$order_info['payment_firstname'] = $first_name;
    818 		$order_info['payment_lastname'] = $last_name;
    819 		$order_info['payment_address_1'] = $address_1;
    820 		$order_info['payment_address_2'] = $address_2;
    821 		$order_info['payment_city'] = $billing_address->City;
    822 		$order_info['payment_country'] = $country_name;
    823 		$order_info['payment_country_id'] = $country_id;
    824 		$order_info['payment_postcode'] = $billing_address->PostalCode;
    825 		$order_info['address_format'] = $address_format;
    826 		$order_info['iso_code_2'] = $iso_code2;
    827 		$order_info['iso_code_3'] = $iso_code3;
    828 
    829 		$this->model_extension_payment_amazon_login_pay->editOrder($order_info['order_id'], $order_info);
    830 	}
    831 
    832 	public function ipn() {
    833 		$this->load->model('extension/payment/amazon_login_pay');
    834 		$this->model_extension_payment_amazon_login_pay->logger('IPN received');
    835 		if (isset($this->request->get['token']) && hash_equals(trim($this->config->get('payment_amazon_login_pay_ipn_token')), trim($this->request->get['token']))) {
    836 			$body = file_get_contents('php://input');
    837 			if ($body) {
    838 				$ipn_details_xml = $this->model_extension_payment_amazon_login_pay->parseRawMessage($body);
    839 				switch ($ipn_details_xml->getName()) {
    840 					case 'AuthorizationNotification':
    841 						$this->model_extension_payment_amazon_login_pay->authorizationIpn($ipn_details_xml);
    842 						break;
    843 					case 'CaptureNotification':
    844 						$this->model_extension_payment_amazon_login_pay->captureIpn($ipn_details_xml);
    845 						break;
    846 					case 'RefundNotification':
    847 						$this->model_extension_payment_amazon_login_pay->refundIpn($ipn_details_xml);
    848 						break;
    849 				}
    850 			}
    851 		} else {
    852 			$this->model_extension_payment_amazon_login_pay->logger('Incorrect security token');
    853 
    854 			if (!isset($this->request->get['token'])) {
    855 				$this->model_extension_payment_amazon_login_pay->logger('GET variable "token" is missing');
    856 			}
    857 			if (empty($this->request->get['token'])) {
    858 				$this->model_extension_payment_amazon_login_pay->logger('GET variable "token" set, but is empty');
    859 			}
    860 			if (empty($this->config->get('payment_amazon_login_pay_ipn_token'))) {
    861 				$this->model_extension_payment_amazon_login_pay->logger('CONFIG variable "payment_amazon_login_pay_ipn_token" is empty');
    862 			}
    863 		}
    864 
    865 		$this->response->addHeader('HTTP/1.1 200 OK');
    866 		$this->response->addHeader('Content-Type: application/json');
    867 	}
    868 
    869 	public function capture($route, $output, $order_id, $order_status_id) {
    870 		$this->load->model('extension/payment/amazon_login_pay');
    871 		$this->load->model('checkout/order');
    872 
    873 		$order_info = $this->model_checkout_order->getOrder($order_id);
    874 		if ($order_info['order_status_id'] == $this->config->get('payment_amazon_login_pay_capture_status')) {
    875 			$amazon_login_pay_order = $this->model_extension_payment_amazon_login_pay->getOrder($order_id);
    876 
    877 			$capture_response = $this->model_extension_payment_amazon_login_pay->capture($amazon_login_pay_order);
    878 
    879 			if (isset($capture_response['status']) && ($capture_response['status'] == 'Completed' || $capture_response['status'] == 'Pending')) {
    880 				$this->model_extension_payment_amazon_login_pay->closeOrderRef($amazon_login_pay_order['amazon_order_reference_id']);
    881 				$this->model_extension_payment_amazon_login_pay->addTransaction($amazon_login_pay_order['amazon_login_pay_order_id'], $amazon_login_pay_order['amazon_authorization_id'], $capture_response['amazon_capture_id'], 'capture', $capture_response['status'], $amazon_login_pay_order['total']);
    882 				$this->model_extension_payment_amazon_login_pay->updateCaptureStatus($amazon_login_pay_order['amazon_login_pay_order_id'], 1);
    883 			}
    884 		}
    885 	}
    886 
    887 }