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

Потерянные заказы


Recommended Posts

Приветствую! Уже несколько дней пытаюсь разобраться с пропадающими заказами. В гугле не забанили, ничего подходящего не нашел.

Суть в следующем: использую русскую сборку opencart 3.0.2.0, до этого пробовал  ocstore, но там были проблемы seo pro. Впрочем, проблема там была та же. Для оплаты использую модуль yoomoney (последний, 2.0.5, другие у меня не переходили к оплате вообще; именно юмани, не кассу, иными словами перевод на кошелек). После создания заказа и его оплаты, он падает в "потерянные". Письмо клиенту об оплате, естественно, не приходит. Callback работает, создается комментарий в заказе с указанием того, что оплата прошла, с номером платежки и суммой и с указанием статуса.

В контроллере модуля жестко указан статус заказа с id=1 (по умолчанию "ожидание"), менял на 2 (в обработке), его же ставил в настройках магазина по умолчанию и в настройках модуля. В комментарии, опять же, статус менялся на "в обработке". Но заказ не появляется. Не антифрауд. В базе данных order_status_id = 0. Если поменять, то и в заказах появится. Но на каком этапе это выполняется в модуле и почему он остается нулевым, несмотря на то, что в истории заказов создается запись об изменении статуса я так и не понял. Прошу помощи.

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


16 минут назад, chukcha сказал:

пляшите от него

вот код callback

Спойлер

    public function callback()
    {
        $data   = $_POST;
        $wallet = $this->getModel()->getWalletModel();
        $this->getModel()->log('info', "callback:  request \n" . print_r($_REQUEST, true));
        $orderId = !empty($data['label']) ? (int)$data['label'] : 1;
        if ($wallet->isEnabled()) {
            $this->getModel()->log('info', 'callback: orderid='.$orderId);
            if ($this->getModel()->checkSign($data, $wallet->getPassword())) {
                $this->load->model('checkout/order');
                $orderInfo = $this->model_checkout_order->getOrder($orderId);
                $orderAmount = sprintf('%.2f', $this->currency->format($orderInfo['total'], 'RUB', '', false));
                $this->getModel()->log('info', 'Total order = ' . $orderAmount . ',  Total paid = ' . $data['amount'] . ';');
                if ($data['amount'] == $orderAmount) {
                    $this->model_checkout_order->addOrderHistory(
                        $orderId,
                        $wallet->getSuccessOrderStatusId(),
                        'Платёж номер "' . $data['operation_id'] . '" подтверждён'
                    );
                    $this->getModel()->log('info', 'callback: Payment amount is valid.');
                } else {
                    $message = 'Получен платёж номер "' . $data['operation_id'] . '" на сумму ' . $data['amount'] . ' RUB';
                    $this->getModel()->addOrderHistory(
                        $orderId,
                        $orderInfo['order_status_id'] ?: 1,
                        $message
                    );
                    $this->getModel()->log('error', 'callback: Payment amount is not valid.');
                }
            } else {
                $this->getModel()->log('error', 'callback: Payment is not signed.');
            }
        } else {
            $this->getModel()->log('info', 'callback: You aren\'t YooMoney.');
            exit('You aren\'t YooMoney.');
        }
    }

Я так подозреваю (не силен в php), что проблема в части

Спойлер

if ($data['amount'] == $orderAmount) {
                    $this->model_checkout_order->addOrderHistory(
                        $orderId,
                        $wallet->getSuccessOrderStatusId(),
                        'Платёж номер "' . $data['operation_id'] . '" подтверждён'
                    );
                    $this->getModel()->log('info', 'callback: Payment amount is valid.');
                } else {
                    $message = 'Получен платёж номер "' . $data['operation_id'] . '" на сумму ' . $data['amount'] . ' RUB';
                    $this->getModel()->addOrderHistory(
                        $orderId,
                        $orderInfo['order_status_id'] ?: 1,
                        $message
                    );
                    $this->getModel()->log('error', 'callback: Payment amount is not valid.');
                }

Потому что у меня создается запись в истории с текстом "Получен платеж...", а не "Платеж <...> подтвержден", только я не совсем понимаю суть условия, которое не выполняется ($data['amount'] == $orderAmount). Это говорит о том, что сумма заказа не совпадает с суммой платежа?

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


залогируйте этот метод

$wallet->getSuccessOrderStatusId(),

 

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

$orderInfo['order_status_id'] ?: 1,

или вот..
 

 

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

только я не совсем понимаю суть условия, которое не выполняется ($data['amount'] == $orderAmount). Это говорит о том, что сумма заказа не совпадает с суммой платежа?

Да...
Пример

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

 

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

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

залогируйте этот метод

$wallet->getSuccessOrderStatusId(),

 

или вот..
 

 

Да...
Пример

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

 

Попробую сейчас. Судя по гитхабу, проверку суммы ввели только в этой версии, а она и не будет сходиться, так как комиссию сразу снимают. С заказа на 6р мне приходит 5,88, о чем и пишется в комментарии

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


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

. Судя по гитхабу, проверку суммы ввели только в этой версии, а она и не будет сходиться, так как комиссию сразу снимают. С заказа на 6р мне приходит 5,88, о чем и пишется в комментарии

Я не читал, не знаю, следовательно, вы должны в модуле  учесть эту комиссию, а может она приходит в каких-то доп полях ответа

 

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

13 минут назад, chukcha сказал:

Я не читал, не знаю, следовательно, вы должны в модуле  учесть эту комиссию, а может она приходит в каких-то доп полях ответа

 

Это понятно) До меня просто, наконец, дошло в чем может быть причина. В моем случае будет проще проверку убрать. В нормальном эквайринге сумма приходит полная, а снимается за период (день), поэтому, видимо и нет никаких проверок

Благодарю за разъяснения!

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


Итак, поменял callback, все заработало. Старый код (примерно с 503 строки)

Спойлер

    public function callback()
    {
        $data   = $_POST;
        $wallet = $this->getModel()->getWalletModel();
        $this->getModel()->log('info', "callback:  request \n" . print_r($_REQUEST, true));
        $orderId = !empty($data['label']) ? (int)$data['label'] : 1;
        if ($wallet->isEnabled()) {
            $this->getModel()->log('info', 'callback: orderid='.$orderId);
            if ($this->getModel()->checkSign($data, $wallet->getPassword())) {
                $this->load->model('checkout/order');
                $orderInfo = $this->model_checkout_order->getOrder($orderId);
                $orderAmount = sprintf('%.2f', $this->currency->format($orderInfo['total'], 'RUB', '', false));
                $this->getModel()->log('info', 'Total order = ' . $orderAmount . ',  Total paid = ' . $data['amount'] . ';');
                if ($data['amount'] == $orderAmount) {
                    $this->model_checkout_order->addOrderHistory(
                        $orderId,
                        $wallet->getSuccessOrderStatusId(),
                        'Платёж номер "' . $data['operation_id'] . '" подтверждён'
                    );
                    $this->getModel()->log('info', 'callback: Payment amount is valid.');
                } else {
                    $message = 'Получен платёж номер "' . $data['operation_id'] . '" на сумму ' . $data['amount'] . ' RUB';
                    $this->getModel()->addOrderHistory(
                        $orderId,
                        $orderInfo['order_status_id'] ?: 1,
                        $message
                    );
                    $this->getModel()->log('error', 'callback: Payment amount is not valid.');
                }
            } else {
                $this->getModel()->log('error', 'callback: Payment is not signed.');
            }
        } else {
            $this->getModel()->log('info', 'callback: You aren\'t YooMoney.');
            exit('You aren\'t YooMoney.');
        }
    }

 

Новый код

Спойлер

public function callback()
    {
        $data   = $_POST;
        $wallet = $this->getModel()->getWalletModel();
        $this->getModel()->log('info', "callback:  request \n" . print_r($_REQUEST, true));
        $orderId = !empty($data['label']) ? (int)$data['label'] : 1;
        if ($wallet->isEnabled()) {
            $this->getModel()->log('info', 'callback: orderid='.$orderId);
            if ($this->getModel()->checkSign($data, $wallet->getPassword())) {
                $this->load->model('checkout/order');
                $orderInfo = $this->model_checkout_order->getOrder($orderId);
                $orderAmount = sprintf('%.2f', $this->currency->format($orderInfo['total'], 'RUB', '', false));
                $this->getModel()->log('info', 'Total order = ' . $orderAmount . ',  Total paid = ' . $data['amount'] . ';');                
                $this->model_checkout_order->addOrderHistory(
                    $orderId,
                    $wallet->getSuccessOrderStatusId(),
                    'Получен платёж номер "' . $data['operation_id'] . '" на сумму ' . $data['amount'] . ' RUB'
                );
                $this->getModel()->log('info', 'callback: Payment amount is valid.');                
            } else {
                $this->getModel()->log('error', 'callback: Payment is not signed.');
            }
        } else {
            $this->getModel()->log('info', 'callback: You aren\'t YooMoney.');
            exit('You aren\'t YooMoney.');
        }
    }

 

 

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


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

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

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

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

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

Вхід

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

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

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

Important Information

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