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

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


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
Надіслати
Поділитися на інших сайтах

  В 21.03.2021 в 16:00, Prooksius сказав:

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

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

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

private function gateway($method, $data) {

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

Expand  

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

  Показати вміст

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

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

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:

  Показати вміст

...rbs_discount.php:

  Показати вміст

 

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


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

 

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

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

  В 22.03.2021 в 09:31, Prooksius сказав:

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

 

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

Expand  

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

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


  В 22.03.2021 в 09:31, Prooksius сказав:

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

 

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

Expand  

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

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


  В 22.03.2021 в 09:31, Prooksius сказав:

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

 

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

Expand  

Подскажите, пожалуйста. У меня всё работает, но после оплаты в 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

  Показати вміст

 

Змінено користувачем 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
Надіслати
Поділитися на інших сайтах

  В 23.03.2021 в 15:37, Prooksius сказав:

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

Expand  

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

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


  В 23.03.2021 в 17:15, DenKuzmin сказав:

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

Expand  

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

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

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

  В 23.03.2021 в 17:21, Prooksius сказав:

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

Expand  

Лог: [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

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


  В 23.03.2021 в 17:21, Prooksius сказав:

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

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

Expand  

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

В 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:

  Показати вміст

 

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


  В 23.03.2021 в 18:36, DenKuzmin сказав:

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

Expand  

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

 

  В 23.03.2021 в 18:36, DenKuzmin сказав:

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

Expand  

 

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

  В 23.03.2021 в 18:46, Prooksius сказав:

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

 

 

Expand  

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

Сделал так

  Показати вміст

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

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

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


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

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

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

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

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

Вхід

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

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

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

Important Information

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