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 }