braintree / braintree_php

Braintree PHP library
https://developer.paypal.com/braintree/docs/start/overview
MIT License
545 stars 225 forks source link

Fatal error: Uncaught Error: Class 'Braintree_Configuration' not found #277

Closed irun4ik78 closed 4 years ago

irun4ik78 commented 4 years ago

I just updated from v5.0.0 to 5.1.0 and when I try to enable the module, I'm getting a blank page with the following error: Fatal error: Uncaught Error: Class 'Braintree_Configuration' not found in ~/ocart/admin/controller/extension/payment/pp_braintree.php:1126 Stack trace: #0 ~/ocart/admin/controller/extension/payment/pp_braintree.php(474): ControllerExtensionPaymentPPBraintree->initialise('', Array) #1 ~/ocart/vqmod/vqcache/vq2-vqmod_ocartdata_storage_modification_system_engine_action.php(79): ControllerExtensionPaymentPPBraintree->index() #2 ~/ocart/admin/controller/startup/router.php(26): Action->execute(Object(Registry), Array) #3 ~/ocart/vqmod/vqcache/vq2-vqmod_ocartdata_storage_modification_system_engine_action.php(79): ControllerStartupRouter->index() #4 ~/ocart/system/engine/router.php(67): Action->execute(Object(Registry)) #5~/ocart/system/engine/router.php(56): Router->execute(Object(Action)) #6 ~/ocart/system/framework.php(168): Rout in ~/ocart/admin/controller/extension/payment/pp_braintree.php on line 1126

Any help is appreciated. Thanks in advance.

hollabaq86 commented 4 years ago

👋 @irun4ik78 we don't own ocart or the pp_braintree.php module, and can't provide support for them. If you can share an example that we can reproduce within our SDK, we'll be happy to revisit and investigate further. Otherwise, we recommend following up with the developer/s for ocart for assistance.

irun4ik78 commented 4 years ago

I was able to successfully install v4.7.0 of your sdk. Beyond that version, it starts throwing an error. Here are the contents of my pp_braintree.php file: `<?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'] : '');
    }
}

} `

crookedneighbor commented 4 years ago

v5 drops the old underscore namespacing. See https://github.com/braintree/braintree_php/blob/master/CHANGELOG.md#500

Changing Braintree_Configuration to Braintree\Configuration will probably be enough to fix it.

irun4ik78 commented 4 years ago

With that changed now I'm geting another error: Fatal error: Uncaught Error: Class 'Braintree_ClientToken' not found in ~/ocart/admin/model/extension/payment/pp_braintree.php:125 Stack trace: #0 ~/ocart/vqmod/vqcache/vq2-_modification_system_engine_loader.php(248): ModelExtensionPaymentPPBraintree->verifyCredentials(NULL) #1 ~/ocart/system/engine/proxy.php(47): Loader->{closure}(Array, Array) #2 ~/ocart/admin/controller/extension/payment/pp_braintree.php(477): Proxy->__call('verifyCredentia...', Array) #3 ~/ocart/vqmod/vqcache/vq2-_storage_modification_system_engine_action.php(79): ControllerExtensionPaymentPPBraintree->index() #4 ~/ocart/admin/controller/startup/router.php(26): Action->execute(Object(Registry), Array) #5 ~/ocart/vqmod/vqcache/vq2-_storage_modification_system_engine_action.php(79): ControllerStartupRouter->index() #6 /~ in ~/ocart/admin/model/extension/payment/pp_braintree.php on line 125

crookedneighbor commented 4 years ago

Same thing. All instances of Braintree_* need to be swapped out for Braintree\*. A guide for this can be found at: https://developers.braintreepayments.com/reference/general/server-sdk-migration-guide/php#psr-4-namespacing

This is not an issue with the SDK. If you need further help, please reach out to our support team. https://help.braintreepayments.com/

crookedneighbor commented 4 years ago

Typo (corrected in original post). Should be:

All instances of Braintree_* need to be swapped out for Braintree\*.

irun4ik78 commented 4 years ago

I changed all the instances of Braintree_* in that file like you said, but the error is still there. There must be something else.

hollabaq86 commented 4 years ago

Hi @irun4ik78 real quick, we just released v 5.2.0 which fixes an issue where we had missed the change to PSR-4 namespacing for a very specific Exception case. Could I trouble you to update your integration to v5.2.0 and see if you get the same error message? I'm curious if you might be encountering this error because of that issue.

irun4ik78 commented 4 years ago

I updated my files but still getting the same error: Fatal error: Uncaught Error: Class 'Braintree_ClientToken' not found in ~/ocart/admin/model/extension/payment/pp_braintree.php:125 Stack trace: #0 ~/ocart/vqmod/vqcache/vq2-_modification_system_engine_loader.php(248): ModelExtensionPaymentPPBraintree->verifyCredentials(NULL) #1 ~/ocart/system/engine/proxy.php(47): Loader->{closure}(Array, Array) #2 ~/ocart/admin/controller/extension/payment/pp_braintree.php(477): Proxy->__call('verifyCredentia...', Array) #3 ~/ocart/vqmod/vqcache/vq2-_storage_modification_system_engine_action.php(79): ControllerExtensionPaymentPPBraintree->index() #4 ~/ocart/admin/controller/startup/router.php(26): Action->execute(Object(Registry), Array) #5 /ocart/vqmod/vqcache/vq2-_storage_modification_system_engine_action.php(79): ControllerStartupRouter->index() #6 / in ~/ocart/admin/model/extension/payment/pp_braintree.php on line 125

irun4ik78 commented 4 years ago

I don't even have Class 'Braintree_ClientToken' in my pp_braintree.php.

crookedneighbor commented 4 years ago

Then you must have it in some other file that the pp_braintree.php file is referencing.

Going to lock this issue, since this is not an issue with the SDK. If you need further help, you can reach out to our support team. https://help.braintreepayments.com/