squareup.php (54445B)
1 <?php 2 3 class ControllerExtensionPaymentSquareup extends Controller { 4 private $error = array(); 5 6 public function index() { 7 $this->load->language('extension/payment/squareup'); 8 9 $this->load->model('extension/payment/squareup'); 10 $this->load->model('setting/setting'); 11 12 $this->load->library('squareup'); 13 14 if ($this->request->server['HTTPS']) { 15 $server = HTTPS_SERVER; 16 } else { 17 $server = HTTP_SERVER; 18 } 19 20 $previous_setting = $this->model_setting_setting->getSetting('payment_squareup'); 21 22 try { 23 if ($this->config->get('payment_squareup_access_token')) { 24 if (!$this->squareup->verifyToken($this->config->get('payment_squareup_access_token'))) { 25 unset($previous_setting['payment_squareup_merchant_id']); 26 unset($previous_setting['payment_squareup_merchant_name']); 27 unset($previous_setting['payment_squareup_access_token']); 28 unset($previous_setting['payment_squareup_access_token_expires']); 29 unset($previous_setting['payment_squareup_locations']); 30 unset($previous_setting['payment_squareup_sandbox_locations']); 31 32 $this->config->set('payment_squareup_merchant_id', null); 33 } else { 34 if (!$this->config->get('payment_squareup_locations')) { 35 $previous_setting['payment_squareup_locations'] = $this->squareup->fetchLocations($this->config->get('payment_squareup_access_token'), $first_location_id); 36 $previous_setting['payment_squareup_location_id'] = $first_location_id; 37 } 38 } 39 } 40 41 if (!$this->config->get('payment_squareup_sandbox_locations') && $this->config->get('payment_squareup_sandbox_token')) { 42 $previous_setting['payment_squareup_sandbox_locations'] = $this->squareup->fetchLocations($this->config->get('payment_squareup_sandbox_token'), $first_location_id); 43 $previous_setting['payment_squareup_sandbox_location_id'] = $first_location_id; 44 } 45 46 $this->model_setting_setting->editSetting('payment_squareup', $previous_setting); 47 } catch (\Squareup\Exception $e) { 48 $this->pushAlert(array( 49 'type' => 'danger', 50 'icon' => 'exclamation-circle', 51 'text' => sprintf($this->language->get('text_location_error'), $e->getMessage()) 52 )); 53 } 54 55 $previous_config = new Config(); 56 57 foreach ($previous_setting as $key => $value) { 58 $previous_config->set($key, $value); 59 } 60 61 if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validate()) { 62 $this->model_setting_setting->editSetting('payment_squareup', array_merge($previous_setting, $this->request->post)); 63 64 $this->session->data['success'] = $this->language->get('text_success'); 65 66 if (isset($this->request->get['save_and_auth'])) { 67 $this->response->redirect($this->squareup->authLink($this->request->post['payment_squareup_client_id'])); 68 } else { 69 $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)); 70 } 71 } 72 73 $this->document->setTitle($this->language->get('heading_title')); 74 75 $data['error_status'] = $this->getValidationError('status'); 76 $data['error_display_name'] = $this->getValidationError('display_name'); 77 $data['error_client_id'] = $this->getValidationError('client_id'); 78 $data['error_client_secret'] = $this->getValidationError('client_secret'); 79 $data['error_delay_capture'] = $this->getValidationError('delay_capture'); 80 $data['error_sandbox_client_id'] = $this->getValidationError('sandbox_client_id'); 81 $data['error_sandbox_token'] = $this->getValidationError('sandbox_token'); 82 $data['error_location'] = $this->getValidationError('location'); 83 $data['error_cron_email'] = $this->getValidationError('cron_email'); 84 $data['error_cron_acknowledge'] = $this->getValidationError('cron_acknowledge'); 85 86 $data['payment_squareup_status'] = $this->getSettingValue('payment_squareup_status'); 87 $data['payment_squareup_status_authorized'] = $this->getSettingValue('payment_squareup_status_authorized'); 88 $data['payment_squareup_status_captured'] = $this->getSettingValue('payment_squareup_status_captured'); 89 $data['payment_squareup_status_voided'] = $this->getSettingValue('payment_squareup_status_voided'); 90 $data['payment_squareup_status_failed'] = $this->getSettingValue('payment_squareup_status_failed'); 91 $data['payment_squareup_display_name'] = $this->getSettingValue('payment_squareup_display_name'); 92 $data['payment_squareup_client_id'] = $this->getSettingValue('payment_squareup_client_id'); 93 $data['payment_squareup_client_secret'] = $this->getSettingValue('payment_squareup_client_secret'); 94 $data['payment_squareup_enable_sandbox'] = $this->getSettingValue('payment_squareup_enable_sandbox'); 95 $data['payment_squareup_debug'] = $this->getSettingValue('payment_squareup_debug'); 96 $data['payment_squareup_sort_order'] = $this->getSettingValue('payment_squareup_sort_order'); 97 $data['payment_squareup_total'] = $this->getSettingValue('payment_squareup_total'); 98 $data['payment_squareup_geo_zone_id'] = $this->getSettingValue('payment_squareup_geo_zone_id'); 99 $data['payment_squareup_sandbox_client_id'] = $this->getSettingValue('payment_squareup_sandbox_client_id'); 100 $data['payment_squareup_sandbox_token'] = $this->getSettingValue('payment_squareup_sandbox_token'); 101 $data['payment_squareup_locations'] = $this->getSettingValue('payment_squareup_locations', $previous_config->get('payment_squareup_locations')); 102 $data['payment_squareup_location_id'] = $this->getSettingValue('payment_squareup_location_id'); 103 $data['payment_squareup_sandbox_locations'] = $this->getSettingValue('payment_squareup_sandbox_locations', $previous_config->get('payment_squareup_sandbox_locations')); 104 $data['payment_squareup_sandbox_location_id'] = $this->getSettingValue('payment_squareup_sandbox_location_id'); 105 $data['payment_squareup_delay_capture'] = $this->getSettingValue('payment_squareup_delay_capture'); 106 $data['payment_squareup_recurring_status'] = $this->getSettingValue('payment_squareup_recurring_status'); 107 $data['payment_squareup_cron_email_status'] = $this->getSettingValue('payment_squareup_cron_email_status'); 108 $data['payment_squareup_cron_email'] = $this->getSettingValue('payment_squareup_cron_email', $this->config->get('config_email')); 109 $data['payment_squareup_cron_token'] = $this->getSettingValue('payment_squareup_cron_token'); 110 $data['payment_squareup_cron_acknowledge'] = $this->getSettingValue('payment_squareup_cron_acknowledge', null, true); 111 $data['payment_squareup_notify_recurring_success'] = $this->getSettingValue('payment_squareup_notify_recurring_success'); 112 $data['payment_squareup_notify_recurring_fail'] = $this->getSettingValue('payment_squareup_notify_recurring_fail'); 113 $data['payment_squareup_merchant_id'] = $this->getSettingValue('payment_squareup_merchant_id', $previous_config->get('payment_squareup_merchant_id')); 114 $data['payment_squareup_merchant_name'] = $this->getSettingValue('payment_squareup_merchant_name', $previous_config->get('payment_squareup_merchant_name')); 115 116 if ($previous_config->get('payment_squareup_access_token') && $previous_config->get('payment_squareup_access_token_expires')) { 117 $expiration_time = date_create_from_format('Y-m-d\TH:i:s\Z', $previous_config->get('payment_squareup_access_token_expires')); 118 $now = date_create(); 119 120 $delta = $expiration_time->getTimestamp() - $now->getTimestamp(); 121 $expiration_date_formatted = $expiration_time->format('l, F jS, Y h:i:s A, e'); 122 123 if ($delta < 0) { 124 $this->pushAlert(array( 125 'type' => 'danger', 126 'icon' => 'exclamation-circle', 127 'text' => sprintf($this->language->get('text_token_expired'), $this->url->link('extension/payment/squareup/refresh_token', 'user_token=' . $this->session->data['user_token'], true)) 128 )); 129 } else if ($delta < (5 * 24 * 60 * 60)) { // token is valid, just about to expire 130 $this->pushAlert(array( 131 'type' => 'warning', 132 'icon' => 'exclamation-circle', 133 'text' => sprintf($this->language->get('text_token_expiry_warning'), $expiration_date_formatted, $this->url->link('extension/payment/squareup/refresh_token', 'user_token=' . $this->session->data['user_token'], true)) 134 )); 135 } 136 137 $data['access_token_expires_time'] = $expiration_date_formatted; 138 } else if ($previous_config->get('payment_squareup_client_id')) { 139 $this->pushAlert(array( 140 'type' => 'danger', 141 'icon' => 'exclamation-circle', 142 'text' => sprintf($this->language->get('text_token_revoked'), $this->squareup->authLink($previous_config->get('payment_squareup_client_id'))) 143 )); 144 145 $data['access_token_expires_time'] = $this->language->get('text_na'); 146 } 147 148 if ($previous_config->get('payment_squareup_client_id')) { 149 $data['payment_squareup_auth_link'] = $this->squareup->authLink($previous_config->get('payment_squareup_client_id')); 150 } else { 151 $data['payment_squareup_auth_link'] = null; 152 } 153 154 $data['payment_squareup_redirect_uri'] = str_replace('&', '&', $this->url->link('extension/payment/squareup/oauth_callback', '', true)); 155 $data['payment_squareup_refresh_link'] = $this->url->link('extension/payment/squareup/refresh_token', 'user_token=' . $this->session->data['user_token'], true); 156 157 if ($this->config->get('payment_squareup_enable_sandbox')) { 158 $this->pushAlert(array( 159 'type' => 'warning', 160 'icon' => 'exclamation-circle', 161 'text' => $this->language->get('text_sandbox_enabled') 162 )); 163 } 164 165 if (isset($this->error['warning'])) { 166 $this->pushAlert(array( 167 'type' => 'danger', 168 'icon' => 'exclamation-circle', 169 'text' => $this->error['warning'] 170 )); 171 } 172 173 // Insert success message from the session 174 if (isset($this->session->data['success'])) { 175 $this->pushAlert(array( 176 'type' => 'success', 177 'icon' => 'exclamation-circle', 178 'text' => $this->session->data['success'] 179 )); 180 181 unset($this->session->data['success']); 182 } 183 184 if ($this->request->server['HTTPS']) { 185 // Push the SSL reminder alert 186 $this->pushAlert(array( 187 'type' => 'info', 188 'icon' => 'lock', 189 'text' => $this->language->get('text_notification_ssl') 190 )); 191 } else { 192 // Push the SSL reminder alert 193 $this->pushAlert(array( 194 'type' => 'danger', 195 'icon' => 'exclamation-circle', 196 'text' => $this->language->get('error_no_ssl') 197 )); 198 } 199 200 $tabs = array( 201 'tab-transaction', 202 'tab-setting', 203 'tab-recurring', 204 'tab-cron' 205 ); 206 207 if (isset($this->request->get['tab']) && in_array($this->request->get['tab'], $tabs)) { 208 $data['tab'] = $this->request->get['tab']; 209 } else if (isset($this->error['cron_email']) || isset($this->error['cron_acknowledge'])) { 210 $data['tab'] = 'tab-cron'; 211 } else if ($this->error) { 212 $data['tab'] = 'tab-setting'; 213 } else { 214 $data['tab'] = $tabs[1]; 215 } 216 217 $data['breadcrumbs'] = array(); 218 219 $data['breadcrumbs'][] = array( 220 'text' => $this->language->get('text_home'), 221 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) 222 ); 223 224 $data['breadcrumbs'][] = array( 225 'text' => $this->language->get('text_extension'), 226 'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true) 227 ); 228 229 $data['breadcrumbs'][] = array( 230 'text' => $this->language->get('heading_title'), 231 'href' => $this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true) 232 ); 233 234 $data['action'] = html_entity_decode($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 235 $data['action_save_auth'] = html_entity_decode($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'] . '&save_and_auth=1', true)); 236 $data['cancel'] = html_entity_decode($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)); 237 $data['url_list_transactions'] = html_entity_decode($this->url->link('extension/payment/squareup/transactions', 'user_token=' . $this->session->data['user_token'] . '&page={PAGE}', true)); 238 239 $this->load->model('localisation/language'); 240 $data['languages'] = array(); 241 foreach ($this->model_localisation_language->getLanguages() as $language) { 242 $data['languages'][] = array( 243 'language_id' => $language['language_id'], 244 'name' => $language['name'] . ($language['code'] == $this->config->get('config_language') ? $this->language->get('text_default') : ''), 245 'image' => 'language/' . $language['code'] . '/'. $language['code'] . '.png' 246 ); 247 } 248 249 $this->load->model('localisation/order_status'); 250 $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses(); 251 252 $this->load->model('localisation/geo_zone'); 253 $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones(); 254 255 $data['payment_squareup_cron_command'] = PHP_BINDIR . '/php -d session.save_path=' . session_save_path() . ' ' . DIR_SYSTEM . 'library/squareup/cron.php ' . parse_url($server, PHP_URL_HOST) . ' 443 > /dev/null 2> /dev/null'; 256 257 if (!$this->config->get('payment_squareup_cron_token')) { 258 $data['payment_squareup_cron_token'] = md5(mt_rand()); 259 } 260 261 $data['payment_squareup_cron_url'] = 'https://' . parse_url($server, PHP_URL_HOST) . dirname(parse_url($server, PHP_URL_PATH)) . '/index.php?route=extension/recurring/squareup/recurring&cron_token={CRON_TOKEN}'; 262 263 $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG; 264 265 // API login 266 $this->load->model('user/api'); 267 268 $api_info = $this->model_user_api->getApi($this->config->get('config_api_id')); 269 270 if ($api_info && $this->user->hasPermission('modify', 'sale/order')) { 271 $session = new Session($this->config->get('session_engine'), $this->registry); 272 273 $session->start(); 274 275 $this->model_user_api->deleteApiSessionBySessonId($session->getId()); 276 277 $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']); 278 279 $session->data['api_id'] = $api_info['api_id']; 280 281 $data['api_token'] = $session->getId(); 282 } else { 283 $data['api_token'] = ''; 284 } 285 286 $data['header'] = $this->load->controller('common/header'); 287 $data['column_left'] = $this->load->controller('common/column_left'); 288 $data['footer'] = $this->load->controller('common/footer'); 289 290 $data['alerts'] = $this->pullAlerts(); 291 292 $this->clearAlerts(); 293 294 $this->response->setOutput($this->load->view('extension/payment/squareup', $data)); 295 } 296 297 public function transaction_info() { 298 $this->load->language('extension/payment/squareup'); 299 300 $this->load->model('extension/payment/squareup'); 301 302 $this->load->library('squareup'); 303 304 if (isset($this->request->get['squareup_transaction_id'])) { 305 $squareup_transaction_id = $this->request->get['squareup_transaction_id']; 306 } else { 307 $squareup_transaction_id = 0; 308 } 309 310 $transaction_info = $this->model_extension_payment_squareup->getTransaction($squareup_transaction_id); 311 312 if (empty($transaction_info)) { 313 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 314 } 315 316 $this->document->setTitle(sprintf($this->language->get('heading_title_transaction'), $transaction_info['transaction_id'])); 317 318 $data['alerts'] = $this->pullAlerts(); 319 320 $this->clearAlerts(); 321 322 $data['text_edit'] = sprintf($this->language->get('heading_title_transaction'), $transaction_info['transaction_id']); 323 324 $amount = $this->currency->format($transaction_info['transaction_amount'], $transaction_info['transaction_currency']); 325 326 $data['confirm_capture'] = sprintf($this->language->get('text_confirm_capture'), $amount); 327 $data['confirm_void'] = sprintf($this->language->get('text_confirm_void'), $amount); 328 $data['confirm_refund'] = $this->language->get('text_confirm_refund'); 329 $data['insert_amount'] = sprintf($this->language->get('text_insert_amount'), $amount, $transaction_info['transaction_currency']); 330 $data['text_loading'] = $this->language->get('text_loading_short'); 331 332 $data['billing_address_company'] = $transaction_info['billing_address_company']; 333 $data['billing_address_street'] = $transaction_info['billing_address_street_1'] . ' ' . $transaction_info['billing_address_street_2']; 334 $data['billing_address_city'] = $transaction_info['billing_address_city']; 335 $data['billing_address_postcode'] = $transaction_info['billing_address_postcode']; 336 $data['billing_address_province'] = $transaction_info['billing_address_province']; 337 $data['billing_address_country'] = $transaction_info['billing_address_country']; 338 339 $data['transaction_id'] = $transaction_info['transaction_id']; 340 $data['merchant'] = $transaction_info['merchant_id']; 341 $data['order_id'] = $transaction_info['order_id']; 342 $data['type'] = $transaction_info['transaction_type']; 343 $data['amount'] = $amount; 344 $data['currency'] = $transaction_info['transaction_currency']; 345 $data['browser'] = $transaction_info['device_browser']; 346 $data['ip'] = $transaction_info['device_ip']; 347 $data['date_created'] = date($this->language->get('datetime_format'), strtotime($transaction_info['created_at'])); 348 349 $data['cancel'] = $this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'] . '&tab=tab-transaction', true); 350 351 $data['url_order'] = $this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $transaction_info['order_id'], true); 352 $data['url_void'] = $this->url->link('extension/payment/squareup' . '/void', 'user_token=' . $this->session->data['user_token'] . '&preserve_alert=true&squareup_transaction_id=' . $transaction_info['squareup_transaction_id'], true); 353 $data['url_capture'] = $this->url->link('extension/payment/squareup' . '/capture', 'user_token=' . $this->session->data['user_token'] . '&preserve_alert=true&squareup_transaction_id=' . $transaction_info['squareup_transaction_id'], true); 354 $data['url_refund'] = $this->url->link('extension/payment/squareup' . '/refund', 'user_token=' . $this->session->data['user_token'] . '&preserve_alert=true&squareup_transaction_id=' . $transaction_info['squareup_transaction_id'], true); 355 $data['url_transaction'] = sprintf( 356 Squareup::VIEW_TRANSACTION_URL, 357 $transaction_info['transaction_id'], 358 $transaction_info['location_id'] 359 ); 360 361 $data['is_authorized'] = in_array($transaction_info['transaction_type'], array('AUTHORIZED')); 362 $data['is_captured'] = in_array($transaction_info['transaction_type'], array('CAPTURED')); 363 364 $data['has_refunds'] = (bool)$transaction_info['is_refunded']; 365 366 if ($data['has_refunds']) { 367 $refunds = @json_decode($transaction_info['refunds'], true); 368 369 $data['refunds'] = array(); 370 371 $data['text_refunds'] = sprintf($this->language->get('text_refunds'), count($refunds)); 372 373 foreach ($refunds as $refund) { 374 $amount = $this->currency->format( 375 $this->squareup->standardDenomination( 376 $refund['amount_money']['amount'], 377 $refund['amount_money']['currency'] 378 ), 379 $refund['amount_money']['currency'] 380 ); 381 382 $fee = $this->currency->format( 383 $this->squareup->standardDenomination( 384 $refund['processing_fee_money']['amount'], 385 $refund['processing_fee_money']['currency'] 386 ), 387 $refund['processing_fee_money']['currency'] 388 ); 389 390 $data['refunds'][] = array( 391 'date_created' => date($this->language->get('datetime_format'), strtotime($refund['created_at'])), 392 'reason' => $refund['reason'], 393 'status' => $refund['status'], 394 'amount' => $amount, 395 'fee' => $fee 396 ); 397 } 398 } 399 400 $data['breadcrumbs'] = array(); 401 402 $data['breadcrumbs'][] = array( 403 'text' => $this->language->get('text_home'), 404 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) 405 ); 406 407 $data['breadcrumbs'][] = array( 408 'text' => $this->language->get('text_extension'), 409 'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true) 410 ); 411 412 $data['breadcrumbs'][] = array( 413 'text' => $this->language->get('heading_title'), 414 'href' => $this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true) 415 ); 416 417 $data['breadcrumbs'][] = array( 418 'text' => sprintf($this->language->get('heading_title_transaction'), $transaction_info['squareup_transaction_id']), 419 'href' => $this->url->link('extension/payment/squareup/transaction_info', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $squareup_transaction_id, true) 420 ); 421 422 $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG; 423 424 // API login 425 $this->load->model('user/api'); 426 427 $api_info = $this->model_user_api->getApi($this->config->get('config_api_id')); 428 429 if ($api_info && $this->user->hasPermission('modify', 'sale/order')) { 430 $session = new Session($this->config->get('session_engine'), $this->registry); 431 432 $session->start(); 433 434 $this->model_user_api->deleteApiSessionBySessonId($session->getId()); 435 436 $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']); 437 438 $session->data['api_id'] = $api_info['api_id']; 439 440 $data['api_token'] = $session->getId(); 441 } else { 442 $data['api_token'] = ''; 443 } 444 445 $data['header'] = $this->load->controller('common/header'); 446 $data['column_left'] = $this->load->controller('common/column_left'); 447 $data['footer'] = $this->load->controller('common/footer'); 448 449 $this->response->setOutput($this->load->view('extension/payment/squareup_transaction_info', $data)); 450 } 451 452 public function transactions() { 453 $this->load->language('extension/payment/squareup'); 454 455 $this->load->model('extension/payment/squareup'); 456 457 if (isset($this->request->get['page'])) { 458 $page = (int)$this->request->get['page']; 459 } else { 460 $page = 1; 461 } 462 463 $result = array( 464 'transactions' => array(), 465 'pagination' => '' 466 ); 467 468 $filter_data = array( 469 'start' => ($page - 1) * (int)$this->config->get('config_limit_admin'), 470 'limit' => $this->config->get('config_limit_admin') 471 ); 472 473 if (isset($this->request->get['order_id'])) { 474 $filter_data['order_id'] = $this->request->get['order_id']; 475 } 476 477 $transactions_total = $this->model_extension_payment_squareup->getTotalTransactions($filter_data); 478 $transactions = $this->model_extension_payment_squareup->getTransactions($filter_data); 479 480 $this->load->model('sale/order'); 481 482 foreach ($transactions as $transaction) { 483 $amount = $this->currency->format($transaction['transaction_amount'], $transaction['transaction_currency']); 484 485 $order_info = $this->model_sale_order->getOrder($transaction['order_id']); 486 487 $result['transactions'][] = array( 488 'squareup_transaction_id' => $transaction['squareup_transaction_id'], 489 'transaction_id' => $transaction['transaction_id'], 490 'url_order' => $this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $transaction['order_id'], true), 491 'url_void' => $this->url->link('extension/payment/squareup/void', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true), 492 'url_capture' => $this->url->link('extension/payment/squareup/capture', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true), 493 'url_refund' => $this->url->link('extension/payment/squareup/refund', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true), 494 'confirm_capture' => sprintf($this->language->get('text_confirm_capture'), $amount), 495 'confirm_void' => sprintf($this->language->get('text_confirm_void'), $amount), 496 'confirm_refund' => $this->language->get('text_confirm_refund'), 497 'insert_amount' => sprintf($this->language->get('text_insert_amount'), $amount, $transaction['transaction_currency']), 498 'order_id' => $transaction['order_id'], 499 'type' => $transaction['transaction_type'], 500 'num_refunds' => count(@json_decode($transaction['refunds'], true)), 501 'amount' => $amount, 502 'customer' => $order_info['firstname'] . ' ' . $order_info['lastname'], 503 'ip' => $transaction['device_ip'], 504 'date_created' => date($this->language->get('datetime_format'), strtotime($transaction['created_at'])), 505 'url_info' => $this->url->link('extension/payment/squareup/transaction_info', 'user_token=' . $this->session->data['user_token'] . '&squareup_transaction_id=' . $transaction['squareup_transaction_id'], true) 506 ); 507 } 508 509 $pagination = new Pagination(); 510 $pagination->total = $transactions_total; 511 $pagination->page = $page; 512 $pagination->limit = $this->config->get('config_limit_admin'); 513 $pagination->url = '{page}'; 514 515 $result['pagination'] = $pagination->render(); 516 517 $this->response->addHeader('Content-Type: application/json'); 518 $this->response->setOutput(json_encode($result)); 519 } 520 521 public function refresh_token() { 522 $this->load->language('extension/payment/squareup'); 523 524 if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) { 525 $this->pushAlert(array( 526 'type' => 'danger', 527 'icon' => 'exclamation-circle', 528 'text' => $this->language->get('error_permission') 529 )); 530 531 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 532 } 533 534 $this->load->model('setting/setting'); 535 536 $this->load->library('squareup'); 537 538 try { 539 $response = $this->squareup->refreshToken(); 540 541 if (!isset($response['access_token']) || !isset($response['token_type']) || !isset($response['expires_at']) || !isset($response['merchant_id']) || 542 $response['merchant_id'] != $this->config->get('payment_squareup_merchant_id')) { 543 $this->pushAlert(array( 544 'type' => 'danger', 545 'icon' => 'exclamation-circle', 546 'text' => $this->language->get('error_refresh_access_token') 547 )); 548 } else { 549 $settings = $this->model_setting_setting->getSetting('payment_squareup'); 550 551 $settings['payment_squareup_access_token'] = $response['access_token']; 552 $settings['payment_squareup_access_token_expires'] = $response['expires_at']; 553 554 $this->model_setting_setting->editSetting('payment_squareup', $settings); 555 556 $this->pushAlert(array( 557 'type' => 'success', 558 'icon' => 'exclamation-circle', 559 'text' => $this->language->get('text_refresh_access_token_success') 560 )); 561 } 562 } catch (\Squareup\Exception $e) { 563 $this->pushAlert(array( 564 'type' => 'danger', 565 'icon' => 'exclamation-circle', 566 'text' => sprintf($this->language->get('error_token'), $e->getMessage()) 567 )); 568 } 569 570 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 571 } 572 573 public function oauth_callback() { 574 $this->load->language('extension/payment/squareup'); 575 576 if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) { 577 $this->pushAlert(array( 578 'type' => 'danger', 579 'icon' => 'exclamation-circle', 580 'text' => $this->language->get('error_permission') 581 )); 582 583 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 584 } 585 586 $this->load->model('setting/setting'); 587 588 $this->load->library('squareup'); 589 590 if (isset($this->request->get['error']) || isset($this->request->get['error_description'])) { 591 // auth error 592 if ($this->request->get['error'] == 'access_denied' && $this->request->get['error_description'] == 'user_denied') { 593 // user rejected giving auth permissions to his store 594 $this->pushAlert(array( 595 'type' => 'warning', 596 'icon' => 'exclamation-circle', 597 'text' => $this->language->get('error_user_rejected_connect_attempt') 598 )); 599 } 600 601 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 602 } 603 604 // verify parameters for the redirect from Square (against random url crawling) 605 if (!isset($this->request->get['state']) || !isset($this->request->get['code']) || !isset($this->request->get['response_type'])) { 606 // missing or wrong info 607 $this->pushAlert(array( 608 'type' => 'danger', 609 'icon' => 'exclamation-circle', 610 'text' => $this->language->get('error_possible_xss') 611 )); 612 613 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 614 } 615 616 // verify the state (against cross site requests) 617 if (!isset($this->session->data['payment_squareup_oauth_state']) || $this->session->data['payment_squareup_oauth_state'] != $this->request->get['state']) { 618 // state mismatch 619 $this->pushAlert(array( 620 'type' => 'danger', 621 'icon' => 'exclamation-circle', 622 'text' => $this->language->get('error_possible_xss') 623 )); 624 625 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 626 } 627 628 try { 629 $token = $this->squareup->exchangeCodeForAccessToken($this->request->get['code']); 630 631 $previous_setting = $this->model_setting_setting->getSetting('payment_squareup'); 632 633 $previous_setting['payment_squareup_locations'] = $this->squareup->fetchLocations($token['access_token'], $first_location_id); 634 635 if ( 636 !isset($previous_setting['payment_squareup_location_id']) || 637 (isset($previous_setting['payment_squareup_location_id']) && !in_array( 638 $previous_setting['payment_squareup_location_id'], 639 array_map( 640 function($location) { 641 return $location['id']; 642 }, 643 $previous_setting['payment_squareup_locations'] 644 ) 645 )) 646 ) { 647 $previous_setting['payment_squareup_location_id'] = $first_location_id; 648 } 649 650 if (!$this->config->get('payment_squareup_sandbox_locations') && $this->config->get('payment_squareup_sandbox_token')) { 651 $previous_setting['payment_squareup_sandbox_locations'] = $this->squareup->fetchLocations($this->config->get('payment_squareup_sandbox_token'), $first_location_id); 652 $previous_setting['payment_squareup_sandbox_location_id'] = $first_location_id; 653 } 654 655 $previous_setting['payment_squareup_merchant_id'] = $token['merchant_id']; 656 $previous_setting['payment_squareup_merchant_name'] = ''; // only available in v1 of the API, not populated for now 657 $previous_setting['payment_squareup_access_token'] = $token['access_token']; 658 $previous_setting['payment_squareup_access_token_expires'] = $token['expires_at']; 659 660 $this->model_setting_setting->editSetting('payment_squareup', $previous_setting); 661 662 unset($this->session->data['payment_squareup_oauth_state']); 663 unset($this->session->data['payment_squareup_oauth_redirect']); 664 665 $this->pushAlert(array( 666 'type' => 'success', 667 'icon' => 'exclamation-circle', 668 'text' => $this->language->get('text_refresh_access_token_success') 669 )); 670 } catch (\Squareup\Exception $e) { 671 $this->pushAlert(array( 672 'type' => 'danger', 673 'icon' => 'exclamation-circle', 674 'text' => sprintf($this->language->get('error_token'), $e->getMessage()) 675 )); 676 } 677 678 $this->response->redirect($this->url->link('extension/payment/squareup', 'user_token=' . $this->session->data['user_token'], true)); 679 } 680 681 public function capture() { 682 $this->transactionAction(function($transaction_info, &$json) { 683 $updated_transaction = $this->squareup->captureTransaction($transaction_info['location_id'], $transaction_info['transaction_id']); 684 685 $status = $updated_transaction['tenders'][0]['card_details']['status']; 686 687 $this->model_extension_payment_squareup->updateTransaction($transaction_info['squareup_transaction_id'], $status); 688 689 $json['order_history_data'] = array( 690 'notify' => 1, 691 'order_id' => $transaction_info['order_id'], 692 'order_status_id' => $this->model_extension_payment_squareup->getOrderStatusId($transaction_info['order_id'], $status), 693 'comment' => $this->language->get('squareup_status_comment_' . strtolower($status)), 694 ); 695 696 $json['success'] = $this->language->get('text_success_capture'); 697 }); 698 } 699 700 public function void() { 701 $this->transactionAction(function($transaction_info, &$json) { 702 $updated_transaction = $this->squareup->voidTransaction($transaction_info['location_id'], $transaction_info['transaction_id']); 703 704 $status = $updated_transaction['tenders'][0]['card_details']['status']; 705 706 $this->model_extension_payment_squareup->updateTransaction($transaction_info['squareup_transaction_id'], $status); 707 708 $json['order_history_data'] = array( 709 'notify' => 1, 710 'order_id' => $transaction_info['order_id'], 711 'order_status_id' => $this->model_extension_payment_squareup->getOrderStatusId($transaction_info['order_id'], $status), 712 'comment' => $this->language->get('squareup_status_comment_' . strtolower($status)), 713 ); 714 715 $json['success'] = $this->language->get('text_success_void'); 716 }); 717 } 718 719 public function refund() { 720 $this->transactionAction(function($transaction_info, &$json) { 721 if (!empty($this->request->post['reason'])) { 722 $reason = $this->request->post['reason']; 723 } else { 724 $reason = $this->language->get('text_no_reason_provided'); 725 } 726 727 if (!empty($this->request->post['amount'])) { 728 $amount = preg_replace('~[^0-9\.\,]~', '', $this->request->post['amount']); 729 730 if (strpos($amount, ',') !== FALSE && strpos($amount, '.') !== FALSE) { 731 $amount = (float)str_replace(',', '', $amount); 732 } else if (strpos($amount, ',') !== FALSE && strpos($amount, '.') === FALSE) { 733 $amount = (float)str_replace(',', '.', $amount); 734 } else { 735 $amount = (float)$amount; 736 } 737 } else { 738 $amount = 0; 739 } 740 741 $currency = $transaction_info['transaction_currency']; 742 $tenders = @json_decode($transaction_info['tenders'], true); 743 744 $updated_transaction = $this->squareup->refundTransaction($transaction_info['location_id'], $transaction_info['transaction_id'], $reason, $amount, $currency, $tenders[0]['id']); 745 746 $status = $updated_transaction['tenders'][0]['card_details']['status']; 747 748 $refunds = array(); 749 750 if (!empty($updated_transaction['refunds'])) { 751 $refunds = $updated_transaction['refunds']; 752 } 753 754 $this->model_extension_payment_squareup->updateTransaction($transaction_info['squareup_transaction_id'], $status, $refunds); 755 756 $last_refund = array_pop($refunds); 757 758 if ($last_refund) { 759 $refunded_amount = $this->currency->format( 760 $this->squareup->standardDenomination( 761 $last_refund['amount_money']['amount'], 762 $last_refund['amount_money']['currency'] 763 ), 764 $last_refund['amount_money']['currency'] 765 ); 766 767 $comment = sprintf($this->language->get('text_refunded_amount'), $refunded_amount, $last_refund['status'], $last_refund['reason']); 768 769 $json['order_history_data'] = array( 770 'notify' => 1, 771 'order_id' => $transaction_info['order_id'], 772 'order_status_id' => $this->model_extension_payment_squareup->getOrderStatusId($transaction_info['order_id']), 773 'comment' => $comment, 774 ); 775 776 $json['success'] = $this->language->get('text_success_refund'); 777 } else { 778 $json['error'] = $this->language->get('error_no_refund'); 779 } 780 }); 781 } 782 783 public function order() { 784 $this->load->language('extension/payment/squareup'); 785 786 $data['url_list_transactions'] = html_entity_decode($this->url->link('extension/payment/squareup/transactions', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $this->request->get['order_id'] . '&page={PAGE}', true)); 787 $data['user_token'] = $this->session->data['user_token']; 788 $data['order_id'] = $this->request->get['order_id']; 789 790 $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG; 791 792 // API login 793 $this->load->model('user/api'); 794 795 $api_info = $this->model_user_api->getApi($this->config->get('config_api_id')); 796 797 if ($api_info && $this->user->hasPermission('modify', 'sale/order')) { 798 $session = new Session($this->config->get('session_engine'), $this->registry); 799 800 $session->start(); 801 802 $this->model_user_api->deleteApiSessionBySessonId($session->getId()); 803 804 $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']); 805 806 $session->data['api_id'] = $api_info['api_id']; 807 808 $data['api_token'] = $session->getId(); 809 } else { 810 $data['api_token'] = ''; 811 } 812 813 return $this->load->view('extension/payment/squareup_order', $data); 814 } 815 816 public function install() { 817 $this->load->model('extension/payment/squareup'); 818 819 $this->model_extension_payment_squareup->createTables(); 820 } 821 822 public function uninstall() { 823 $this->load->model('extension/payment/squareup'); 824 825 $this->model_extension_payment_squareup->dropTables(); 826 } 827 828 public function recurringButtons() { 829 if (!$this->user->hasPermission('modify', 'sale/recurring')) { 830 return; 831 } 832 833 $this->load->model('extension/payment/squareup'); 834 835 $this->load->language('extension/payment/squareup'); 836 837 if (isset($this->request->get['order_recurring_id'])) { 838 $order_recurring_id = $this->request->get['order_recurring_id']; 839 } else { 840 $order_recurring_id = 0; 841 } 842 843 $recurring_info = $this->model_sale_recurring->getRecurring($order_recurring_id); 844 845 $data['button_text'] = $this->language->get('button_cancel_recurring'); 846 847 if ($recurring_info['status'] == ModelExtensionPaymentSquareup::RECURRING_ACTIVE) { 848 $data['order_recurring_id'] = $order_recurring_id; 849 } else { 850 $data['order_recurring_id'] = ''; 851 } 852 853 $this->load->model('sale/order'); 854 855 $order_info = $this->model_sale_order->getOrder($recurring_info['order_id']); 856 857 $data['order_id'] = $recurring_info['order_id']; 858 $data['store_id'] = $order_info['store_id']; 859 $data['order_status_id'] = $order_info['order_status_id']; 860 $data['comment'] = $this->language->get('text_order_history_cancel'); 861 $data['notify'] = 1; 862 863 $data['catalog'] = $this->request->server['HTTPS'] ? HTTPS_CATALOG : HTTP_CATALOG; 864 865 // API login 866 $this->load->model('user/api'); 867 868 $api_info = $this->model_user_api->getApi($this->config->get('config_api_id')); 869 870 if ($api_info && $this->user->hasPermission('modify', 'sale/order')) { 871 $session = new Session($this->config->get('session_engine'), $this->registry); 872 873 $session->start(); 874 875 $this->model_user_api->deleteApiSessionBySessonId($session->getId()); 876 877 $this->model_user_api->addApiSession($api_info['api_id'], $session->getId(), $this->request->server['REMOTE_ADDR']); 878 879 $session->data['api_id'] = $api_info['api_id']; 880 881 $data['api_token'] = $session->getId(); 882 } else { 883 $data['api_token'] = ''; 884 } 885 886 $data['cancel'] = html_entity_decode($this->url->link('extension/payment/squareup/recurringCancel', 'order_recurring_id=' . $order_recurring_id . '&user_token=' . $this->session->data['user_token'], true)); 887 888 return $this->load->view('extension/payment/squareup_recurring_buttons', $data); 889 } 890 891 public function recurringCancel() { 892 $this->load->language('extension/payment/squareup'); 893 894 $json = array(); 895 896 if (!$this->user->hasPermission('modify', 'sale/recurring')) { 897 $json['error'] = $this->language->get('error_permission_recurring'); 898 } else { 899 $this->load->model('sale/recurring'); 900 901 if (isset($this->request->get['order_recurring_id'])) { 902 $order_recurring_id = $this->request->get['order_recurring_id']; 903 } else { 904 $order_recurring_id = 0; 905 } 906 907 $recurring_info = $this->model_sale_recurring->getRecurring($order_recurring_id); 908 909 if ($recurring_info) { 910 $this->load->model('extension/payment/squareup'); 911 912 $this->model_extension_payment_squareup->editOrderRecurringStatus($order_recurring_id, ModelExtensionPaymentSquareup::RECURRING_CANCELLED); 913 914 $json['success'] = $this->language->get('text_canceled_success'); 915 916 } else { 917 $json['error'] = $this->language->get('error_not_found'); 918 } 919 } 920 921 $this->response->addHeader('Content-Type: application/json'); 922 $this->response->setOutput(json_encode($json)); 923 } 924 925 protected function validate() { 926 if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) { 927 $this->error['warning'] = $this->language->get('error_permission'); 928 } 929 930 if (empty($this->request->post['payment_squareup_client_id']) || strlen($this->request->post['payment_squareup_client_id']) > 32) { 931 $this->error['client_id'] = $this->language->get('error_client_id'); 932 } 933 934 if (empty($this->request->post['payment_squareup_client_secret']) || strlen($this->request->post['payment_squareup_client_secret']) > 50) { 935 $this->error['client_secret'] = $this->language->get('error_client_secret'); 936 } 937 938 if (!empty($this->request->post['payment_squareup_enable_sandbox'])) { 939 if (empty($this->request->post['payment_squareup_sandbox_client_id']) || strlen($this->request->post['payment_squareup_sandbox_client_id']) > 42) { 940 $this->error['sandbox_client_id'] = $this->language->get('error_sandbox_client_id'); 941 } 942 943 if (empty($this->request->post['payment_squareup_sandbox_token']) || strlen($this->request->post['payment_squareup_sandbox_token']) > 42) { 944 $this->error['sandbox_token'] = $this->language->get('error_sandbox_token'); 945 } 946 947 if ($this->config->get('payment_squareup_merchant_id') && !$this->config->get('payment_squareup_sandbox_locations')) { 948 $this->error['warning'] = $this->language->get('text_no_appropriate_locations_warning'); 949 } 950 951 if ($this->config->get('payment_squareup_sandbox_locations') && isset($this->request->post['payment_squareup_sandbox_location_id']) && !in_array($this->request->post['payment_squareup_sandbox_location_id'], array_map(function($location) { 952 return $location['id']; 953 }, $this->config->get('payment_squareup_sandbox_locations')))) { 954 $this->error['location'] = $this->language->get('error_no_location_selected'); 955 } 956 } else { 957 if ($this->config->get('payment_squareup_merchant_id') && !$this->config->get('payment_squareup_locations')) { 958 $this->error['warning'] = $this->language->get('text_no_appropriate_locations_warning'); 959 } 960 961 if ($this->config->get('payment_squareup_locations') && isset($this->request->post['payment_squareup_location_id']) && !in_array($this->request->post['payment_squareup_location_id'], array_map(function($location) { 962 return $location['id']; 963 }, $this->config->get('payment_squareup_locations')))) { 964 $this->error['location'] = $this->language->get('error_no_location_selected'); 965 } 966 } 967 968 if (!empty($this->request->post['payment_squareup_cron_email_status'])) { 969 if (!filter_var($this->request->post['payment_squareup_cron_email'], FILTER_VALIDATE_EMAIL)) { 970 $this->error['cron_email'] = $this->language->get('error_invalid_email'); 971 } 972 } 973 974 if (!isset($this->request->get['save_and_auth']) && empty($this->request->post['payment_squareup_cron_acknowledge'])) { 975 $this->error['cron_acknowledge'] = $this->language->get('error_cron_acknowledge'); 976 } 977 978 if ($this->error && empty($this->error['warning'])) { 979 $this->error['warning'] = $this->language->get('error_form'); 980 } 981 982 return !$this->error; 983 } 984 985 protected function transactionAction($callback) { 986 $this->load->language('extension/payment/squareup'); 987 988 $this->load->model('extension/payment/squareup'); 989 990 $this->load->library('squareup'); 991 992 $json = array(); 993 994 if (!$this->user->hasPermission('modify', 'extension/payment/squareup')) { 995 $json['error'] = $this->language->get('error_permission'); 996 } 997 998 if (isset($this->request->get['squareup_transaction_id'])) { 999 $squareup_transaction_id = $this->request->get['squareup_transaction_id']; 1000 } else { 1001 $squareup_transaction_id = 0; 1002 } 1003 1004 $transaction_info = $this->model_extension_payment_squareup->getTransaction($squareup_transaction_id); 1005 1006 if (empty($transaction_info)) { 1007 $json['error'] = $this->language->get('error_transaction_missing'); 1008 } else { 1009 try { 1010 $callback($transaction_info, $json); 1011 } catch (\Squareup\Exception $e) { 1012 $json['error'] = $e->getMessage(); 1013 } 1014 } 1015 1016 if (isset($this->request->get['preserve_alert'])) { 1017 if (!empty($json['error'])) { 1018 $this->pushAlert(array( 1019 'type' => 'danger', 1020 'icon' => 'exclamation-circle', 1021 'text' => $json['error'] 1022 )); 1023 } 1024 1025 if (!empty($json['success'])) { 1026 $this->pushAlert(array( 1027 'type' => 'success', 1028 'icon' => 'exclamation-circle', 1029 'text' => $json['success'] 1030 )); 1031 } 1032 } 1033 1034 $this->response->addHeader('Content-Type: application/json'); 1035 $this->response->setOutput(json_encode($json)); 1036 } 1037 1038 protected function pushAlert($alert) { 1039 $this->session->data['payment_squareup_alerts'][] = $alert; 1040 } 1041 1042 protected function pullAlerts() { 1043 if (isset($this->session->data['payment_squareup_alerts'])) { 1044 return $this->session->data['payment_squareup_alerts']; 1045 } else { 1046 return array(); 1047 } 1048 } 1049 1050 protected function clearAlerts() { 1051 unset($this->session->data['payment_squareup_alerts']); 1052 } 1053 1054 protected function getSettingValue($key, $default = null, $checkbox = false) { 1055 if ($checkbox) { 1056 if ($this->request->server['REQUEST_METHOD'] == 'POST' && !isset($this->request->post[$key])) { 1057 return $default; 1058 } else { 1059 return $this->config->get($key); 1060 } 1061 } 1062 1063 if (isset($this->request->post[$key])) { 1064 return $this->request->post[$key]; 1065 } else if ($this->config->has($key)) { 1066 return $this->config->get($key); 1067 } else { 1068 return $default; 1069 } 1070 } 1071 1072 protected function getValidationError($key) { 1073 if (isset($this->error[$key])) { 1074 return $this->error[$key]; 1075 } else { 1076 return ''; 1077 } 1078 } 1079 }