diff options
author | Jesús <heckyel@hyperbola.info> | 2019-08-18 21:14:58 -0500 |
---|---|---|
committer | Jesús <heckyel@hyperbola.info> | 2019-08-18 21:14:58 -0500 |
commit | 2eed7b082f83630301e51f57ca8394de228a8605 (patch) | |
tree | 1d19962d22d30f99317d9276e4bae7744fc93fc2 /public/admin/controller/extension/payment/pp_braintree.php | |
download | librecart-2eed7b082f83630301e51f57ca8394de228a8605.tar.lz librecart-2eed7b082f83630301e51f57ca8394de228a8605.tar.xz librecart-2eed7b082f83630301e51f57ca8394de228a8605.zip |
first commit
Diffstat (limited to 'public/admin/controller/extension/payment/pp_braintree.php')
-rw-r--r-- | public/admin/controller/extension/payment/pp_braintree.php | 1132 |
1 files changed, 1132 insertions, 0 deletions
diff --git a/public/admin/controller/extension/payment/pp_braintree.php b/public/admin/controller/extension/payment/pp_braintree.php new file mode 100644 index 0000000..0bf83e8 --- /dev/null +++ b/public/admin/controller/extension/payment/pp_braintree.php @@ -0,0 +1,1132 @@ +<?php +class ControllerExtensionPaymentPPBraintree extends Controller { + private $error = array(); + private $gateway = null; + private $opencart_connect_url = 'https://www.opencart.com/index.php?route=external/braintree_auth/connect'; + private $opencart_retrieve_url = 'https://www.opencart.com/index.php?route=external/braintree_auth/retrieve'; + + public function index() { + $this->load->language('extension/payment/pp_braintree'); + + $this->document->setTitle($this->language->get('heading_title')); + + $this->load->model('setting/setting'); + + if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { + foreach ($this->request->post['payment_pp_braintree_account'] as $currency => $account) { + if (!isset($account['status'])) { + $this->request->post['payment_pp_braintree_account'][$currency]['status'] = 0; + } + } + + $this->model_setting_setting->editSetting('payment_pp_braintree', $this->request->post); + + $this->session->data['success'] = $this->language->get('text_success'); + + $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true)); + } + + $data['button_configure'] = $this->url->link('extension/module/pp_braintree_button/configure', 'user_token=' . $this->session->data['user_token'], true); + + $data['user_token'] = $this->session->data['user_token']; + + $this->load->model('localisation/order_status'); + + $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses(); + + $this->load->model('localisation/geo_zone'); + + $data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones(); + + $this->load->model('localisation/currency'); + + $data['currencies'] = $this->model_localisation_currency->getCurrencies(); + + if (isset($this->error['warning'])) { + $data['error_warning'] = $this->error['warning']; + } else { + $data['error_warning'] = ''; + } + + if (isset($this->error['account'])) { + $data['error_account'] = $this->error['account']; + } else { + $data['error_account'] = array(); + } + + $data['breadcrumbs'] = array(); + + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('text_home'), + 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) + ); + + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('text_extension'), + 'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true) + ); + + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('heading_title'), + 'href' => $this->url->link('extension/payment/pp_braintree', 'user_token=' . $this->session->data['user_token'], true) + ); + + $data['action'] = $this->url->link('extension/payment/pp_braintree', 'user_token=' . $this->session->data['user_token'], true); + + $data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true); + + if (isset($this->request->post['payment_pp_braintree_merchant_id'])) { + $data['payment_pp_braintree_merchant_id'] = $this->request->post['payment_pp_braintree_merchant_id']; + } else { + $data['payment_pp_braintree_merchant_id'] = $this->config->get('payment_pp_braintree_merchant_id'); + } + + if (isset($this->request->post['payment_pp_braintree_public_key'])) { + $data['payment_pp_braintree_public_key'] = $this->request->post['payment_pp_braintree_public_key']; + } else { + $data['payment_pp_braintree_public_key'] = $this->config->get('payment_pp_braintree_public_key'); + } + + if (isset($this->request->post['payment_pp_braintree_private_key'])) { + $data['payment_pp_braintree_private_key'] = $this->request->post['payment_pp_braintree_private_key']; + } else { + $data['payment_pp_braintree_private_key'] = $this->config->get('payment_pp_braintree_private_key'); + } + + if (isset($this->request->post['payment_pp_braintree_access_token'])) { + $data['payment_pp_braintree_access_token'] = $this->request->post['payment_pp_braintree_access_token']; + } else { + $data['payment_pp_braintree_access_token'] = $this->config->get('payment_pp_braintree_access_token'); + } + + if (isset($this->request->post['payment_pp_braintree_refresh_token'])) { + $data['payment_pp_braintree_refresh_token'] = $this->request->post['payment_pp_braintree_refresh_token']; + } else { + $data['payment_pp_braintree_refresh_token'] = $this->config->get('payment_pp_braintree_refresh_token'); + } + + if (isset($this->request->post['payment_pp_braintree_environment'])) { + $data['payment_pp_braintree_environment'] = $this->request->post['payment_pp_braintree_environment']; + } else { + $data['payment_pp_braintree_environment'] = $this->config->get('payment_pp_braintree_environment'); + } + + if (isset($this->request->post['payment_pp_braintree_settlement_immediate'])) { + $data['payment_pp_braintree_settlement_immediate'] = $this->request->post['payment_pp_braintree_settlement_immediate']; + } else { + $data['payment_pp_braintree_settlement_immediate'] = $this->config->get('payment_pp_braintree_settlement_immediate'); + } + + if (isset($this->request->post['payment_pp_braintree_card_vault'])) { + $data['payment_pp_braintree_card_vault'] = $this->request->post['payment_pp_braintree_card_vault']; + } else { + $data['payment_pp_braintree_card_vault'] = $this->config->get('payment_pp_braintree_card_vault'); + } + + if (isset($this->request->post['payment_pp_braintree_card_check_vault'])) { + $data['payment_pp_braintree_card_check_vault'] = $this->request->post['payment_pp_braintree_card_check_vault']; + } else { + $data['payment_pp_braintree_card_check_vault'] = $this->config->get('payment_pp_braintree_card_check_vault'); + } + + if (isset($this->request->post['payment_pp_braintree_paypal_vault'])) { + $data['payment_pp_braintree_paypal_vault'] = $this->request->post['payment_pp_braintree_paypal_vault']; + } else { + $data['payment_pp_braintree_paypal_vault'] = $this->config->get('payment_pp_braintree_paypal_vault'); + } + + if (isset($this->request->post['payment_pp_braintree_paypal_check_vault'])) { + $data['payment_pp_braintree_paypal_check_vault'] = $this->request->post['payment_pp_braintree_paypal_check_vault']; + } else { + $data['payment_pp_braintree_paypal_check_vault'] = $this->config->get('payment_pp_braintree_paypal_check_vault'); + } + + if (isset($this->request->post['payment_pp_braintree_vault_cvv_3ds'])) { + $data['payment_pp_braintree_vault_cvv_3ds'] = $this->request->post['payment_pp_braintree_vault_cvv_3ds']; + } else { + $data['payment_pp_braintree_vault_cvv_3ds'] = $this->config->get('payment_pp_braintree_vault_cvv_3ds'); + } + + if (isset($this->request->post['payment_pp_braintree_debug'])) { + $data['payment_pp_braintree_debug'] = $this->request->post['payment_pp_braintree_debug']; + } else { + $data['payment_pp_braintree_debug'] = $this->config->get('payment_pp_braintree_debug'); + } + + if (isset($this->request->post['payment_pp_braintree_total'])) { + $data['payment_pp_braintree_total'] = $this->request->post['payment_pp_braintree_total']; + } else { + $data['payment_pp_braintree_total'] = $this->config->get('payment_pp_braintree_total'); + } + + if (isset($this->request->post['payment_pp_braintree_geo_zone_id'])) { + $data['payment_pp_braintree_geo_zone_id'] = $this->request->post['payment_pp_braintree_geo_zone_id']; + } else { + $data['payment_pp_braintree_geo_zone_id'] = $this->config->get('payment_pp_braintree_geo_zone_id'); + } + + if (isset($this->request->post['payment_pp_braintree_status'])) { + $data['payment_pp_braintree_status'] = $this->request->post['payment_pp_braintree_status']; + } else { + $data['payment_pp_braintree_status'] = $this->config->get('payment_pp_braintree_status'); + } + + if (isset($this->request->post['payment_pp_braintree_sort_order'])) { + $data['payment_pp_braintree_sort_order'] = $this->request->post['payment_pp_braintree_sort_order']; + } else { + $data['payment_pp_braintree_sort_order'] = $this->config->get('payment_pp_braintree_sort_order'); + } + + if (isset($this->request->post['payment_pp_braintree_account'])) { + $data['payment_pp_braintree_account'] = $this->request->post['payment_pp_braintree_account']; + } else { + $data['payment_pp_braintree_account'] = $this->config->get('payment_pp_braintree_account'); + } + + if (isset($this->request->post['payment_pp_braintree_authorization_expired_id'])) { + $data['payment_pp_braintree_authorization_expired_id'] = $this->request->post['payment_pp_braintree_authorization_expired_id']; + } else { + $data['payment_pp_braintree_authorization_expired_id'] = $this->config->get('payment_pp_braintree_authorization_expired_id'); + } + + if (isset($this->request->post['payment_pp_braintree_authorized_id'])) { + $data['payment_pp_braintree_authorized_id'] = $this->request->post['payment_pp_braintree_authorized_id']; + } else { + $data['payment_pp_braintree_authorized_id'] = $this->config->get('payment_pp_braintree_authorized_id'); + } + + if (isset($this->request->post['payment_pp_braintree_authorizing_id'])) { + $data['payment_pp_braintree_authorizing_id'] = $this->request->post['payment_pp_braintree_authorizing_id']; + } else { + $data['payment_pp_braintree_authorizing_id'] = $this->config->get('payment_pp_braintree_authorizing_id'); + } + + if (isset($this->request->post['payment_pp_braintree_settlement_pending_id'])) { + $data['payment_pp_braintree_settlement_pending_id'] = $this->request->post['payment_pp_braintree_settlement_pending_id']; + } else { + $data['payment_pp_braintree_settlement_pending_id'] = $this->config->get('payment_pp_braintree_settlement_pending_id'); + } + + if (isset($this->request->post['payment_pp_braintree_failed_id'])) { + $data['payment_pp_braintree_failed_id'] = $this->request->post['payment_pp_braintree_failed_id']; + } else { + $data['payment_pp_braintree_failed_id'] = $this->config->get('payment_pp_braintree_failed_id'); + } + + if (isset($this->request->post['payment_pp_braintree_gateway_rejected_id'])) { + $data['payment_pp_braintree_gateway_rejected_id'] = $this->request->post['payment_pp_braintree_gateway_rejected_id']; + } else { + $data['payment_pp_braintree_gateway_rejected_id'] = $this->config->get('payment_pp_braintree_gateway_rejected_id'); + } + + if (isset($this->request->post['payment_pp_braintree_processor_declined_id'])) { + $data['payment_pp_braintree_processor_declined_id'] = $this->request->post['payment_pp_braintree_processor_declined_id']; + } else { + $data['payment_pp_braintree_processor_declined_id'] = $this->config->get('payment_pp_braintree_processor_declined_id'); + } + + if (isset($this->request->post['payment_pp_braintree_settled_id'])) { + $data['payment_pp_braintree_settled_id'] = $this->request->post['payment_pp_braintree_settled_id']; + } else { + $data['payment_pp_braintree_settled_id'] = $this->config->get('payment_pp_braintree_settled_id'); + } + + if (isset($this->request->post['payment_pp_braintree_settling_id'])) { + $data['payment_pp_braintree_settling_id'] = $this->request->post['payment_pp_braintree_settling_id']; + } else { + $data['payment_pp_braintree_settling_id'] = $this->config->get('payment_pp_braintree_settling_id'); + } + + if (isset($this->request->post['payment_pp_braintree_submitted_for_settlement_id'])) { + $data['payment_pp_braintree_submitted_for_settlement_id'] = $this->request->post['payment_pp_braintree_submitted_for_settlement_id']; + } else { + $data['payment_pp_braintree_submitted_for_settlement_id'] = $this->config->get('payment_pp_braintree_submitted_for_settlement_id'); + } + + if (isset($this->request->post['payment_pp_braintree_voided_id'])) { + $data['payment_pp_braintree_voided_id'] = $this->request->post['payment_pp_braintree_voided_id']; + } else { + $data['payment_pp_braintree_voided_id'] = $this->config->get('payment_pp_braintree_voided_id'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_status'])) { + $data['payment_pp_braintree_3ds_status'] = $this->request->post['payment_pp_braintree_3ds_status']; + } else { + $data['payment_pp_braintree_3ds_status'] = $this->config->get('payment_pp_braintree_3ds_status'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_unsupported_card'])) { + $data['payment_pp_braintree_3ds_unsupported_card'] = $this->request->post['payment_pp_braintree_3ds_unsupported_card']; + } else { + $data['payment_pp_braintree_3ds_unsupported_card'] = $this->config->get('payment_pp_braintree_3ds_unsupported_card'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_lookup_error'])) { + $data['payment_pp_braintree_3ds_lookup_error'] = $this->request->post['payment_pp_braintree_3ds_lookup_error']; + } else { + $data['payment_pp_braintree_3ds_lookup_error'] = $this->config->get('payment_pp_braintree_3ds_lookup_error'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_lookup_enrolled'])) { + $data['payment_pp_braintree_3ds_lookup_enrolled'] = $this->request->post['payment_pp_braintree_3ds_lookup_enrolled']; + } else { + $data['payment_pp_braintree_3ds_lookup_enrolled'] = $this->config->get('payment_pp_braintree_3ds_lookup_enrolled'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_lookup_not_enrolled'])) { + $data['payment_pp_braintree_3ds_lookup_not_enrolled'] = $this->request->post['payment_pp_braintree_3ds_lookup_not_enrolled']; + } else { + $data['payment_pp_braintree_3ds_lookup_not_enrolled'] = $this->config->get('payment_pp_braintree_3ds_lookup_not_enrolled'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_not_participating'])) { + $data['payment_pp_braintree_3ds_not_participating'] = $this->request->post['payment_pp_braintree_3ds_not_participating']; + } else { + $data['payment_pp_braintree_3ds_not_participating'] = $this->config->get('payment_pp_braintree_3ds_not_participating'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_unavailable'])) { + $data['payment_pp_braintree_3ds_unavailable'] = $this->request->post['payment_pp_braintree_3ds_unavailable']; + } else { + $data['payment_pp_braintree_3ds_unavailable'] = $this->config->get('payment_pp_braintree_3ds_unavailable'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_signature_failed'])) { + $data['payment_pp_braintree_3ds_signature_failed'] = $this->request->post['payment_pp_braintree_3ds_signature_failed']; + } else { + $data['payment_pp_braintree_3ds_signature_failed'] = $this->config->get('payment_pp_braintree_3ds_signature_failed'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_successful'])) { + $data['payment_pp_braintree_3ds_successful'] = $this->request->post['payment_pp_braintree_3ds_successful']; + } else { + $data['payment_pp_braintree_3ds_successful'] = $this->config->get('payment_pp_braintree_3ds_successful'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_attempt_successful'])) { + $data['payment_pp_braintree_3ds_attempt_successful'] = $this->request->post['payment_pp_braintree_3ds_attempt_successful']; + } else { + $data['payment_pp_braintree_3ds_attempt_successful'] = $this->config->get('payment_pp_braintree_3ds_attempt_successful'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_failed'])) { + $data['payment_pp_braintree_3ds_failed'] = $this->request->post['payment_pp_braintree_3ds_failed']; + } else { + $data['payment_pp_braintree_3ds_failed'] = $this->config->get('payment_pp_braintree_3ds_failed'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_unable_to_auth'])) { + $data['payment_pp_braintree_3ds_unable_to_auth'] = $this->request->post['payment_pp_braintree_3ds_unable_to_auth']; + } else { + $data['payment_pp_braintree_3ds_unable_to_auth'] = $this->config->get('payment_pp_braintree_3ds_unable_to_auth'); + } + + if (isset($this->request->post['payment_pp_braintree_3ds_error'])) { + $data['payment_pp_braintree_3ds_error'] = $this->request->post['payment_pp_braintree_3ds_error']; + } else { + $data['payment_pp_braintree_3ds_error'] = $this->config->get('payment_pp_braintree_3ds_error'); + } + + if (isset($this->request->post['payment_pp_braintree_paypal_option'])) { + $data['payment_pp_braintree_paypal_option'] = $this->request->post['payment_pp_braintree_paypal_option']; + } else { + $data['payment_pp_braintree_paypal_option'] = $this->config->get('payment_pp_braintree_paypal_option'); + } + + if (isset($this->request->post['payment_pp_braintree_paypal_button_colour'])) { + $data['payment_pp_braintree_paypal_button_colour'] = $this->request->post['payment_pp_braintree_paypal_button_colour']; + } else { + $data['payment_pp_braintree_paypal_button_colour'] = $this->config->get('payment_pp_braintree_paypal_button_colour'); + } + + if (isset($this->request->post['payment_pp_braintree_paypal_button_size'])) { + $data['payment_pp_braintree_paypal_button_size'] = $this->request->post['payment_pp_braintree_paypal_button_size']; + } else { + $data['payment_pp_braintree_paypal_button_size'] = $this->config->get('payment_pp_braintree_paypal_button_size'); + } + + if (isset($this->request->post['payment_pp_braintree_paypal_button_shape'])) { + $data['payment_pp_braintree_paypal_button_shape'] = $this->request->post['payment_pp_braintree_paypal_button_shape']; + } else { + $data['payment_pp_braintree_paypal_button_shape'] = $this->config->get('payment_pp_braintree_paypal_button_shape'); + } + + if (isset($this->request->post['payment_pp_braintree_billing_agreement'])) { + $data['payment_pp_braintree_billing_agreement'] = $this->request->post['payment_pp_braintree_billing_agreement']; + } else { + $data['payment_pp_braintree_billing_agreement'] = $this->config->get('payment_pp_braintree_billing_agreement'); + } + + $data['transaction_statuses'] = array( + 'authorization_expired', + 'authorized', + 'authorizing', + 'settlement_pending', + 'failed', + 'gateway_rejected', + 'processor_declined', + 'settled', + 'settling', + 'submitted_for_settlement', + 'voided' + ); + + $data['card_types'] = array( + 'Visa', + 'MasterCard', + 'American Express', + 'Discover', + 'JCB', + 'Maestro' + ); + + if (isset($this->request->get['retrieve_code'])) { + $data['retrieve_code'] = $this->request->get['retrieve_code']; + + $curl = curl_init($this->opencart_retrieve_url); + + $post_data = array( + 'return_url' => $this->url->link('extension/payment/pp_braintree', 'user_token=' . $this->session->data['user_token'], true), + 'retrieve_code' => $this->request->get['retrieve_code'], + 'store_version' => VERSION, + ); + + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_FORBID_REUSE, 1); + curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); + + $curl_response = curl_exec($curl); + $config_response = json_decode($curl_response, true); + curl_close($curl); + + if (isset($config_response['merchant_id']) && isset($config_response['access_token']) && isset($config_response['refresh_token'])) { + $braintree_settings = $this->model_setting_setting->getSetting('payment_pp_braintree'); + $braintree_settings['payment_pp_braintree_merchant_id'] = $config_response['merchant_id']; + $braintree_settings['payment_pp_braintree_access_token'] = $config_response['access_token']; + $braintree_settings['payment_pp_braintree_refresh_token'] = $config_response['refresh_token']; + $braintree_settings['payment_pp_braintree_environment'] = $config_response['environment']; + $braintree_settings['payment_pp_braintree_public_key'] = ''; + $braintree_settings['payment_pp_braintree_private_key'] = ''; + + $this->model_setting_setting->editSetting('payment_pp_braintree', $braintree_settings); + + $data['payment_pp_braintree_merchant_id'] = $config_response['merchant_id']; + $data['payment_pp_braintree_access_token'] = $config_response['access_token']; + $data['payment_pp_braintree_refresh_token'] = $config_response['refresh_token']; + $data['payment_pp_braintree_environment'] = $config_response['environment']; + $data['payment_pp_braintree_public_key'] = ''; + $data['payment_pp_braintree_private_key'] = ''; + + $data['success'] = $this->language->get('text_success_connect'); + } + } + + $data['auth_connect_url'] = ''; + + // If Braintree is not setup yet, request auth token for merchant on-boarding flow + if ($data['payment_pp_braintree_merchant_id'] == '') { + $curl = curl_init($this->opencart_connect_url); + + $this->load->model('localisation/country'); + $country = $this->model_localisation_country->getCountry($this->config->get('config_country_id')); + + $post_data = array( + 'return_url' => $this->url->link('extension/payment/pp_braintree', 'user_token=' . $this->session->data['user_token'], true), + 'store_url' => HTTPS_CATALOG, + 'store_version' => VERSION, + 'store_country' => (isset($country['iso_code_3']) ? $country['iso_code_3'] : ''), + ); + + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_FORBID_REUSE, 1); + curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); + + $curl_response = curl_exec($curl); + + $curl_response = json_decode($curl_response, true); + + curl_close($curl); + + if ($curl_response['url']) { + $data['auth_connect_url'] = $curl_response['url']; + } + } + + $data['braintree_config'] = array(); + $data['braintree_config']['three_d_secure_enabled'] = 0; + $data['braintree_config']['paypal_enabled'] = 0; + + $data['error_braintree_account_3ds'] = $this->language->get('error_braintree_account_3ds'); + $data['error_braintree_account_paypal'] = $this->language->get('error_braintree_account_paypal'); + + // load the account info from braintree if the config has been added yet. + if (!empty($data['payment_pp_braintree_access_token']) || (!empty($data['payment_pp_braintree_environment']) && !empty($data['payment_pp_braintree_merchant_id']) && !empty($data['payment_pp_braintree_public_key']) && !empty($data['payment_pp_braintree_private_key']))) { + $this->initialise($data['payment_pp_braintree_access_token'], array( + 'payment_pp_braintree_environment' => $data['payment_pp_braintree_environment'], + 'payment_pp_braintree_merchant_id' => $data['payment_pp_braintree_merchant_id'], + 'payment_pp_braintree_public_key' => $data['payment_pp_braintree_public_key'], + 'payment_pp_braintree_private_key' => $data['payment_pp_braintree_private_key'], + )); + + $verify_credentials = $this->model_extension_payment_pp_braintree->verifyCredentials($this->gateway); + + if (!$verify_credentials) { + $this->error['warning'] = $this->language->get('error_connection'); + } else { + $merchant_config = json_decode(base64_decode($verify_credentials), true); + + if (isset($merchant_config['threeDSecureEnabled']) && $merchant_config['threeDSecureEnabled'] == 1) { + $data['braintree_config']['three_d_secure_enabled'] = 1; + } + + if (isset($merchant_config['paypalEnabled']) && $merchant_config['paypalEnabled'] == 1) { + $data['braintree_config']['paypal_enabled'] = 1; + } + } + } + + $data['header'] = $this->load->controller('common/header'); + $data['column_left'] = $this->load->controller('common/column_left'); + $data['footer'] = $this->load->controller('common/footer'); + + $this->response->setOutput($this->load->view('extension/payment/pp_braintree', $data)); + } + + public function install() { + $this->load->model('setting/setting'); + + $defaults = array(); + + // 3D secure defaults + $defaults['payment_pp_braintree_3ds_unsupported_card'] = 1; + $defaults['payment_pp_braintree_3ds_lookup_error'] = 1; + $defaults['payment_pp_braintree_3ds_lookup_enrolled'] = 1; + $defaults['payment_pp_braintree_3ds_lookup_not_enrolled'] = 1; + $defaults['payment_pp_braintree_3ds_not_participating'] = 1; + $defaults['payment_pp_braintree_3ds_unavailable'] = 1; + $defaults['payment_pp_braintree_3ds_signature_failed'] = 0; + $defaults['payment_pp_braintree_3ds_successful'] = 1; + $defaults['payment_pp_braintree_3ds_attempt_successful'] = 1; + $defaults['payment_pp_braintree_3ds_failed'] = 0; + $defaults['payment_pp_braintree_3ds_unable_to_auth'] = 1; + $defaults['payment_pp_braintree_3ds_error'] = 1; + + // Order Status defaults + $defaults['payment_pp_braintree_authorization_expired_id'] = 14; + $defaults['payment_pp_braintree_authorized_id'] = 2; + $defaults['payment_pp_braintree_authorizing_id'] = 1; + $defaults['payment_pp_braintree_failed_id'] = 10; + $defaults['payment_pp_braintree_gateway_rejected_id'] = 8; + $defaults['payment_pp_braintree_processor_declined_id'] = 8; + $defaults['payment_pp_braintree_settled_id'] = 2; + $defaults['payment_pp_braintree_settling_id'] = 2; + $defaults['payment_pp_braintree_settlement_pending_id'] = 2; + $defaults['payment_pp_braintree_submitted_for_settlement_id'] = 2; + $defaults['payment_pp_braintree_voided_id'] = 16; + + $defaults['payment_pp_braintree_settlement_immediate'] = 1; + + // PayPal options + $defaults['payment_pp_braintree_paypal_option'] = 1; + $defaults['payment_pp_braintree_paypal_button_size'] = 'small'; + $defaults['payment_pp_braintree_paypal_button_shape'] = 'rect'; + + // Vault options + $defaults['payment_pp_braintree_card_vault'] = 1; + $defaults['payment_pp_braintree_paypal_vault'] = 0; + $defaults['payment_pp_braintree_card_check_vault'] = 1; + $defaults['payment_pp_braintree_paypal_check_vault'] = 0; + + $this->model_setting_setting->editSetting('payment_pp_braintree', $defaults); + } + + public function order() { + $this->load->language('extension/payment/pp_braintree'); + + $data['user_token'] = $this->session->data['user_token']; + + $data['order_id'] = $this->request->get['order_id']; + + return $this->load->view('extension/payment/pp_braintree_order', $data); + } + + public function getTransaction() { + $this->load->language('extension/payment/pp_braintree'); + + $this->load->model('extension/payment/pp_braintree'); + $this->load->model('sale/order'); + + if (!$this->config->get('payment_pp_braintree_status') || (!isset($this->request->get['order_id']) && !isset($this->request->get['transaction_id']))) { + return; + } + + $this->initialise($this->config->get('payment_pp_braintree_access_token'), array( + 'payment_pp_braintree_environment' => $this->config->get('payment_pp_braintree_environment'), + 'payment_pp_braintree_merchant_id' => $this->config->get('payment_pp_braintree_merchant_id'), + 'payment_pp_braintree_public_key' => $this->config->get('payment_pp_braintree_public_key'), + 'payment_pp_braintree_private_key' => $this->config->get('payment_pp_braintree_private_key') + )); + + if (isset($this->request->get['order_id'])) { + $search = array( + Braintree_TransactionSearch::orderId()->is($this->request->get['order_id']) + ); + } elseif (isset($this->request->get['transaction_id'])) { + $search = array( + Braintree_TransactionSearch::id()->is($this->request->get['transaction_id']) + ); + } + + $search_transactions = $this->model_extension_payment_pp_braintree->getTransactions($this->gateway, $search); + + $transaction = array(); + + foreach ($search_transactions as $search_transaction) { + $transaction = $search_transaction; + } + + $data['transaction'] = array(); + + if ($transaction) { + $data['transaction_id'] = $transaction->id; + + $data['user_token'] = $this->session->data['user_token']; + + $data['void_action'] = $data['settle_action'] = $data['refund_action'] = false; + + switch ($transaction->status) { + case 'authorized': + $data['void_action'] = true; + $data['settle_action'] = true; + break; + case 'submitted_for_settlement': + $data['void_action'] = true; + break; + case 'settling': + $data['refund_action'] = true; + break; + case 'settled': + $data['refund_action'] = true; + break; + } + + $statuses = array(); + + foreach ($transaction->statusHistory as $status_history) { + $created_at = $status_history->timestamp; + + $statuses[] = array( + 'status' => $status_history->status, + 'date_added' => date($this->language->get('datetime_format'), strtotime($created_at->format('Y-m-d H:i:s e'))) + ); + } + + $data['statuses'] = $statuses; + + $max_settle_amount = $transaction->amount; + + $max_refund_amount = $transaction->amount; + + $data['refunds'] = array(); + + foreach (array_reverse($transaction->refundIds) as $refund_id) { + $refund = $this->model_extension_payment_pp_braintree->getTransaction($this->gateway, $refund_id); + + $successful_statuses = array( + 'authorized', + 'authorizing', + 'settlement_pending', + 'settlement_confirmed', + 'settled', + 'settling', + 'submitted_for_settlement' + ); + + if (in_array($refund->status, $successful_statuses)) { + $max_refund_amount -= $refund->amount; + } + + $created_at = $refund->createdAt; + + $data['refunds'][] = array( + 'date_added' => date($this->language->get('datetime_format'), strtotime($created_at->format('Y-m-d H:i:s e'))), + 'amount' => $this->currency->format($refund->amount, $refund->currencyIsoCode, '1.00000000', true), + 'status' => $refund->status + ); + } + + //If nothing left to refund, disable refund action + if (!$max_refund_amount) { + $data['refund_action'] = false; + } + + $data['max_settle_amount'] = $this->currency->format($max_settle_amount, $transaction->currencyIsoCode, '1.00000000', false); + + $data['max_refund_amount'] = $this->currency->format($max_refund_amount, $transaction->currencyIsoCode, '1.00000000', false); + + $amount = $this->currency->format($transaction->amount, $transaction->currencyIsoCode, '1.00000000', true); + + $data['symbol_left'] = $this->currency->getSymbolLeft($transaction->currencyIsoCode); + $data['symbol_right'] = $this->currency->getSymbolRight($transaction->currencyIsoCode); + + $created_at = $transaction->createdAt; + + if ($transaction->threeDSecureInfo) { + if ($transaction->threeDSecureInfo->liabilityShifted) { + $liability_shifted = $this->language->get('text_yes'); + } else { + $liability_shifted = $this->language->get('text_no'); + } + } + + if ($transaction->threeDSecureInfo) { + if ($transaction->threeDSecureInfo->liabilityShiftPossible) { + $liability_shift_possible = $this->language->get('text_yes'); + } else { + $liability_shift_possible = $this->language->get('text_no'); + } + } + + $data['transaction'] = array( + 'status' => $transaction->status, + 'transaction_id' => $transaction->id, + 'type' => $transaction->type, + 'date_added' => date($this->language->get('datetime_format'), strtotime($created_at->format('Y-m-d H:i:s e'))), + 'merchant_account_id' => $transaction->merchantAccountId, + 'payment_type' => $transaction->paymentInstrumentType, + 'currency' => $transaction->currencyIsoCode, + 'amount' => $amount, + 'order_id' => $transaction->orderId, + 'processor_code' => $transaction->processorAuthorizationCode, + 'cvv_response' => $transaction->cvvResponseCode, + 'avs_response' => sprintf($this->language->get('text_avs_response'), $transaction->avsStreetAddressResponseCode, $transaction->avsPostalCodeResponseCode), + 'threeds_enrolled' => ($transaction->threeDSecureInfo ? $transaction->threeDSecureInfo->enrolled : ''), + 'threeds_status' => ($transaction->threeDSecureInfo ? $transaction->threeDSecureInfo->status : ''), + 'threeds_shifted' => ($transaction->threeDSecureInfo ? $liability_shifted : ''), + 'threeds_shift_possible' => ($transaction->threeDSecureInfo ? $liability_shift_possible : '') + ); + + $data['text_confirm_void'] = $this->language->get('text_confirm_void'); + $data['text_confirm_settle'] = $this->language->get('text_confirm_settle'); + $data['text_confirm_refund'] = $this->language->get('text_confirm_refund'); + + $this->response->setOutput($this->load->view('extension/payment/pp_braintree_order_ajax', $data)); + } + } + + public function transactionCommand() { + $this->load->language('extension/payment/pp_braintree'); + + $this->load->model('extension/payment/pp_braintree'); + + $this->initialise($this->config->get('payment_pp_braintree_access_token'), array( + 'payment_pp_braintree_environment' => $this->config->get('payment_pp_braintree_environment'), + 'payment_pp_braintree_merchant_id' => $this->config->get('payment_pp_braintree_merchant_id'), + 'payment_pp_braintree_public_key' => $this->config->get('payment_pp_braintree_public_key'), + 'payment_pp_braintree_private_key' => $this->config->get('payment_pp_braintree_private_key') + )); + + $json = array(); + + $success = $error = ''; + + if ($this->request->post['type'] == 'void') { + $action = $this->model_extension_payment_pp_braintree->voidTransaction($this->gateway, $this->request->post['transaction_id']); + } elseif ($this->request->post['type'] == 'settle' && $this->request->post['amount']) { + $action = $this->model_extension_payment_pp_braintree->settleTransaction($this->gateway, $this->request->post['transaction_id'], $this->request->post['amount']); + } elseif ($this->request->post['type'] == 'refund' && $this->request->post['amount']) { + $action = $this->model_extension_payment_pp_braintree->refundTransaction($this->gateway, $this->request->post['transaction_id'], $this->request->post['amount']); + } else { + $error = true; + } + + if (!$error && $action && $action->success) { + $success = $this->language->get('text_success_action'); + } elseif (!$error && $action && isset($action->message)) { + $error = sprintf($this->language->get('text_error_settle'), $action->message); + } else { + $error = $this->language->get('text_error_generic'); + } + + $json['success'] = $success; + $json['error'] = $error; + + $this->response->addHeader('Content-Type: application/json'); + $this->response->setOutput(json_encode($json)); + } + + public function search() { + $this->load->language('extension/payment/pp_braintree'); + + $this->load->model('extension/payment/pp_braintree'); + $this->load->model('customer/customer'); + $this->load->model('sale/order'); + + $this->initialise($this->config->get('payment_pp_braintree_access_token'), array( + 'payment_pp_braintree_environment' => $this->config->get('payment_pp_braintree_environment'), + 'payment_pp_braintree_merchant_id' => $this->config->get('payment_pp_braintree_merchant_id'), + 'payment_pp_braintree_public_key' => $this->config->get('payment_pp_braintree_public_key'), + 'payment_pp_braintree_private_key' => $this->config->get('payment_pp_braintree_private_key') + )); + + $json = array(); + + $success = $error = ''; + + if (isset($this->request->get['filter_transaction_id'])) { + $filter_transaction_id = $this->request->get['filter_transaction_id']; + } else { + $filter_transaction_id = null; + } + + if (isset($this->request->get['filter_transaction_type'])) { + $filter_transaction_type = $this->request->get['filter_transaction_type']; + } else { + $filter_transaction_type = null; + } + + if (isset($this->request->get['filter_payment_type'])) { + $filter_payment_type = $this->request->get['filter_payment_type']; + } else { + $filter_payment_type = null; + } + + if (isset($this->request->get['filter_card_type'])) { + $filter_card_type = $this->request->get['filter_card_type']; + } else { + $filter_card_type = null; + } + + if (isset($this->request->get['filter_merchant_account_id'])) { + $filter_merchant_account_id = $this->request->get['filter_merchant_account_id']; + } else { + $filter_merchant_account_id = null; + } + + if (isset($this->request->get['filter_transaction_status'])) { + $filter_transaction_status = $this->request->get['filter_transaction_status']; + } else { + $filter_transaction_status = null; + } + + if (isset($this->request->get['filter_date_from'])) { + $filter_date_from = $this->request->get['filter_date_from']; + } else { + $filter_date_from = null; + } + + if (isset($this->request->get['filter_date_to'])) { + $filter_date_to = $this->request->get['filter_date_to']; + } else { + $filter_date_to = null; + } + + if (isset($this->request->get['filter_amount_from'])) { + $filter_amount_from = $this->request->get['filter_amount_from']; + } else { + $filter_amount_from = null; + } + + if (isset($this->request->get['filter_amount_to'])) { + $filter_amount_to = $this->request->get['filter_amount_to']; + } else { + $filter_amount_to = null; + } + + $json['transactions'] = array(); + + $search = array(); + + if ($filter_transaction_id) { + $search[] = Braintree_TransactionSearch::id()->is($filter_transaction_id); + } + + if ($filter_transaction_type) { + if ($filter_transaction_type == 'sale') { + $transaction_type = Braintree_Transaction::SALE; + } elseif ($filter_transaction_type == 'credit') { + $transaction_type = Braintree_Transaction::CREDIT; + } + + $search[] = Braintree_TransactionSearch::type()->is($transaction_type); + } + + if ($filter_payment_type) { + if ($filter_payment_type == 'Credit Card') { + $payment_type = 'CreditCardDetail'; + } elseif ($filter_payment_type == 'PayPal') { + $payment_type = 'PayPalDetail'; + } + + $search[] = Braintree_TransactionSearch::paymentInstrumentType()->is($payment_type); + } + + if ($filter_card_type) { + switch ($filter_card_type) { + case 'Visa': + $card_type = Braintree_CreditCard::VISA; + break; + case 'MasterCard': + $card_type = Braintree_CreditCard::MASTER_CARD; + break; + case 'American Express': + $card_type = Braintree_CreditCard::AMEX; + break; + case 'Discover': + $card_type = Braintree_CreditCard::DISCOVER; + break; + case 'JCB': + $card_type = Braintree_CreditCard::JCB; + break; + case 'Maestro': + $card_type = Braintree_CreditCard::MAESTRO; + break; + } + + $search[] = Braintree_TransactionSearch::creditCardCardType()->is($card_type); + } + + if ($filter_merchant_account_id) { + $search[] = Braintree_TransactionSearch::merchantAccountId()->is($filter_merchant_account_id); + } + + if ($filter_transaction_status) { + $search[] = Braintree_TransactionSearch::status()->in($filter_transaction_status); + } + + if ($filter_date_from || $filter_date_to) { + if ($filter_date_from) { + $date_from = new DateTime($filter_date_from); + } else { + $date_from = new DateTime('2012-01-01 00:00'); + } + + if ($filter_date_to) { + $date_to = new DateTime($filter_date_to . ' +1 day -1 minute'); + } else { + $date_to = new DateTime('tomorrow -1 minute'); + } + + $search[] = Braintree_TransactionSearch::createdAt()->between($date_from, $date_to); + } + + if ($filter_amount_from) { + $amount_from = $filter_amount_from; + } else { + $amount_from = 0; + } + + if ($filter_amount_to) { + $amount_to = $filter_amount_to; + } else { + $amount_to = 9999999; + } + + $search[] = Braintree_TransactionSearch::amount()->between((float)$amount_from, (float)$amount_to); + + $transactions = $this->model_extension_payment_pp_braintree->getTransactions($this->gateway, $search); + + if ($transactions) { + foreach ($transactions as $transaction) { + $customer_url = false; + + if ($transaction->customer['id']) { + $braintree_customer_id = explode('_', $transaction->customer['id']); + + if (isset($braintree_customer_id[2]) && is_numeric($braintree_customer_id[2])) { + $customer_info = $this->model_customer_customer->getCustomer($braintree_customer_id[2]); + + if ($customer_info && $customer_info['email'] == $transaction->customer['email']) { + $customer_url = $this->url->link('sale/customer/edit', 'user_token=' . $this->session->data['user_token'] . '&customer_id=' . (int)$braintree_customer_id[2], true); + } + } + } + + $order = false; + + if ($transaction->orderId) { + $order_info = $this->model_sale_order->getOrder($transaction->orderId); + + if ($order_info && $order_info['email'] == $transaction->customer['email']) { + $order = $this->url->link('sale/order/info', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . (int)$transaction->orderId, true); + } + } + + $created_at = $transaction->createdAt; + + $json['transactions'][] = array( + 'transaction_id' => $transaction->id, + 'amount' => $transaction->amount, + 'currency_iso' => $transaction->currencyIsoCode, + 'status' => $transaction->status, + 'type' => $transaction->type, + 'merchant_account_id' => $transaction->merchantAccountId, + 'customer' => $transaction->customer['firstName'] . ' ' . $transaction->customer['lastName'], + 'customer_url' => $customer_url, + 'order' => $order, + 'date_added' => date($this->language->get('datetime_format'), strtotime($created_at->format('Y-m-d H:i:s e'))) + ); + } + } + + $this->response->addHeader('Content-Type: application/json'); + $this->response->setOutput(json_encode($json)); + } + + public function connectRedirect() { + if ($this->user->hasPermission('modify', 'extension/extension/payment')) { + // Install the module before doing the redirect + $this->load->model('setting/extension'); + + $this->model_setting_extension->install('payment', 'pp_braintree'); + + $this->install(); + + $curl = curl_init($this->opencart_connect_url); + + $this->load->model('localisation/country'); + $country = $this->model_localisation_country->getCountry($this->config->get('config_country_id')); + + $post_data = array( + 'return_url' => $this->url->link('extension/payment/pp_braintree', 'user_token=' . $this->session->data['user_token'], true), + 'store_url' => HTTPS_CATALOG, + 'store_version' => VERSION, + 'store_country' => (isset($country['iso_code_3']) ? $country['iso_code_3'] : ''), + ); + + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_FORBID_REUSE, 1); + curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); + + $curl_response = curl_exec($curl); + + $curl_response = json_decode($curl_response, true); + + curl_close($curl); + + if ($curl_response['url']) { + $this->response->redirect($curl_response['url']); + } else { + $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'], true)); + } + } else { + $this->response->redirect($this->url->link('error/permission', 'user_token=' . $this->session->data['user_token'], true)); + } + } + + public function promotion() { + $this->load->language('extension/payment/pp_braintree'); + + $data['connect_link'] = ''; + $data['module_link'] = ''; + + if ($this->config->get('payment_pp_braintree_status') || $this->config->get('payment_pp_braintree_merchant_id') || $this->config->get('payment_pp_braintree_access_token')) { + $data['module_link'] = $this->url->link('extension/payment/pp_braintree', 'user_token=' . $this->session->data['user_token'], true); + } else { + if ($this->user->hasPermission('modify', 'extension/extension/payment')) { + $data['connect_link'] = $this->url->link('extension/payment/pp_braintree/connectRedirect', 'user_token=' . $this->session->data['user_token'], true); + } + } + + if ($this->config->get("payment_pp_braintree_status") == 1) { + $data['payment_pp_braintree_status'] = "enabled"; + } elseif ($this->config->get("payment_pp_braintree_status") == null) { + $data['payment_pp_braintree_status'] = ""; + } else { + $data['payment_pp_braintree_status'] = "disabled"; + } + + return $this->load->view('extension/payment/pp_braintree_promotion', $data); + } + + protected function validate() { + $this->load->model('extension/payment/pp_braintree'); + + $check_credentials = true; + + if (version_compare(phpversion(), '5.4.0', '<')) { + $this->error['warning'] = $this->language->get('error_php_version'); + } + + if (!$this->user->hasPermission('modify', 'extension/payment/pp_braintree')) { + $this->error['warning'] = $this->language->get('error_permission'); + + $check_credentials = false; + } + + if ($check_credentials && $this->request->post['payment_pp_braintree_status'] == 1) { + $this->initialise($this->request->post['payment_pp_braintree_access_token'], array( + 'payment_pp_braintree_environment' => $this->request->post['payment_pp_braintree_environment'], + 'payment_pp_braintree_merchant_id' => $this->request->post['payment_pp_braintree_merchant_id'], + 'payment_pp_braintree_public_key' => $this->request->post['payment_pp_braintree_public_key'], + 'payment_pp_braintree_private_key' => $this->request->post['payment_pp_braintree_private_key'], + )); + + $verify_credentials = $this->model_extension_payment_pp_braintree->verifyCredentials($this->gateway); + + if (!$verify_credentials) { + $this->error['warning'] = $this->language->get('error_connection'); + } else { + foreach ($this->request->post['payment_pp_braintree_account'] as $currency => $pp_braintree_account) { + if (!empty($pp_braintree_account['merchant_account_id'])) { + $verify_merchant_account_id = $this->model_extension_payment_pp_braintree->verifyMerchantAccount($this->gateway, $pp_braintree_account['merchant_account_id']); + + if (!$verify_merchant_account_id) { + $this->error['account'][$currency] = $this->language->get('error_account'); + } + } + } + + $merchant_config = json_decode(base64_decode($verify_credentials), true); + + // verify the Braintree account is ready to accept 3DS transactions + if (isset($merchant_config['threeDSecureEnabled']) && ($this->request->post['payment_pp_braintree_3ds_status'] == 1 && $merchant_config['threeDSecureEnabled'] != 1)) { + $this->error['warning'] = $this->language->get('error_3ds_not_ready'); + } + + // verify the Braintree account is ready to use PayPal Billing Agreements + if (isset($merchant_config['paypal']['billingAgreementEnabled']) && ($this->request->post['payment_pp_braintree_billing_agreement'] == 1 && $merchant_config['paypal']['billingAgreementEnabled'] != 1)) { + $this->error['warning'] = $this->language->get('error_paypal_billing_not_ready'); + } + + // verify the Braintree account is ready to accept PayPal transactions + if (isset($merchant_config['paypalEnabled']) && ($this->request->post['payment_pp_braintree_paypal_option'] == 1 && $merchant_config['paypalEnabled'] != 1)) { + $this->error['warning'] = $this->language->get('error_paypal_not_ready'); + } + + // verify the environment matches with the token the system is using + if (isset($merchant_config['environment']) && ($this->request->post['payment_pp_braintree_environment'] != $merchant_config['environment'])) { + $this->error['warning'] = sprintf($this->language->get('error_environment'), $this->request->post['payment_pp_braintree_environment'], $merchant_config['environment']); + } + } + } + + if ($this->error && !isset($this->error['warning'])) { + $this->error['warning'] = $this->language->get('error_warning'); + } + + return !$this->error; + } + + private function initialise($access_token = '', $credentials = array()) { + $this->load->model('extension/payment/pp_braintree'); + + if ($access_token != '') { + $this->gateway = $this->model_extension_payment_pp_braintree->setGateway($access_token); + } else { + Braintree_Configuration::environment(isset($credentials['payment_pp_braintree_environment']) ? $credentials['payment_pp_braintree_environment'] : ''); + Braintree_Configuration::merchantId(isset($credentials['payment_pp_braintree_merchant_id']) ? $credentials['payment_pp_braintree_merchant_id'] : ''); + Braintree_Configuration::publicKey(isset($credentials['payment_pp_braintree_public_key']) ? $credentials['payment_pp_braintree_public_key'] : ''); + Braintree_Configuration::privateKey(isset($credentials['payment_pp_braintree_private_key']) ? $credentials['payment_pp_braintree_private_key'] : ''); + } + } +} |