Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Помогите исправить ошибку.


Recommended Posts

На osStore 1.5.5.1.2

В оформлении заказа, после нажатия Подтвердить на последнем пункте. Вылетают такие ошибки:

Fatal error: Cannot re-assign $this in X:\openserver\OpenServer\domains\localhost\system\library\rbs.php on line 109

<?php
/**
 * Интеграция платежного шлюза RBS с OpenCart
 */
class RBS {
    /** @var string $test       Адрес тестового шлюза */
    private $test_url = 'https://3dsec.sberbank.ru/payment/rest/';

    /** @var string $prod_url   Адрес боевого шлюза*/
    private $prod_url = 'https://securepayments.sberbank.ru/payment/rest/';

    /** @var string $language   Версия страницы оплаты*/
    private $language = 'ru';

    private $defaultMeasurement = "шт";

    /** @var string $version    Версия плагина*/
    private $version = '2.2.0';

    /** @var string $login      Логин продавца*/
    private $login;

    /** @var string $password   Пароль продавца */
    private $password;

    /** @var string $mode       Режим работы модуля (test/prod) */
    private $mode;

    /** @var string $stage      Стадийность платежа (one/two) */
    private $stage;

    /** @var boolean $logging   Логгирование (1/0) */
    private $logging;

    /** @var string $currency   Числовой код валюты в ISO 4217 */
    private $currency;

    private $ofd_status;
    private $ffd_version;
    private $paymentMethodType;
    private $paymentObjectType;

    /** @var integer $taxSystem  Код системы налогообложения */
    public $taxSystem;
    public $taxType;

    public $discountHelper;

    public function __construct()
    {
        $this->library('rbs_discount');
        $this->discountHelper = new rbsDiscount();
    }

    /**
     * @return mixed
     */
    public function getFFDVersion()
    {
        return $this->ffd_version;
    }

    /**
     * @return mixed
     */
    public function getPaymentMethodType()
    {
        return $this->paymentMethodType;
    }

    /**
     * @return mixed
     */
    public function getPaymentObjectType()
    {
        return $this->paymentObjectType;
    }

    /**
     * @return string
     */
    public function getDefaultMeasurement()
    {
        return $this->defaultMeasurement;
    }


    /**
     * Магический метод, который заполняет инстанс
     *
     * @param $property
     * @param $value
     * @return $this
     */
    public function __set($property, $value) {
        if (property_exists($this, $property)) {
            $this->$property = $value;
        }
        return $this;
    }

    /**
     * Формирование запроса в платежный шлюз и парсинг JSON-ответа
     *
     * @param string $method Метод запроса в ПШ
     * @param mixed[] $this->data Данные в запросе
     * @return mixed[]
     */
/* LINE 109:*/    private function gateway($method, $this->data) {

        // Добавления логина и пароля продавца к каждому запросу
        $this->data['userName'] = $this->login;
        $this->data['password'] = $this->password;
        $this->data['language'] = $this->language;

        // Выбор адреса ПШ в зависимости от выбранного режима
        if ($this->mode == 'test') {
            $url = $this->test_url;
        } else {
            $url = $this->prod_url;
        }

        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url.$method,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_POSTFIELDS => http_build_query($this->data, '', '&'),
            CURLOPT_HTTPHEADER => array('CMS: OpenCart 2.1.x', 'Module-Version: ' . $this->version),
        ));

        $response = curl_exec($curl);

        if ($this->logging) {
            $this->logger($url, $method, $data, $response);
        }
        $response = json_decode($response, true);
        curl_close($curl);

        return $response;
    }

    /**
     * Логирование запроса и ответа от ПШ
     *
     * @param string $url
     * @param string $method
     * @param mixed[] $request
     * @param mixed[] $response
     * @return integer
     */
    private function logger($url, $method, $request, $response) {
        $this->library('log');
        $logger = new Log('rbs_payment.log');
        $logger->write("RBS PAYMENT: ".$url.$method."\nREQUEST: ".json_encode($request). "\nRESPONSE: ".$response."\n\n");
    }

    /**
     * Регистрация заказа в ПШ
     *
     * @param string $order_number Номер заказа в магазине
     * @param integer $amount Сумма заказа
     * @param string $return_url Страница в магазине, на которую необходимо вернуть пользователя
     * @param null $orderBundle
     * @return mixed[] Ответ ПШ
     */
    public function register_order($order_number, $amount, $return_url, $orderBundle = null) {

        $this->data = array(
            'orderNumber' => $order_number . "_". time(),
            'amount' => $amount,
            'returnUrl' => $return_url,
            'jsonParams' => json_encode(
                [
                    'CMS:' => 'Opencart 2.1.x',
                    'Module-Version: ' =>  $this->version
                ]
            ),
        );
        if ($this->currency != 0) {
            $this->data['currency'] = $this->currency;
        }

        if ($this->ofd_status && !empty($orderBundle)) {
            $this->data['taxSystem'] = $this->taxSystem;

            $this->data['orderBundle']['orderCreationDate'] = date('c');
            $this->data['orderBundle'] = json_encode($orderBundle);
        }


        return $this->gateway($this->stage == 'two' ? 'registerPreAuth.do' : 'register.do', $this->data);
    }

    /**
     * Статус заказа в ПШ
     *
     * @param string $orderId Идентификатор заказа в ПШ
     * @return mixed[] Ответ ПШ
     */
    public function get_order_status($orderId) {
        return $this->gateway('getOrderStatusExtended.do', array('orderId' => $orderId));
    }

    /**
     * В версии 2.1 нет метода Loader::library()
     * Своя реализация
     * @param $library
     */
    private function library($library) {
        $file = DIR_SYSTEM . 'library/' . str_replace('../', '', (string)$library) . '.php';

        if (file_exists($file)) {
            include_once($file);
        } else {
            trigger_error('Error: Could not load library ' . $file . '!');
            exit();
        }
    }
}

 

Змінено користувачем DenKuzmin
Добавил комментарий LINE 109
Надіслати
Поділитися на інших сайтах


ругается на $this в аргументе функции

private function gateway($method, $this->data) {

надо сделать как-то так

private function gateway($method, $data) {

и уже в функции оперировать с этим переданным $data

  • +1 2
Надіслати
Поділитися на інших сайтах

17 часов назад, Prooksius сказал:

ругается на $this в аргументе функции


private function gateway($method, $this->data) {

надо сделать как-то так


private function gateway($method, $data) {

и уже в функции оперировать с этим переданным $data

Поменял $this->data на $data.

Спойлер

    private function gateway($method, $data) {

        // Добавления логина и пароля продавца к каждому запросу
        $this->data['userName'] = $this->login;
        $this->data['password'] = $this->password;
        $this->data['language'] = $this->language;

        // Выбор адреса ПШ в зависимости от выбранного режима
        if ($this->mode == 'test') {
            $url = $this->test_url;
        } else {
            $url = $this->prod_url;
        }

        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url.$method,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_POSTFIELDS => http_build_query($this->data, '', '&'),
            CURLOPT_HTTPHEADER => array('CMS: OpenCart 2.1.x', 'Module-Version: ' . $this->version),
        ));

        $response = curl_exec($curl);

        if ($this->logging) {
            $this->logger($url, $method, $data, $response);
        }
        $response = json_decode($response, true);
        curl_close($curl);

        return $response;
    }

 

Ошибка пропала.

Теперь выдаёт:

Notice: Undefined index: cart_id in X:\openserver\OpenServer\domains\localhost\catalog\controller\payment\rbs.php on line 57

Notice: Undefined index: cart_id in X:\openserver\OpenServer\domains\localhost\catalog\controller\payment\rbs.php on line 65

Fatal error: Call to undefined function array_column() in X:\openserver\OpenServer\domains\localhost\system\library\rbs_discount.php on line 244

...payment\rbs.php:

Спойлер

<?php
class ControllerPaymentRbs extends Controller {
    /**
     * Инициализация языкового пакета
     * @param $registry
     */
    public function __construct($registry) {
        parent::__construct($registry);
        $this->load->language('payment/rbs');
        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/rbs.tpl')) {
            $this->have_template = true;
        }
    }

    /**
     * Рендеринг кнопки-ссылки для перехода в метод payment()
     * @return mixed Шаблон кнопки
     */
    public function index() {
        $this->data['action'] = $this->url->link('payment/rbs/payment');
        $this->data['button_confirm'] = $this->language->get('rbs_button_confirm');
        return $this->get_template('payment/rbs', $this->data);
    }

    /**
     * Регистрация заказа.
     * Переадресация покупателя при успешной регистрации.
     * Вывод ошибки при неуспешной регистрации.
     */
    public function payment()
    {

        // for config settings
        $this->initializeRbs();

        $this->load->model('checkout/order');
        $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
        $order_number = $this->session->data['order_id'];
        $amount = $order_info['total'] * 100;
        $return_url = $this->url->link('payment/rbs/callback');

        // here we will collect data for orderBundle
        $orderBundle = [];

        $orderBundle['customerDetails'] = array(
            'email' => $order_info['email'],
            'phone' => preg_match('/[7]\d{9}/', $order_info['telephone']) ? $order_info['telephone'] : ''
        );

        // ITEMS
        foreach ($this->cart->getProducts() as $product) {

            $product_taxSum = $this->tax->getTax($product['price'], $product['tax_class_id']);
            $product_amount = ( $product['price'] + $product_taxSum ) * $product['quantity'];

            $product_data = array(
                'positionId' => $product['cart_id'],
                'name' => $product['name'],
                'quantity' => array(
                    'value' => $product['quantity'],
                    //todo fix piece
                    'measure' => $this->rbs->getDefaultMeasurement(),
                ),
                'itemAmount' => $product_amount * 100,
                'itemCode' => $product['cart_id'], //fix by PLUG-1811
                'tax' => array(
                    // todo: some question taxType
                    'taxType' => $this->config->get('rbs_taxType'),
                    'taxSum' => $product_taxSum * 100
                ),
                'itemPrice' => ($product['price'] + $product_taxSum) * 100,
            );

            // FFD 1.05 added
            if ($this->rbs->getFFDVersion() == 'v105') {

                $attributes = array();
                $attributes[] = array(
                    "name" => "paymentMethod",
                    "value" => $this->rbs->getPaymentMethodType()
                );
                $attributes[] = array(
                    "name" => "paymentObject",
                    "value" => $this->rbs->getPaymentObjectType()
                );

                $product_data['itemAttributes']['attributes'] = $attributes;
            }

            $orderBundle['cartItems']['items'][] = $product_data;

        }


        // DELIVERY
        if (isset($this->session->data['shipping_method']['cost']) && $this->session->data['shipping_method']['cost'] > 0) {

            $delivery['positionId'] = 'delivery';
            $delivery['name'] = $this->session->data['shipping_method']['title'];
            $delivery['itemAmount'] = $this->session->data['shipping_method']['cost'] * 100;
            $delivery['quantity']['value'] = 1;
            //todo fix piece
            $delivery['quantity']['measure'] = $this->rbs->getDefaultMeasurement();
            $delivery['itemCode'] = $this->session->data['shipping_method']['code'];
            $delivery['tax']['taxType'] = $this->config->get('rbs_taxType');
            $delivery['tax']['taxSum'] = 0;
            $delivery['itemPrice'] = $this->session->data['shipping_method']['cost'] * 100;

            // FFD 1.05 added
            if ($this->rbs->getFFDVersion() == 'v105') {

                $attributes = array();
                $attributes[] = array(
                    "name" => "paymentMethod",
                    "value" => 4
                );
                $attributes[] = array(
                    "name" => "paymentObject",
                    "value" => 4
                );

                $delivery['itemAttributes']['attributes'] = $attributes;
            }

            $orderBundle['cartItems']['items'][] = $delivery;
        }

        // DISCOUNT CALCULATE
        $discount = $this->rbs->discountHelper->discoverDiscount($amount,$orderBundle['cartItems']['items']);
        if($discount > 0) {
            $this->rbs->discountHelper->setOrderDiscount($discount);
            $recalculatedPositions = $this->rbs->discountHelper->normalizeItems($orderBundle['cartItems']['items']);
            $recalculatedAmount = $this->rbs->discountHelper->getResultAmount();
            $orderBundle['cartItems']['items'] = $recalculatedPositions;
        }


        $response = $this->rbs->register_order($order_number, $amount, $return_url, $orderBundle);

        if (isset($response['errorCode'])) {
            $this->document->setTitle($this->language->get('error_title'));

            $this->template = 'error/rbs.tpl';
            $this->children = array(
                'common/header',
                'common/column_left',
                'common/column_right',
                'common/content_top'
            );
            //$this->data['header'] = $this->load->controller('common/header');
            //$this->data['column_left'] = $this->load->controller('common/column_left');
            //$this->data['column_right'] = $this->load->controller('common/column_right');
            //$this->data['content_top'] = $this->load->controller('common/content_top');
            $this->data['button_continue'] = $this->language->get('error_continue');

            $this->data['heading_title'] = $this->language->get('error_title') . ' #' . $response['errorCode'];
            $this->data['text_error'] = $response['errorMessage'];
            $this->data['continue'] = $this->url->link('checkout/cart');

            $this->template = 'error/rbs.tpl';
            $this->children = array(
                'common/content_bottom',
                'common/footer'
            );
            //$this->data['content_bottom'] = $this->load->controller('common/content_bottom');
            //$this->data['footer'] = $this->load->controller('common/footer');

            //$this->response->setOutput($this->get_template('error/rbs', $this->data));
            $this->response->setOutput($this->render());
        } else {
            $this->response->redirect($response['formUrl']);
        }
    }

    /**
     * Инициализация библиотеки RBS
     */
    private function initializeRbs()
    {
        $this->library('rbs');
        $this->rbs = new RBS();
        $this->rbs->login = $this->config->get('rbs_merchantLogin');
        $this->rbs->password = $this->config->get('rbs_merchantPassword');
        $this->rbs->stage = $this->config->get('rbs_stage');
        $this->rbs->mode = $this->config->get('rbs_mode');
        $this->rbs->logging = $this->config->get('rbs_logging');
        $this->rbs->currency = $this->config->get('rbs_currency');
        $this->rbs->taxSystem = $this->config->get('rbs_taxSystem');
        $this->rbs->taxType = $this->config->get('rbs_taxSystem');
        $this->rbs->ofd_status = $this->config->get('rbs_ofd_status');

        $this->rbs->ffd_version = $this->config->get('rbs_ffdVersion');
        $this->rbs->paymentMethodType = $this->config->get('rbs_paymentMethodType');
        $this->rbs->paymentObjectType = $this->config->get('rbs_paymentObjectType');

        $this->rbs->language = $this->language->get('code');
    }

    /**
     * В версии 2.1 нет метода Loader::library()
     * Своя реализация
     * @param $library
     */
    private function library($library)
    {
        $file = DIR_SYSTEM . 'library/' . str_replace('../', '', (string)$library) . '.php';

        if (file_exists($file)) {
            include_once($file);
        } else {
            trigger_error('Error: Could not load library ' . $file . '!');
            exit();
        }
    }

    /**
     * Колбек для возвращения покупателя из ПШ в магазин.
     */
    public function callback()
    {
        if (isset($this->request->get['orderId'])) {
            $order_id = $this->request->get['orderId'];
        } else {
            die('Illegal Access');
        }

        $this->load->model('checkout/order');
        $order_number = $this->session->data['order_id'];
        $order_info = $this->model_checkout_order->getOrder($order_number);

        if ($order_info) {
            $this->initializeRbs();

            $response = $this->rbs->get_order_status($order_id);
            if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) {

                // set order status
                $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id'));

                $this->response->redirect($this->url->link('checkout/success', '', true));
            } else {
                $this->response->redirect($this->url->link('checkout/failure', '', true));
            }
        }
    }

    /* Отрисовка шаблона
        @param $template     Шаблон вместе с корневой папкой
        @param $this->data         Данные
        @return mixed        Отрисованный шаблон
    */
    private function get_template($template) {
        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/' . $template . '.tpl')) {
            $this->template = $this->config->get('config_template') . '/template/' . $template . '.tpl';
        } else {
            $this->template = 'default/template/' . $template . '.tpl';
        }
        return $this->render();
    }
}

 

...rbs_discount.php:

Спойлер

<?php
// Класс RbsDiscount
// ver. 1.0.2

class rbsDiscount {

    private $cashBasket = array();
    private $equalPosition = -1;
    private $faultPrice;
    private $arrOrder = array(
        'order_id' =>  null,
        'amount' =>  null,
        'discount' =>  null,
        'basket' => array()
    );

    private $arrRecountSumm = array(
        'priceAmount' => 0,
        'priceDiscount' => 0,
        'discount' => 0,
    );

    private function priceTransform() {
        $this->arrOrder['discount'] = $this->arrOrder['discount'] * 100;
        foreach ($this->arrOrder['basket'] as $key => $item) {
            $item['discount'] = $item['discount'] * 100;
            $item['priceAmount'] = $item['priceAmount'] * 100;
            $item['priceBase'] = $item['priceBase'] * 100;
            $item['priceDiscount'] = $item['priceDiscount'] * 100;
            $this->arrOrder['basket'][$key] = $item;
        }
    }

    private function transformNumber($value, $count = 2) {
        $count = $count ? $count : 2;
        return round($value,$count);
    }

    private function transformBasePrice($item) {
        $result = ($this->arrOrder['discount'] * $item['percentDiscount'] / 100) / $item['count'];
        $result = $this->transformNumber( $item['priceBase'] - $result);
        if($result < 0) {  $result = 0; }
        return $result;
    }


    private function onPositionDiscountPercent($item) {
        $price = $item['priceAmount'];
        return $this->transformNumber((100 / $this->arrOrder['amount'] * $price), 4);
    }

    private function onPositionDiscount($item) {
        $result = $this->transformNumber( ($item['priceBase'] - $item['priceBaseDiscount']) * $item['count']);
        return $result;
    }

    private function onPositionDiscountPrice($item) {
        $result = $this->transformNumber($item['priceBaseDiscount'] * $item['count']);
        if( $result < 0 ) { $result = 0; }
        return $result;
    }


    private function findMaxCount() {
        $maxValue = max(array_column( $this->arrOrder['basket'], 'count' ));
        $result = array_search( $maxValue, array_column( $this->arrOrder['basket'] ,'count') );
        return $result;
    }

    private function splitPosition($mode, $indexSeparate) {
        $newIndex = count($this->arrOrder['basket']);
        $separatePosition = $this->arrOrder['basket'][$indexSeparate];

        if( $mode === 'onePosition' ) {
            $this->arrOrder['basket'][$indexSeparate]['count'] = $this->transformNumber( $separatePosition['count'] - 1,3 );
            array_push( $this->arrOrder['basket'], $separatePosition );
            $this->equalPosition = $newIndex;
            $this->arrOrder['basket'][$newIndex] = $separatePosition;
            $this->arrOrder['basket'][$newIndex]['count'] = 1;
        } else if( $mode === 'fractionPosition' ) {
            $needPositionPrice = $this->transformNumber( $separatePosition['priceDiscount'] + $this->faultPrice );
            $originalCount = $separatePosition['count'];
            $success = false;
            $vishPrice = $this->transformNumber( $needPositionPrice / $originalCount );

            $separateObject = array();
            $separateObject['needSumm'] = $needPositionPrice;
            $separateObject['oldPositionCount'] =  $this->transformNumber($originalCount / 2, 3 );
            $separateObject['newPositionCount'] = $this->transformNumber($originalCount - $separateObject['oldPositionCount'],3);


            for ($toIndex = 0; $toIndex < 5; $toIndex++) {
                $separateObject['oldPositionCount'] = $this->transformNumber( $separateObject['oldPositionCount'] - 0.001, 3) ;
                $separateObject['newPositionCount'] = $this->transformNumber( $separateObject['newPositionCount'] + 0.001, 3 );
                $separateObject['oldPositionPrice'] = $this->transformNumber( $separateObject['oldPositionCount'] * $vishPrice );
                $separateObject['newPositionPrice'] = $this->transformNumber( $separateObject['newPositionCount'] * $vishPrice );
                $separateObject['oldPositionVishPrice'] = $this->transformNumber( $separateObject['oldPositionPrice'] / $separateObject['oldPositionCount'] );
                $separateObject['newPositionVishPrice'] = $this->transformNumber( $separateObject['newPositionPrice'] / $separateObject['newPositionCount'] );
                $separateObject['recountSumm'] = $this->transformNumber( $separateObject['oldPositionPrice'] + $separateObject['newPositionPrice']);
                if($separateObject['recountSumm'] == $separateObject['needSumm']) {
                    $success = true;
                    break;
                }
            }
            if( !$success ) {
                $res = $this->transformNumber(($separateObject['newPositionPrice'] - ($separateObject['recountSumm']-$separateObject['needSumm'])) / $separateObject['newPositionCount']);
                $separateObject['newPositionPrice'] = $this->transformNumber( $res * $separateObject['newPositionCount'] );
                $separateObject['recountSumm'] = $this->transformNumber( $separateObject['oldPositionPrice']+$separateObject['newPositionPrice'] );
                if( $separateObject['recountSumm'] === $separateObject['needSumm'] ) { $success = true;}
            }
            if( $success ) {
                $separatePosition['count'] = $separateObject['oldPositionCount'];
                $separatePosition['priceBaseDiscount'] = $separateObject['oldPositionVishPrice'];
                $separatePosition['priceAmount'] = $this->transformNumber( $separatePosition['count'] * $separatePosition['priceBase'] );
                $separatePosition['priceDiscount'] = $separateObject['oldPositionPrice'];
                $separatePosition['discount'] = $this->transformNumber( $separatePosition['priceAmount'] - $separatePosition['priceDiscount'] );
                $this->arrOrder['basket'][$indexSeparate] = $separatePosition;
                array_push($this->arrOrder['basket'], $separatePosition);

                $newPosition = $this->arrOrder['basket'][$newIndex];
                $newPosition['count'] = $separateObject['newPositionCount'];
                $newPosition['priceAmount'] = $this->transformNumber( $newPosition['count'] * $newPosition['priceBase'] );
                $newPosition['priceBaseDiscount'] = $separateObject['newPositionVishPrice'];
                $newPosition['priceDiscount'] = $separateObject['newPositionPrice'];
                $newPosition['discount'] = $this->transformNumber( $newPosition['priceAmount'] - $newPosition['priceDiscount'] );
                $this->arrOrder['basket'][$newIndex] = $newPosition;

            } else {

            }

        }
    }

    private function transformBasket() {
        $onePositionFind = false;
        $positionSeparateIndex = -1;
        $basket = $this->arrOrder['basket'];
        $transformMode = 'none';
        $this->equalPosition = -1;

        if( count($basket) === 0 ) { return false; }

        foreach ($basket as $key => $position) {
            if($position['count'] > 1) {
                $positionSeparateIndex = $key;
            }
            if ($position['count'] == 1) {
                $this->equalPosition = $key;
                $onePositionFind = true;
            }
        }

        if(!$onePositionFind && $positionSeparateIndex >= 0) {
            $transformMode = 'onePosition';
        } else if(!$onePositionFind) {
            $positionSeparateIndex = $this->findMaxCount();
            $transformMode = 'fractionPosition';
        }
        $this->splitPosition( $transformMode,$positionSeparateIndex );
        return $transformMode;
    }

    private function generateReceiptAmount() {
        $summ = 0;
        foreach ($this->arrOrder['basket'] as $key => $item) {
            $summ += $this->transformNumber($item['priceBase'] * $item['count']);
        }
        $this->arrOrder['amount'] = $this->transformNumber($summ);
        if($this->arrOrder['amount'] < $this->arrOrder['discount']) {
            $this->arrOrder['discount'] = $this->arrOrder['amount'];
        }

    }

    private function generatePositionsDiscount() {
        $difference = $this->arrOrder['amount'] - $this->arrOrder['discount'];
        if( $difference > 1 ) {
            foreach ($this->arrOrder['basket'] as $key => $item) {
                $item['priceAmount'] = $this->transformNumber( $item['priceBase'] * $item['count'] );
                $item['percentDiscount'] = $this->onPositionDiscountPercent( $item );
                $item['priceBaseDiscount'] = $this->transformBasePrice( $item );
                $item['discount'] = $this->onPositionDiscount( $item );
                $item['priceDiscount'] = $this->onPositionDiscountPrice( $item );

                $this->arrOrder['basket'][$key] = $item;
            }
        } else {
            foreach ($this->arrOrder['basket'] as $key => $item) {
                $item['priceAmount'] = $this->transformNumber( $item['priceBase'] * $item['count'] );
                $item['percentDiscount'] = 0;
                $item['priceBaseDiscount'] = 0;
                $item['discount'] = $item['priceAmount'];
                $item['priceDiscount'] = $item['priceAmount'] - $item['discount'];

                $this->arrOrder['basket'][$key] = $item;
            }
        }
    }

    private function equalizePositionDiscount() {

        if( $this->equalPosition < 0 ) { return false; }
        $equalPosition = $this->arrOrder['basket'][$this->equalPosition];
        $baseSumm = $this->arrOrder['amount'] - $this->arrOrder['discount'];
        $recountSumm = $this->arrRecountSumm['priceDiscount'];
//        $remain = 0;

        if( $baseSumm != $recountSumm ) {
            $remain = $this->transformNumber($baseSumm - $recountSumm);
            $this->arrOrder['basket'][$this->equalPosition]['priceBaseDiscount'] = $this->transformNumber($equalPosition['priceBaseDiscount'] + $remain);
            $this->arrOrder['basket'][$this->equalPosition]['priceDiscount'] = $equalPosition['priceBaseDiscount'];
            $this->arrOrder['basket'][$this->equalPosition]['discount'] = $this->transformNumber($equalPosition['discount'] - $remain);
            $this->arrOrder['basket'][$this->equalPosition]['priceDiscount'] = $this->arrOrder['basket'][$this->equalPosition]['priceBaseDiscount'];
        }
    }

    private function provideProductsToOrder() {
        $this->arrOrder['basket'] = $this->cashBasket;
    }

    private function finalCheck() {
        $baseAmount = $this->transformNumber( $this->arrOrder['amount'] - $this->arrOrder['discount'] );
        $finalAmount = $this->arrRecountSumm['priceDiscount'];

        $this->faultPrice =  $this->transformNumber($baseAmount - $finalAmount);
        if($this->faultPrice != 0) {
            $transformMode = $this->transformBasket();
            if( $transformMode !== 'fractionPosition' ) {
                $this->generatePositionsDiscount();
                $this->recountReceiptAmount();
                $this->equalizePositionDiscount();
            }
            $this->recountReceiptAmount();
        }
    }

    public function addProduct($product) {
        $product['priceAmount'] = $product['count'] * $product['priceBase'];
        $this->cashBasket[] = $product;
    }

    public function discoverDiscount($amount,$positions) {
        $positionsSumm =  $this->transformNumber(array_sum(array_column($positions, 'itemAmount')), 0);
        $discount = $this->transformNumber($positionsSumm - $amount,0);
        return $discount;
    }

    public function recountReceiptAmount() {
        $summ = array(
            'priceAmount' =>  0,
            'priceDiscount' =>  0,
            'discount' => 0
        );
        foreach ($this->arrOrder['basket'] as $key => $item) {
            $summ['priceAmount'] += $item['priceAmount'];
            $summ['priceDiscount'] += $item['priceBaseDiscount'] * $item['count'];
            $summ['discount'] += $item['discount'];
        }
        $this->arrRecountSumm['priceAmount'] = $this->transformNumber( $summ['priceAmount'] );
        $this->arrRecountSumm['priceDiscount'] = $this->transformNumber( $summ['priceDiscount'] );
        $this->arrRecountSumm['discount'] = $this->transformNumber( $summ['discount'] );

    }

    public function getOrder() {
        return $this->arrOrder;
    }


    public function getProducts() {
        return $this->cashBasket;
    }
    public function getBasketResult() {
//        $order;
        foreach ($this->arrOrder['basket'] as $key => $item) {
            $order[$key] = array(
                'positionId' => $key+1,
                'name' => $item['name'],
                'quantity' => array(
                    'value' => $item['count'],
                    'measure' => $item['arrGate']['quantity']['measure'],
                ),
                'itemAmount' => $this->transformNumber($item['priceDiscount'] * 100,0),
                'itemCode' => $item['id'],
                'itemPrice' => $this->transformNumber($item['priceBaseDiscount'] * 100,0),
                'tax' => array(
                    'taxType' => $item['arrGate']['tax']['taxType'],
                ),
            );

            if(isset($item['itemAttributes'])) {
                $order[$key]['itemAttributes'] = $item['itemAttributes'];
            }
        }
        return $order;

    }
    public function getRecountSumm() {
        return $this->arrRecountSumm;
    }

    public function setOrderDiscount($value) {
        $this->arrOrder['discount'] = $this->transformNumber( $value / 100 );
    }

    public function updateOrder() {
        $this->provideProductsToOrder();
        $this->generateReceiptAmount();
        $this->generatePositionsDiscount();
        $this->recountReceiptAmount();
        $this->finalCheck();
    }

    public function calculateDiscount( $amount, $discount) {
        $result = $this->transformNumber( $discount * $amount / 100,0);
        return $result;
    }

    public function normalizeItems($gatePositions) {

        foreach ($gatePositions as $key => $item) {

            $arrProduct = array(
                'id' => $item['positionId'],
                'name' => $item['name'],
                'priceBase' => $item['itemPrice'] / 100,
                'count' => $item['quantity']['value'],
                'arrGate' => $item
            );
            $this->addProduct($arrProduct);

        }

        $this->updateOrder();

        $arrResult = array();
        foreach ($this->arrOrder['basket'] as $key => $item) {
            $arrResult[$key] = $item['arrGate'];
            $arrResult[$key]['positionId'] = $key+1;
            $arrResult[$key]['itemPrice'] = $this->transformNumber($item['priceBaseDiscount'] * 100,0);
            $arrResult[$key]['itemAmount'] = $this->transformNumber($item['priceDiscount'] * 100,0);
            $arrResult[$key]['quantity']['value'] = $item['count'];

            if(isset($item['itemAttributes'])) {
                $order[$key]['itemAttributes'] = $item['itemAttributes'];
            }
        }
        return $arrResult;
    }

    public function getResultAmount() {
        return $this->transformNumber($this->arrRecountSumm['priceDiscount'] * 100,0);
    }

    public function test($message = '') {
        echo "<pre>";
        print_r($this->arrOrder);
        print_r($this->arrRecountSumm);
        echo "</pre>";
    }

}

 

 

Надіслати
Поділитися на інших сайтах


пытаетесь сами адаптировать модуль оплаты для 1.5? ))

 

1,2) в 1.5 вместо индекса "cart_id" сделан "key".
3) В вашей версии php нет функции array_column -  Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5

  • +1 1
Надіслати
Поділитися на інших сайтах

2 минуты назад, Prooksius сказал:

пытаетесь сами адаптировать модуль оплаты для 1.5? ))

 

1,2) в 1.5 вместо индекса "cart_id" сделан "key".
3) В вашей версии php нет функции array_column -  Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5

Да, всё верно)

Надіслати
Поділитися на інших сайтах


7 минут назад, Prooksius сказал:

пытаетесь сами адаптировать модуль оплаты для 1.5? ))

 

1,2) в 1.5 вместо индекса "cart_id" сделан "key".
3) В вашей версии php нет функции array_column -  Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5

Вроде как теперь всё работает. Спасибо большое!

Надіслати
Поділитися на інших сайтах


В 22.03.2021 в 12:31, Prooksius сказал:

пытаетесь сами адаптировать модуль оплаты для 1.5? ))

 

1,2) в 1.5 вместо индекса "cart_id" сделан "key".
3) В вашей версии php нет функции array_column -  Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5

Подскажите, пожалуйста. У меня всё работает, но после оплаты в 3dsecure перекидывает на index.php?route=payment/rbs/callback&orderId=63afe0... с ошибкой 500.

В личном кабинете, в транзакциях, успешный платёж вижу, а в успешный заказ не приходит. Где искать проблему?

 

PS Было ещё такое, если убираю всё после index.php?route=payment/rbs/callback&orderId, то вылетала ошибка:

Undefined index: order_id in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 231

 

Line 231

Спойлер

$order_number = $this->session->data['order_id'];

 

 

Змінено користувачем DenKuzmin
Надіслати
Поділитися на інших сайтах


Вот ваш колбэк.
В начале вы получаете order_id из get-параметра и записываете его в переменную $order_id.
А дальше вы читаете order почему-то по сессионной переменной, которой может и не быть уже.

 

P.S. ее точно нет - запрос-то на сервер идет из банка, а не из вашего компьютера.

    /**
     * Колбек для возвращения покупателя из ПШ в магазин.
     */
    public function callback()
    {
        if (isset($this->request->get['orderId'])) {
            $order_id = $this->request->get['orderId'];
        } else {
            die('Illegal Access');
        }

        $this->load->model('checkout/order');
        $order_number = $this->session->data['order_id'];
        $order_info = $this->model_checkout_order->getOrder($order_number);

        if ($order_info) {
            $this->initializeRbs();

            $response = $this->rbs->get_order_status($order_id);
            if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) {

                // set order status
                $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id'));

                $this->response->redirect($this->url->link('checkout/success', '', true));
            } else {
                $this->response->redirect($this->url->link('checkout/failure', '', true));
            }
        }
    }

 

Змінено користувачем Prooksius
Надіслати
Поділитися на інших сайтах

1 час назад, Prooksius сказал:

проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего.

В логах ничего особого по 50ой

Надіслати
Поділитися на інших сайтах


6 минут назад, DenKuzmin сказал:

В логах ничего особого по 50ой

это невозможно, в логах сервера обязательно должно быть, если ошибка 500

во втором сообщении я показал ошибку же

Змінено користувачем Prooksius
  • +1 1
Надіслати
Поділитися на інших сайтах

3 минуты назад, Prooksius сказал:

это невозможно, в логах сервера обязательно должно быть, если ошибка 500

Лог: [23/Mar/2021:20:24:38 +0300] 0.600 0.600 500 37.110.244.73 test.mebelmassive.ru GET /index.php?route=payment/rbs/callback&orderId=7f597d30-e468-7643-a4f5-628c5e4a24fb&lang=ru HTTP/2.0 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "https://web.rbsuat.com/"

Только что ответ 500. Больше ничего нет.

500.png

Надіслати
Поділитися на інших сайтах


1 час назад, Prooksius сказал:

это невозможно, в логах сервера обязательно должно быть, если ошибка 500

во втором сообщении я показал ошибку же

Не тот лог смотрел)

В php_errors.log:

[23-Mar-2021 21:33:45 Europe/Moscow] PHP Fatal error:  Call to undefined method ModelCheckoutOrder::addOrderHistory() in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 221

Line 221:

Спойлер

$this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id'));

 

 

Надіслати
Поділитися на інших сайтах


8 минут назад, DenKuzmin сказал:

$this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id'));

вместо этого надо

 

9 минут назад, DenKuzmin сказал:

$this->model_checkout_order->confirm($order_id, $this->config->get('rbs_order_status_id'));

 

  • +1 1
Надіслати
Поділитися на інших сайтах

7 минут назад, Prooksius сказал:

вместо этого надо

 

 

Ошибка пропала, но заказ не появляется в админке.

Сделал так

Спойлер

$this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id'));

 

и всё заработало как надо.

Спасибо большое!

Змінено користувачем DenKuzmin
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.