Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

При оплате товара с разными цветами через Сбербанк, он выдает ошибку #8 [item.itemCode] дублируется


Alex5557
 Поделиться

Рекомендованные сообщения

При оплате одного и того же товара с разными цветами через Сбербанк, он выдает ошибку #8 [item.itemCode] дублируется.

Используется официальны плагин от Сбербанка - https://securepayments.sberbank.ru/wiki/doku.php/integration:cms:opencart:start

 

При обращении в тех. поддержку Сбербанка ответили:

itemCode каждой позиции должен быть уникальным. Дублирование itemCode приводит к данной ошибке.

Я так понимаю проблема примерно здесь:

Спойлер

/**
     * Регистрация заказа.
     * Переадресация покупателя при успешной регистрации.
     * Вывод ошибки при неуспешной регистрации.
     */
    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 = (int)$order_info['order_id'];
        $amount = $order_info['total'] * 100;
        $return_url = $this->url->link('extension/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' => "piece"
                ),
                'itemAmount' => $product_amount * 100,
                'itemCode' => $product['product_id'],
                'tax' => array(
                    // todo: some question taxType
                    'taxType' => $this->config->get('payment_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'] = 'piece';
            $delivery['itemCode'] = $this->session->data['shipping_method']['code'];
            $delivery['tax']['taxType'] = $this->config->get('payment_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;
        }

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


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

            $data['header'] = $this->load->controller('common/header');
            $data['column_left'] = $this->load->controller('common/column_left');
            $data['column_right'] = $this->load->controller('common/column_right');
            $data['content_top'] = $this->load->controller('common/content_top');
            $data['button_continue'] = $this->language->get('error_continue');

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

            $data['content_bottom'] = $this->load->controller('common/content_bottom');
            $data['footer'] = $this->load->controller('common/footer');

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

 

 

Как мне в итоге быть? Проблема в Opencart или в Сбербанке?

Благодарю за помощь.

 

Изменено пользователем Alex5557
Ссылка на комментарий
Поделиться на других сайтах


18 минут назад, Alex5557 сказал:

Проблема в Opencart или в Сбербанке?

Проблема в модуле сбербанка для опенкарта, когда вы используете опции, в корзину добавляется товар с одним и тем же id, для сбербанка же id продукта должен быть видимо уникальным

Изменено пользователем Pavel666
Ссылка на комментарий
Поделиться на других сайтах

17 минут назад, Pavel666 сказал:

Воспользуетесь лучше 

 

К сожалению слишком дорого для меня.

То есть если я подправлю плагин Сбербанка чтобы передавал разные product_id ... можно ли так решить проблему?

Ссылка на комментарий
Поделиться на других сайтах


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

К сожалению слишком дорого для меня.

То есть если я подправлю плагин Сбербанка чтобы передавал разные product_id ... можно ли так решить проблему?

да, попробуйте при наличии опций у товара, добавлять постфикс к id, или еще проще, записывается id в массив, и перед записью проверяете есть ли данный id в массиве, если есть добавляете префикс, или постфикс

Изменено пользователем Pavel666
Ссылка на комментарий
Поделиться на других сайтах

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

На это:


'itemCode' => $product['product_id'].'-'.$product['cart_id'],

можете объяснить за что отвечает $product['cart_id'] ?

Я допустим думал сделать так

'itemCode' => $product['product_id'] . "-" . $product['option'][0]['option_id'] . "-" . $product['option'][0]['option_value_id'],

Или ваше решение логичнее?

Ссылка на комментарий
Поделиться на других сайтах


14 минут назад, Alex5557 сказал:

Я допустим думал сделать так

И получите ошибку, если у товара нет опции.

 

14 минут назад, Alex5557 сказал:

можете объяснить за что отвечает $product['cart_id'] ?

Это уникальный id товара в корзине.

Можно просто его передавать, но всё же стоит отставить id товара. Мало ли понадобится.

  • +1 2
Ссылка на комментарий
Поделиться на других сайтах

5 минут назад, mpn2005 сказал:

Это уникальный id товара в корзине.

Можно просто его передавать, но всё же стоит отставить id товара. Мало ли понадобится.

 

Спасибо

Ссылка на комментарий
Поделиться на других сайтах


  • 5 месяцев спустя...
В 19.04.2019 в 19:41, mpn2005 сказал:

Замените это:


'itemCode' => $product['product_id'],

На это:


'itemCode' => $product['product_id'].'-'.$product['cart_id'],

Спасибо! Была подобная проблема, все решилось этой правкой. 

Ссылка на комментарий
Поделиться на других сайтах


  • 3 месяца спустя...
On 4/19/2019 at 8:41 PM, mpn2005 said:

Замените это:


'itemCode' => $product['product_id'],

На это:


'itemCode' => $product['product_id'].'-'.$product['cart_id'],

Я прошу прощения, можно для чайников пояснить где этот код меняется? Та же проблема. 

Ссылка на комментарий
Поделиться на других сайтах


7 часов назад, Ngg5 сказал:

Я прошу прощения, можно для чайников пояснить где этот код меняется? Та же проблема. 

У меня нет этого модуля. Поэтому не могу сказать в каком файле находится данная строка.

Ссылка на комментарий
Поделиться на других сайтах

23 hours ago, mpn2005 said:

У меня нет этого модуля. Поэтому не могу сказать в каком файле находится данная строка.

Ясно, спасибо за ответ

 

Ссылка на комментарий
Поделиться на других сайтах


1 минуту назад, Ngg5 сказал:

Ясно, спасибо за ответ

Откройте дистрибутив модуля и поищите в папке catalog/model

Во всех файлах по очереди в данной папке, учитывая вложенные подпапки.

 

Иногда бывает ещё в system/library

Ссылка на комментарий
Поделиться на других сайтах

  • 4 месяца спустя...
В 19.04.2019 в 13:59, Alex5557 сказал:

При оплате одного и того же товара с разными цветами через Сбербанк, он выдает ошибку #8 [item.itemCode] дублируется.

 

Как мне в итоге быть? Проблема в Opencart или в Сбербанке?

Благодарю за помощь.

 

Вот так такое тож норм

 

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.