shop.balmet.com

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

sagepay_direct.php (19656B)


      1 <?php
      2 class ControllerExtensionPaymentSagepayDirect extends Controller {
      3 	public function index() {
      4 		$this->load->language('extension/payment/sagepay_direct');
      5 
      6 		if (isset($this->session->data['success'])) {
      7 			$data['success'] = $this->session->data['success'];
      8 			unset($this->session->data['success']);
      9 		} else {
     10 			$data['success'] = '';
     11 		}
     12 
     13 		$data['cards'] = array();
     14 
     15 		$data['cards'][] = array(
     16 			'text' => 'Visa',
     17 			'value' => 'VISA'
     18 		);
     19 
     20 		$data['cards'][] = array(
     21 			'text' => 'MasterCard',
     22 			'value' => 'MC'
     23 		);
     24 
     25 		$data['cards'][] = array(
     26 			'text' => 'Visa Delta/Debit',
     27 			'value' => 'DELTA'
     28 		);
     29 
     30 		$data['cards'][] = array(
     31 			'text' => 'Solo',
     32 			'value' => 'SOLO'
     33 		);
     34 
     35 		$data['cards'][] = array(
     36 			'text' => 'Maestro',
     37 			'value' => 'MAESTRO'
     38 		);
     39 
     40 		$data['cards'][] = array(
     41 			'text' => 'Visa Electron UK Debit',
     42 			'value' => 'UKE'
     43 		);
     44 
     45 		$data['cards'][] = array(
     46 			'text' => 'American Express',
     47 			'value' => 'AMEX'
     48 		);
     49 
     50 		$data['cards'][] = array(
     51 			'text' => 'Diners Club',
     52 			'value' => 'DC'
     53 		);
     54 
     55 		$data['cards'][] = array(
     56 			'text' => 'Japan Credit Bureau',
     57 			'value' => 'JCB'
     58 		);
     59 
     60 		$data['months'] = array();
     61 
     62 		for ($i = 1; $i <= 12; $i++) {
     63 			$data['months'][] = array(
     64 				'text' => strftime('%B', mktime(0, 0, 0, $i, 1, 2000)),
     65 				'value' => sprintf('%02d', $i)
     66 			);
     67 		}
     68 
     69 		$today = getdate();
     70 
     71 		$data['year_valid'] = array();
     72 
     73 		for ($i = $today['year'] - 10; $i < $today['year'] + 1; $i++) {
     74 			$data['year_valid'][] = array(
     75 				'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)),
     76 				'value' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i))
     77 			);
     78 		}
     79 
     80 		$data['year_expire'] = array();
     81 
     82 		for ($i = $today['year']; $i < $today['year'] + 11; $i++) {
     83 			$data['year_expire'][] = array(
     84 				'text' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)),
     85 				'value' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i))
     86 			);
     87 		}
     88 
     89 		if ($this->config->get('payment_sagepay_direct_card') == '1') {
     90 			$data['sagepay_direct_card'] = true;
     91 		} else {
     92 			$data['sagepay_direct_card'] = false;
     93 		}
     94 
     95 		$data['existing_cards'] = array();
     96 		if ($this->customer->isLogged() && $data['sagepay_direct_card']) {
     97 			$this->load->model('extension/payment/sagepay_direct');
     98 			$data['existing_cards'] = $this->model_extension_payment_sagepay_direct->getCards($this->customer->getId());
     99 		}
    100 
    101 		return $this->load->view('extension/payment/sagepay_direct', $data);
    102 	}
    103 
    104 	public function send() {
    105 		$this->load->language('extension/payment/sagepay_direct');
    106 		$this->load->model('checkout/order');
    107 		$this->load->model('extension/payment/sagepay_direct');
    108 		$this->load->model('account/order');
    109 
    110 		$payment_data = array();
    111 
    112 		if ($this->config->get('payment_sagepay_direct_test') == 'live') {
    113 			$url = 'https://live.sagepay.com/gateway/service/vspdirect-register.vsp';
    114 			$payment_data['VPSProtocol'] = '3.00';
    115 		} elseif ($this->config->get('payment_sagepay_direct_test') == 'test') {
    116 			$url = 'https://test.sagepay.com/gateway/service/vspdirect-register.vsp';
    117 			$payment_data['VPSProtocol'] = '3.00';
    118 		} elseif ($this->config->get('payment_sagepay_direct_test') == 'sim') {
    119 			$url = 'https://test.sagepay.com/Simulator/VSPDirectGateway.asp';
    120 			$payment_data['VPSProtocol'] = '2.23';
    121 		}
    122 
    123 		$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
    124 
    125 		$payment_data['ReferrerID'] = 'E511AF91-E4A0-42DE-80B0-09C981A3FB61';
    126 		$payment_data['Vendor'] = $this->config->get('payment_sagepay_direct_vendor');
    127 		$payment_data['VendorTxCode'] = $this->session->data['order_id'] . 'SD' . strftime("%Y%m%d%H%M%S") . mt_rand(1, 999);
    128 		$payment_data['Amount'] = $this->currency->format($order_info['total'], $order_info['currency_code'], false, false);
    129 		$payment_data['Currency'] = $this->session->data['currency'];
    130 		$payment_data['Description'] = substr($this->config->get('config_name'), 0, 100);
    131 		$payment_data['TxType'] = $this->config->get('payment_sagepay_direct_transaction');
    132 
    133 		$payment_data['CV2'] = $this->request->post['cc_cvv2'];
    134 
    135 		if (isset($this->request->post['Token'])) {
    136 			$payment_data['Token'] = $this->request->post['Token'];
    137 			$payment_data['StoreToken'] = 1;
    138 		} else {
    139 			$payment_data['CardHolder'] = $this->request->post['cc_owner'];
    140 			$payment_data['CardNumber'] = $this->request->post['cc_number'];
    141 			$payment_data['ExpiryDate'] = $this->request->post['cc_expire_date_month'] . substr($this->request->post['cc_expire_date_year'], 2);
    142 			$payment_data['CardType'] = $this->request->post['cc_type'];
    143 		}
    144 
    145 		if (isset($this->request->post['CreateToken'])) {
    146 			$payment_data['CreateToken'] = $this->request->post['CreateToken'];
    147 			$payment_data['StoreToken'] = 1;
    148 		}
    149 
    150 		$payment_data['BillingSurname'] = substr($order_info['payment_lastname'], 0, 20);
    151 		$payment_data['BillingFirstnames'] = substr($order_info['payment_firstname'], 0, 20);
    152 		$payment_data['BillingAddress1'] = substr($order_info['payment_address_1'], 0, 100);
    153 
    154 		if ($order_info['payment_address_2']) {
    155 			$payment_data['BillingAddress2'] = $order_info['payment_address_2'];
    156 		}
    157 
    158 		$payment_data['BillingCity'] = substr($order_info['payment_city'], 0, 40);
    159 		$payment_data['BillingPostCode'] = substr($order_info['payment_postcode'], 0, 10);
    160 		$payment_data['BillingCountry'] = $order_info['payment_iso_code_2'];
    161 
    162 		if ($order_info['payment_iso_code_2'] == 'US') {
    163 			$payment_data['BillingState'] = $order_info['payment_zone_code'];
    164 		}
    165 
    166 		$payment_data['BillingPhone'] = substr($order_info['telephone'], 0, 20);
    167 
    168 		if ($this->cart->hasShipping()) {
    169 			$payment_data['DeliverySurname'] = substr($order_info['shipping_lastname'], 0, 20);
    170 			$payment_data['DeliveryFirstnames'] = substr($order_info['shipping_firstname'], 0, 20);
    171 			$payment_data['DeliveryAddress1'] = substr($order_info['shipping_address_1'], 0, 100);
    172 
    173 			if ($order_info['shipping_address_2']) {
    174 				$payment_data['DeliveryAddress2'] = $order_info['shipping_address_2'];
    175 			}
    176 
    177 			$payment_data['DeliveryCity'] = substr($order_info['shipping_city'], 0, 40);
    178 			$payment_data['DeliveryPostCode'] = substr($order_info['shipping_postcode'], 0, 10);
    179 			$payment_data['DeliveryCountry'] = $order_info['shipping_iso_code_2'];
    180 
    181 			if ($order_info['shipping_iso_code_2'] == 'US') {
    182 				$payment_data['DeliveryState'] = $order_info['shipping_zone_code'];
    183 			}
    184 
    185 			$payment_data['CustomerName'] = substr($order_info['firstname'] . ' ' . $order_info['lastname'], 0, 100);
    186 			$payment_data['DeliveryPhone'] = substr($order_info['telephone'], 0, 20);
    187 		} else {
    188 			$payment_data['DeliveryFirstnames'] = $order_info['payment_firstname'];
    189 			$payment_data['DeliverySurname'] = $order_info['payment_lastname'];
    190 			$payment_data['DeliveryAddress1'] = $order_info['payment_address_1'];
    191 
    192 			if ($order_info['payment_address_2']) {
    193 				$payment_data['DeliveryAddress2'] = $order_info['payment_address_2'];
    194 			}
    195 
    196 			$payment_data['DeliveryCity'] = $order_info['payment_city'];
    197 			$payment_data['DeliveryPostCode'] = $order_info['payment_postcode'];
    198 			$payment_data['DeliveryCountry'] = $order_info['payment_iso_code_2'];
    199 
    200 			if ($order_info['payment_iso_code_2'] == 'US') {
    201 				$payment_data['DeliveryState'] = $order_info['payment_zone_code'];
    202 			}
    203 
    204 			$payment_data['DeliveryPhone'] = $order_info['telephone'];
    205 		}
    206 
    207 		$order_products = $this->model_account_order->getOrderProducts($this->session->data['order_id']);
    208 		$cart_rows = 0;
    209 		$str_basket = "";
    210 		foreach ($order_products as $product) {
    211 			$str_basket .=
    212 					":" . str_replace(":", " ", $product['name'] . " " . $product['model']) .
    213 					":" . $product['quantity'] .
    214 					":" . $this->currency->format($product['price'], $order_info['currency_code'], false, false) .
    215 					":" . $this->currency->format($product['tax'], $order_info['currency_code'], false, false) .
    216 					":" . $this->currency->format(($product['price'] + $product['tax']), $order_info['currency_code'], false, false) .
    217 					":" . $this->currency->format(($product['price'] + $product['tax']) * $product['quantity'], $order_info['currency_code'], false, false);
    218 			$cart_rows++;
    219 		}
    220 
    221 		$order_totals = $this->model_account_order->getOrderTotals($this->session->data['order_id']);
    222 		foreach ($order_totals as $total) {
    223 			$str_basket .= ":" . str_replace(":", " ", $total['title']) . ":::::" . $this->currency->format($total['value'], $order_info['currency_code'], false, false);
    224 			$cart_rows++;
    225 		}
    226 		$str_basket = $cart_rows . $str_basket;
    227 
    228 		$payment_data['Basket'] = $str_basket;
    229 
    230 		$payment_data['CustomerEMail'] = substr($order_info['email'], 0, 255);
    231 		$payment_data['Apply3DSecure'] = '0';
    232 
    233 		$response_data = $this->model_extension_payment_sagepay_direct->sendCurl($url, $payment_data);
    234 
    235 		$json = array();
    236 
    237 		if ($response_data['Status'] == '3DAUTH') {
    238 			$json['ACSURL'] = $response_data['ACSURL'];
    239 			$json['MD'] = $response_data['MD'];
    240 			$json['PaReq'] = $response_data['PAReq'];
    241 
    242 			$response_data['VPSTxId'] = '';
    243 			$response_data['SecurityKey'] = '';
    244 			$response_data['TxAuthNo'] = '';
    245 
    246 			$card_id = '';
    247 			if (!empty($payment_data['CreateToken']) && $this->customer->isLogged()) {
    248 				$card_data = array();
    249 				$card_data['customer_id'] = $this->customer->getId();
    250 				$card_data['Token'] = '';
    251 				$card_data['Last4Digits'] = substr(str_replace(' ', '', $payment_data['CardNumber']), -4, 4);
    252 				$card_data['ExpiryDate'] = $this->request->post['cc_expire_date_month'] . '/' . substr($this->request->post['cc_expire_date_year'], 2);
    253 				$card_data['CardType'] = $payment_data['CardType'];
    254 				$card_id = $this->model_extension_payment_sagepay_direct->addCard($card_data);
    255 			} elseif (isset($payment_data['Token'])) {
    256 				$card = $this->model_extension_payment_sagepay_direct->getCard(false, $payment_data['Token']);
    257 				$card_id = $card['card_id'];
    258 			}
    259 
    260 			$this->model_extension_payment_sagepay_direct->addOrder($this->session->data['order_id'], $response_data, $payment_data, $card_id);
    261 			$this->model_extension_payment_sagepay_direct->logger('Response data', $response_data);
    262 			$this->model_extension_payment_sagepay_direct->logger('$payment_data', $payment_data);
    263 			$this->model_extension_payment_sagepay_direct->logger('order_id', $this->session->data['order_id']);
    264 
    265 			$json['TermUrl'] = $this->url->link('extension/payment/sagepay_direct/callback', '', true);
    266 		} elseif ($response_data['Status'] == 'OK' || $response_data['Status'] == 'AUTHENTICATED' || $response_data['Status'] == 'REGISTERED') {
    267 			$message = '';
    268 
    269 			if (isset($response_data['TxAuthNo'])) {
    270 				$message .= 'TxAuthNo: ' . $response_data['TxAuthNo'] . "\n";
    271 			} else {
    272 				$response_data['TxAuthNo'] = '';
    273 			}
    274 
    275 			if (isset($response_data['AVSCV2'])) {
    276 				$message .= 'AVSCV2: ' . $response_data['AVSCV2'] . "\n";
    277 			}
    278 
    279 			if (isset($response_data['AddressResult'])) {
    280 				$message .= 'AddressResult: ' . $response_data['AddressResult'] . "\n";
    281 			}
    282 
    283 			if (isset($response_data['PostCodeResult'])) {
    284 				$message .= 'PostCodeResult: ' . $response_data['PostCodeResult'] . "\n";
    285 			}
    286 
    287 			if (isset($response_data['CV2Result'])) {
    288 				$message .= 'CV2Result: ' . $response_data['CV2Result'] . "\n";
    289 			}
    290 
    291 			if (isset($response_data['3DSecureStatus'])) {
    292 				$message .= '3DSecureStatus: ' . $response_data['3DSecureStatus'] . "\n";
    293 			}
    294 
    295 			if (isset($response_data['CAVV'])) {
    296 				$message .= 'CAVV: ' . $response_data['CAVV'] . "\n";
    297 			}
    298 
    299 			$card_id = '';
    300 			if (!empty($payment_data['CreateToken']) && !empty($response_data['Token']) && $this->customer->isLogged()) {
    301 				$card_data = array();
    302 				$card_data['customer_id'] = $this->customer->getId();
    303 				$card_data['Token'] = $response_data['Token'];
    304 				$card_data['Last4Digits'] = substr(str_replace(' ', '', $payment_data['CardNumber']), -4, 4);
    305 				$card_data['ExpiryDate'] = $this->request->post['cc_expire_date_month'] . '/' . substr($this->request->post['cc_expire_date_year'], 2);
    306 				$card_data['CardType'] = $payment_data['CardType'];
    307 				$card_id = $this->model_extension_payment_sagepay_direct->addCard($card_data);
    308 			} elseif (isset($payment_data['Token'])) {
    309 				$card = $this->model_extension_payment_sagepay_direct->getCard(false, $payment_data['Token']);
    310 				$card_id = $card['card_id'];
    311 			}
    312 
    313 			$sagepay_direct_order_id = $this->model_extension_payment_sagepay_direct->addOrder($order_info['order_id'], $response_data, $payment_data, $card_id);
    314 			$this->model_extension_payment_sagepay_direct->logger('Response data', $response_data);
    315 			$this->model_extension_payment_sagepay_direct->logger('$payment_data', $payment_data);
    316 			$this->model_extension_payment_sagepay_direct->logger('order_id', $this->session->data['order_id']);
    317 
    318 			$this->model_extension_payment_sagepay_direct->addTransaction($sagepay_direct_order_id, $this->config->get('payment_sagepay_direct_transaction'), $order_info);
    319 
    320 			$this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $this->config->get('payment_sagepay_direct_order_status_id'), $message, false);
    321 
    322 			if ($this->config->get('payment_sagepay_direct_transaction') == 'PAYMENT') {
    323 				$recurring_products = $this->cart->getRecurringProducts();
    324 				//loop through any products that are recurring items
    325 				foreach ($recurring_products as $item) {
    326 					$this->model_extension_payment_sagepay_direct->recurringPayment($item, $payment_data['VendorTxCode']);
    327 				}
    328 			}
    329 
    330 			$json['redirect'] = $this->url->link('checkout/success', '', true);
    331 		} else {
    332 			$json['error'] = $response_data['Status'] . ': ' . $response_data['StatusDetail'];
    333 			$this->model_extension_payment_sagepay_direct->logger('Response data', $json['error']);
    334 		}
    335 
    336 		$this->response->addHeader('Content-Type: application/json');
    337 		$this->response->setOutput(json_encode($json));
    338 	}
    339 
    340 	public function callback() {
    341 		$this->load->model('extension/payment/sagepay_direct');
    342 		$this->load->language('extension/payment/sagepay_direct');
    343 		$this->load->model('checkout/order');
    344 
    345 		if (isset($this->session->data['order_id'])) {
    346 			if ($this->config->get('payment_sagepay_direct_test') == 'live') {
    347 				$url = 'https://live.sagepay.com/gateway/service/direct3dcallback.vsp';
    348 			} elseif ($this->config->get('payment_sagepay_direct_test') == 'test') {
    349 				$url = 'https://test.sagepay.com/gateway/service/direct3dcallback.vsp';
    350 			} elseif ($this->config->get('payment_sagepay_direct_test') == 'sim') {
    351 				$url = 'https://test.sagepay.com/Simulator/VSPDirectCallback.asp';
    352 			}
    353 
    354 			$response_data = $this->model_extension_payment_sagepay_direct->sendCurl($url, $this->request->post);
    355 			$this->model_extension_payment_sagepay_direct->logger('$response_data', $response_data);
    356 
    357 			if ($response_data['Status'] == 'OK' || $response_data['Status'] == 'AUTHENTICATED' || $response_data['Status'] == 'REGISTERED') {
    358 				$message = '';
    359 
    360 				if (isset($response_data['TxAuthNo'])) {
    361 					$message .= 'TxAuthNo: ' . $response_data['TxAuthNo'] . "\n";
    362 				} else {
    363 					$response_data['TxAuthNo'] = '';
    364 				}
    365 
    366 				if (isset($response_data['AVSCV2'])) {
    367 					$message .= 'AVSCV2: ' . $response_data['AVSCV2'] . "\n";
    368 				}
    369 
    370 				if (isset($response_data['AddressResult'])) {
    371 					$message .= 'AddressResult: ' . $response_data['AddressResult'] . "\n";
    372 				}
    373 
    374 				if (isset($response_data['PostCodeResult'])) {
    375 					$message .= 'PostCodeResult: ' . $response_data['PostCodeResult'] . "\n";
    376 				}
    377 
    378 				if (isset($response_data['CV2Result'])) {
    379 					$message .= 'CV2Result: ' . $response_data['CV2Result'] . "\n";
    380 				}
    381 
    382 				if (isset($response_data['3DSecureStatus'])) {
    383 					$message .= '3DSecureStatus: ' . $response_data['3DSecureStatus'] . "\n";
    384 				}
    385 
    386 				if (isset($response_data['CAVV'])) {
    387 					$message .= 'CAVV: ' . $response_data['CAVV'] . "\n";
    388 				}
    389 
    390 				$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
    391 				$sagepay_order_info = $this->model_extension_payment_sagepay_direct->getOrder($this->session->data['order_id']);
    392 
    393 				$this->model_extension_payment_sagepay_direct->logger('$order_info', $order_info);
    394 				$this->model_extension_payment_sagepay_direct->logger('$sagepay_order_info', $sagepay_order_info);
    395 
    396 				$this->model_extension_payment_sagepay_direct->updateOrder($order_info, $response_data);
    397 				$this->model_extension_payment_sagepay_direct->addTransaction($sagepay_order_info['sagepay_direct_order_id'], $this->config->get('payment_sagepay_direct_transaction'), $order_info);
    398 				$this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $this->config->get('payment_sagepay_direct_order_status_id'), $message, false);
    399 
    400 				if (!empty($response_data['Token']) && $this->customer->isLogged()) {
    401 					$this->model_extension_payment_sagepay_direct->updateCard($sagepay_order_info['card_id'], $response_data['Token']);
    402 				} else {
    403 					$this->model_extension_payment_sagepay_direct->deleteCard($sagepay_order_info['card_id']);
    404 				}
    405 
    406 				if ($this->config->get('payment_sagepay_direct_transaction') == 'PAYMENT') {
    407 					$recurring_products = $this->cart->getRecurringProducts();
    408 					//loop through any products that are recurring items
    409 					foreach ($recurring_products as $item) {
    410 						$this->model_extension_payment_sagepay_direct->recurringPayment($item, $sagepay_order_info['VendorTxCode']);
    411 					}
    412 				}
    413 
    414 				$this->response->redirect($this->url->link('checkout/success', '', true));
    415 			} else {
    416 				$this->session->data['error'] = $response_data['StatusDetail'];
    417 
    418 				$this->response->redirect($this->url->link('checkout/checkout', '', true));
    419 			}
    420 		} else {
    421 			$this->response->redirect($this->url->link('account/login', '', true));
    422 		}
    423 	}
    424 
    425 	public function delete() {
    426 
    427 		$this->load->language('account/sagepay_direct_cards');
    428 
    429 		$this->load->model('extension/payment/sagepay_direct');
    430 
    431 		$card = $this->model_extension_payment_sagepay_direct->getCard(false, $this->request->post['Token']);
    432 
    433 		if (!empty($card['token'])) {
    434 			if ($this->config->get('payment_sagepay_direct_test') == 'live') {
    435 				$url = 'https://live.sagepay.com/gateway/service/removetoken.vsp';
    436 			} else {
    437 				$url = 'https://test.sagepay.com/gateway/service/removetoken.vsp';
    438 			}
    439 			$payment_data['VPSProtocol'] = '3.00';
    440 			$payment_data['Vendor'] = $this->config->get('payment_sagepay_direct_vendor');
    441 			$payment_data['TxType'] = 'REMOVETOKEN';
    442 			$payment_data['Token'] = $card['token'];
    443 
    444 			$response_data = $this->model_extension_payment_sagepay_direct->sendCurl($url, $payment_data);
    445 			if ($response_data['Status'] == 'OK') {
    446 				$this->model_extension_payment_sagepay_direct->deleteCard($card['card_id']);
    447 				$this->session->data['success'] = $this->language->get('text_success_card');
    448 				$json['success'] = true;
    449 			} else {
    450 				$json['error'] = $this->language->get('text_fail_card');
    451 			}
    452 		} else {
    453 			$json['error'] = $this->language->get('text_fail_card');
    454 		}
    455 		$this->response->setOutput(json_encode($json));
    456 	}
    457 
    458 	public function cron() {
    459 		if (isset($this->request->get['token']) && hash_equals($this->config->get('payment_sagepay_direct_cron_job_token'), $this->request->get['token'])) {
    460 			$this->load->model('extension/payment/sagepay_direct');
    461 
    462 			$orders = $this->model_extension_payment_sagepay_direct->cronPayment();
    463 
    464 			$this->model_extension_payment_sagepay_direct->updateCronJobRunTime();
    465 
    466 			$this->model_extension_payment_sagepay_direct->logger('Repeat Orders', $orders);
    467 		}
    468 	}
    469 
    470 }