shop.balmet.com

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

realex_remote.php (13373B)


      1 <?php
      2 class ControllerExtensionPaymentRealexRemote extends Controller {
      3 	public function index() {
      4 		$this->load->language('extension/payment/realex_remote');
      5 
      6 		$data['text_credit_card'] = $this->language->get('text_credit_card');
      7 		$data['text_loading'] = $this->language->get('text_loading');
      8 		$data['text_wait'] = $this->language->get('text_wait');
      9 		$data['entry_cc_type'] = $this->language->get('entry_cc_type');
     10 		$data['entry_cc_number'] = $this->language->get('entry_cc_number');
     11 		$data['entry_cc_name'] = $this->language->get('entry_cc_name');
     12 		$data['entry_cc_expire_date'] = $this->language->get('entry_cc_expire_date');
     13 		$data['entry_cc_cvv2'] = $this->language->get('entry_cc_cvv2');
     14 		$data['entry_cc_issue'] = $this->language->get('entry_cc_issue');
     15 		$data['help_start_date'] = $this->language->get('help_start_date');
     16 		$data['help_issue'] = $this->language->get('help_issue');
     17 		$data['button_confirm'] = $this->language->get('button_confirm');
     18 
     19 		$accounts = $this->config->get('payment_realex_remote_account');
     20 
     21 		$card_types = array(
     22 			'visa' => $this->language->get('text_card_visa'),
     23 			'mc' => $this->language->get('text_card_mc'),
     24 			'amex' => $this->language->get('text_card_amex'),
     25 			'switch' => $this->language->get('text_card_switch'),
     26 			'laser' => $this->language->get('text_card_laser'),
     27 			'diners' => $this->language->get('text_card_diners'),
     28 		);
     29 
     30 		$data['cards'] = array();
     31 
     32 		foreach ($accounts as $card => $account) {
     33 			if (isset($account['enabled']) && $account['enabled'] == 1) {
     34 				$data['cards'][] = array(
     35 					'code' => $card,
     36 					'text' => $card_types[$card],
     37 				);
     38 			}
     39 		}
     40 
     41 		$data['months'] = array();
     42 
     43 		for ($i = 1; $i <= 12; $i++) {
     44 			$data['months'][] = array(
     45 				'text'  => strftime('%B', mktime(0, 0, 0, $i, 1, 2000)),
     46 				'value' => sprintf('%02d', $i)
     47 			);
     48 		}
     49 
     50 		$today = getdate();
     51 
     52 		$data['year_expire'] = array();
     53 
     54 		for ($i = $today['year']; $i < $today['year'] + 11; $i++) {
     55 			$data['year_expire'][] = array(
     56 				'text'  => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)),
     57 				'value' => strftime('%y', mktime(0, 0, 0, 1, 1, $i))
     58 			);
     59 		}
     60 
     61 		return $this->load->view('extension/payment/realex_remote', $data);
     62 	}
     63 
     64 	public function send() {
     65 		$this->load->model('checkout/order');
     66 		$this->load->model('extension/payment/realex_remote');
     67 
     68 		$this->load->language('extension/payment/realex_remote');
     69 
     70 		if ($this->request->post['cc_number'] == '') {
     71 			$json['error'] = $this->language->get('error_card_number');
     72 		}
     73 
     74 		if ($this->request->post['cc_name'] == '') {
     75 			$json['error'] = $this->language->get('error_card_name');
     76 		}
     77 
     78 		if (strlen($this->request->post['cc_cvv2']) != 3 && strlen($this->request->post['cc_cvv2']) != 4) {
     79 			$json['error'] = $this->language->get('error_card_cvv');
     80 		}
     81 
     82 		if (isset($json['error'])) {
     83 			$this->response->addHeader('Content-Type: application/json');
     84 			$this->response->setOutput(json_encode($json));
     85 			$this->response->output();
     86 			die();
     87 		}
     88 
     89 		$order_id = $this->session->data['order_id'];
     90 
     91 		$order_ref = $order_id . 'T' . strftime("%Y%m%d%H%M%S") . mt_rand(1, 999);
     92 
     93 		$order_info = $this->model_checkout_order->getOrder($order_id);
     94 
     95 		$amount = round($this->currency->format($order_info['total'], $order_info['currency_code'], $order_info['currency_value'], false) * 100);
     96 		$currency = $order_info['currency_code'];
     97 
     98 		$accounts = $this->config->get('payment_realex_remote_account');
     99 
    100 		if (isset($accounts[$this->request->post['cc_type']]['default']) && $accounts[$this->request->post['cc_type']]['default'] == 1) {
    101 			$account = $this->config->get('payment_realex_remote_merchant_id');
    102 		} else {
    103 			$account = $accounts[$this->request->post['cc_type']]['merchant_id'];
    104 		}
    105 
    106 		$eci_ref = '';
    107 		$eci = '';
    108 		$cavv = '';
    109 		$xid = '';
    110 
    111 		if ($this->config->get('payment_realex_remote_3d') == 1) {
    112 			if ($this->request->post['cc_type'] == 'visa' || $this->request->post['cc_type'] == 'mc' || $this->request->post['cc_type'] == 'amex') {
    113 				$verify_3ds = $this->model_extension_payment_realex_remote->checkEnrollment($account, $amount, $currency, $order_ref);
    114 
    115 				$this->model_extension_payment_realex_remote->logger('Verify 3DS result:\r\n' . print_r($verify_3ds, 1));
    116 
    117 				// Proceed to 3D secure
    118 				if (isset($verify_3ds->result) && $verify_3ds->result == '00') {
    119 					$enc_data = array(
    120 						'account' => $account,
    121 						'amount' => $amount,
    122 						'currency' => $currency,
    123 						'order_id' => $order_id,
    124 						'order_ref' => $order_ref,
    125 						'cc_number' => $this->request->post['cc_number'],
    126 						'cc_expire' => $this->request->post['cc_expire_date_month'] . $this->request->post['cc_expire_date_year'],
    127 						'cc_name' => $this->request->post['cc_name'],
    128 						'cc_type' => $this->request->post['cc_type'],
    129 						'cc_cvv2' => $this->request->post['cc_cvv2'],
    130 						'cc_issue' => $this->request->post['cc_issue']
    131 					);
    132 
    133 					$md = $this->encryption->encrypt($this->config->get('config_encryption'), json_encode($enc_data));
    134 
    135 					$json = array();
    136 					$json['ACSURL'] = (string)$verify_3ds->url;
    137 					$json['MD'] = $md;
    138 					$json['PaReq'] = (string)$verify_3ds->pareq;
    139 					$json['TermUrl'] = $this->url->link('extension/payment/realex_remote/acsReturn', '', true);
    140 
    141 					$this->response->addHeader('Content-Type: application/json');
    142 					$this->response->setOutput(json_encode($json));
    143 					$this->response->output();
    144 					die();
    145 				}
    146 
    147 				// Cardholder Not Enrolled. Shift in liability. ECI = 6
    148 				if (isset($verify_3ds->result) && $verify_3ds->result == '110' && isset($verify_3ds->enrolled) && $verify_3ds->enrolled == 'N') {
    149 					$eci_ref = 1;
    150 					$xid = '';
    151 					$cavv = '';
    152 					if ($this->request->post['cc_type'] == 'mc') {
    153 						$eci = 1;
    154 					} else {
    155 						$eci = 6;
    156 					}
    157 				}
    158 
    159 				// Unable to Verify Enrollment. No shift in liability. ECI = 7
    160 				if (isset($verify_3ds->result) && $verify_3ds->result == '110' && isset($verify_3ds->enrolled) && $verify_3ds->enrolled == 'U') {
    161 					if ($this->config->get('payment_realex_remote_liability') != 1) {
    162 						$this->load->language('extension/payment/realex_remote');
    163 
    164 						$json['error'] = $this->language->get('error_3d_unable');
    165 
    166 						$this->response->addHeader('Content-Type: application/json');
    167 						$this->response->setOutput(json_encode($json));
    168 						$this->response->output();
    169 						die();
    170 					} else {
    171 						$eci_ref = 2;
    172 						$xid = '';
    173 						$cavv = '';
    174 						if ($this->request->post['cc_type'] == 'mc') {
    175 							$eci = 0;
    176 						} else {
    177 							$eci = 7;
    178 						}
    179 					}
    180 				}
    181 
    182 				// Invalid response from Enrollment Server. No shift in liability. ECI = 7
    183 				if (isset($verify_3ds->result)  && $verify_3ds->result >= 500 && $verify_3ds->result < 600) {
    184 					if ($this->config->get('payment_realex_remote_liability') != 1) {
    185 						$this->load->language('extension/payment/realex_remote');
    186 
    187 						$json['error'] = (string)$verify_3ds->message;
    188 
    189 						$this->response->addHeader('Content-Type: application/json');
    190 						$this->response->setOutput(json_encode($json));
    191 						$this->response->output();
    192 						die();
    193 					} else {
    194 						$eci_ref = 3;
    195 						if ($this->request->post['cc_type'] == 'mc') {
    196 							$eci = 0;
    197 						} else {
    198 							$eci = 7;
    199 						}
    200 					}
    201 				}
    202 			}
    203 		}
    204 
    205 		$capture_result = $this->model_extension_payment_realex_remote->capturePayment(
    206 			$account,
    207 			$amount,
    208 			$currency,
    209 			$order_id,
    210 			$order_ref,
    211 			$this->request->post['cc_number'],
    212 			$this->request->post['cc_expire_date_month'] . $this->request->post['cc_expire_date_year'],
    213 			$this->request->post['cc_name'],
    214 			$this->request->post['cc_type'],
    215 			$this->request->post['cc_cvv2'],
    216 			$this->request->post['cc_issue'],
    217 			$eci_ref,
    218 			$eci,
    219 			$cavv,
    220 			$xid
    221 		);
    222 
    223 		$this->model_extension_payment_realex_remote->logger('Capture result:\r\n' . print_r($capture_result, 1));
    224 
    225 		if ($capture_result->result != '00') {
    226 			$json['error'] = (string)$capture_result->message . ' (' . (int)$capture_result->result . ')';
    227 		} else {
    228 			$json['success'] = $this->url->link('checkout/success');
    229 		}
    230 
    231 		$this->response->addHeader('Content-Type: application/json');
    232 		$this->response->setOutput(json_encode($json));
    233 	}
    234 
    235 	public function acsReturn() {
    236 		if (isset($this->session->data['order_id'])) {
    237 			$this->load->model('checkout/order');
    238 			$this->load->model('extension/payment/realex_remote');
    239 
    240 			$post = $this->request->post;
    241 
    242 			$md = json_decode($this->encryption->decrypt($this->config->get('config_encryption'), $post['MD']), true);
    243 
    244 			$signature_result = $this->model_extension_payment_realex_remote->enrollmentSignature($md['account'], $md['amount'], $md['currency'], $md['order_ref'], $md['cc_number'], $md['cc_expire'], $md['cc_type'], $md['cc_name'], $post['PaRes']);
    245 
    246 			$this->model_extension_payment_realex_remote->logger('Signature result:\r\n' . print_r($signature_result, 1));
    247 
    248 			if ($signature_result->result == '00' && (strtoupper($signature_result->threedsecure->status) == 'Y' || strtoupper($signature_result->threedsecure->status) == 'A')) {
    249 				if (strtoupper($signature_result->threedsecure->status) == 'Y') {
    250 					$eci_ref = 5;
    251 				} else {
    252 					$eci_ref = 6;
    253 				}
    254 
    255 				$eci = (string)$signature_result->threedsecure->eci;
    256 				$cavv = (string)$signature_result->threedsecure->cavv;
    257 				$xid = (string)$signature_result->threedsecure->xid;
    258 			} else {
    259 				if ($md['cc_type'] == 'mc') {
    260 					$eci = 0;
    261 				} else {
    262 					$eci = 7;
    263 				}
    264 
    265 				// Enrolled but invalid response from ACS.  No shift in liability. ECI = 7
    266 				if ($signature_result->result == '110' && strtoupper($signature_result->threedsecure->status) == 'Y') {
    267 					$eci_ref = 4;
    268 					$cavv = (string)$signature_result->threedsecure->cavv;
    269 					$xid = (string)$signature_result->threedsecure->xid;
    270 				}
    271 
    272 				// Incorrect password entered.  No shift in liability. ECI = 7
    273 				if ($signature_result->result == '00' && strtoupper($signature_result->threedsecure->status) == 'N') {
    274 					$eci_ref = 7;
    275 					$xid = (string)$signature_result->threedsecure->xid;
    276 					$cavv = '';
    277 				}
    278 
    279 				// Authentication Unavailable.  No shift in liability. ECI = 7
    280 				if ($signature_result->result == '00' && strtoupper($signature_result->threedsecure->status) == 'U') {
    281 					$eci_ref = 8;
    282 					$xid = (string)$signature_result->threedsecure->xid;
    283 					$cavv = '';
    284 				}
    285 
    286 				// Invalid response from ACS.  No shift in liability. ECI = 7
    287 				if (isset($signature_result->result)  && $signature_result->result >= 500 && $signature_result->result < 600) {
    288 					$eci_ref = 9;
    289 					$xid = '';
    290 					$cavv = '';
    291 				}
    292 
    293 				if ($this->config->get('payment_realex_remote_liability') != 1) {
    294 					// this is the check for liability shift - if the merchant does not want to accept, redirect to checkout with message
    295 					$this->load->language('extension/payment/realex_remote');
    296 
    297 					$message = $this->language->get('error_3d_unsuccessful');
    298 					$message .= '<br /><strong>' . $this->language->get('text_eci') . ':</strong> (' . $eci . ') ' . $this->language->get('text_3d_s' . (int)$eci_ref);
    299 					$message .= '<br /><strong>' . $this->language->get('text_timestamp') . ':</strong> ' . (string)strftime("%Y%m%d%H%M%S");
    300 					$message .= '<br /><strong>' . $this->language->get('text_order_ref') . ':</strong> ' . (string)$md['order_ref'];
    301 
    302 					if ($this->config->get('payment_realex_remote_card_data_status') == 1) {
    303 						$message .= '<br /><strong>' . $this->language->get('entry_cc_type') . ':</strong> ' . (string)$md['cc_type'];
    304 						$message .= '<br /><strong>' . $this->language->get('text_last_digits') . ':</strong> ' . (string)substr($md['cc_number'], -4);
    305 						$message .= '<br /><strong>' . $this->language->get('entry_cc_expire_date') . ':</strong> ' . (string)$md['cc_expire'];
    306 						$message .= '<br /><strong>' . $this->language->get('entry_cc_name') . ':</strong> ' . (string)$md['cc_name'];
    307 					}
    308 
    309 					$this->model_extension_payment_realex_remote->addHistory($md['order_id'], $this->config->get('payment_realex_remote_order_status_decline_id'), $message);
    310 
    311 					$this->session->data['error'] = $this->language->get('error_3d_unsuccessful');
    312 
    313 					$this->response->redirect($this->url->link('checkout/checkout', '', true));
    314 					die();
    315 				}
    316 			}
    317 
    318 			$capture_result = $this->model_extension_payment_realex_remote->capturePayment(
    319 				$md['account'],
    320 				$md['amount'],
    321 				$md['currency'],
    322 				$md['order_id'],
    323 				$md['order_ref'],
    324 				$md['cc_number'],
    325 				$md['cc_expire'],
    326 				$md['cc_name'],
    327 				$md['cc_type'],
    328 				$md['cc_cvv2'],
    329 				$md['cc_issue'],
    330 				$eci_ref,
    331 				$eci,
    332 				$cavv,
    333 				$xid
    334 			);
    335 
    336 			$this->model_extension_payment_realex_remote->logger('Capture result:\r\n' . print_r($capture_result, 1));
    337 
    338 			if ($capture_result->result != '00') {
    339 				$this->session->data['error'] = (string)$capture_result->message . ' (' . (int)$capture_result->result . ')';
    340 
    341 				$this->response->redirect($this->url->link('checkout/checkout', '', true));
    342 			} else {
    343 				$this->response->redirect($this->url->link('checkout/success'));
    344 			}
    345 		} else {
    346 			$this->response->redirect($this->url->link('account/login', '', true));
    347 		}
    348 	}
    349 }