Дубли заказов при создании через API

Здравствуйте, коллеги.

Есть не очень понятная ситуация при создании заказов через API. Данные заказов, которые нужно создать, лежат в массиве. Количество заказов там может быть разное, от трех-пяти, до тридцати и больше. Когда заказов немного три-пять-десять, все вроде бы работает штатно.

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

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

Функция создания заказов из массива данных выглядит примерно так:

function createOrdersInCsCart($ordersToCreate)
{
    foreach ($ordersToCreate as $trackingNumber => $orderDetails) {
        // Создание заказа
        $orderId = createOrder($orderDetails);
        if ($orderId) {
            // Пишем в лог
            writeToLog("Создан заказ: " . $orderId , 'INFO');
            } else {
            // echo "Ошибка при создании заказа\n";
            writeToLog("Ошибка при создании заказа: " . $trackingNumber, 'ERROR');
        }
    }
}

То есть для каждой строки в массиве один раз вызываем функцию создания заказа.

Есть идеи, с какого перепуга в сs-cart может создаваться два заказа?

Что с количеством переданных заказов? Сравнивали?
Например

function createOrdersInCsCart($ordersToCreate)
{
    $numrows = ["yes" => 0, "no" => 0];
    foreach ($ordersToCreate as $trackingNumber => $orderDetails) {
        // Создание заказа
        $orderId = createOrder($orderDetails);
        if ($orderId) {
            // Пишем в лог
            writeToLog("Создан заказ: " . $orderId , 'INFO');
            $numrows["yes"] +=1;
            } else {
            // echo "Ошибка при создании заказа\n";
            writeToLog("Ошибка при создании заказа: " . $trackingNumber, 'ERROR');
            $numrows["no"] +=1;
        }
    }
writeToLog("Входящие заказы: " . count($ordersToCreate) . ", Созданы: " . $numrows["yes"] . ", Не созданы: " . $numrows["no"], 'INFO');
}

чтобы полностью исключить внешний фактор?

От этого пользователя заказы создаются только через API, какой может быть внешний фактор :frowning:
Часть сегодняшнего лога курильщика:

[2024-12-09 08:27:21] Создан заказ: 54796 для заказа 0114402677-0033-1
[2024-12-09 08:27:21] Создан заказ: 54795 для заказа 0114402677-0033-1
[2024-12-09 08:27:23] Создан заказ: 54798 для заказа 42812851-0040-1
[2024-12-09 08:27:23] Создан заказ: 54797 для заказа 42812851-0040-1
[2024-12-09 08:27:25] Создан заказ: 54799 для заказа 0140913965-0082-1
[2024-12-09 08:27:25] Создан заказ: 54800 для заказа 0140913965-0082-1
[2024-12-09 08:27:27] Создан заказ: 54802 для заказа 39756497-0277-1
[2024-12-09 08:27:27] Создан заказ: 54801 для заказа 39756497-0277-1
[2024-12-09 08:27:29] Создан заказ: 54804 для заказа 18936609-0156-1
[2024-12-09 08:27:29] Создан заказ: 54803 для заказа 18936609-0156-1
[2024-12-09 08:27:31] Создан заказ: 54806 для заказа 39813638-0134-2
[2024-12-09 08:27:31] Создан заказ: 54805 для заказа 39813638-0134-2
[2024-12-09 08:27:33] Создан заказ: 54808 для заказа 36401246-0290-1
[2024-12-09 08:27:33] Создан заказ: 54807 для заказа 36401246-0290-1
[2024-12-09 08:27:35] Создан заказ: 54809 для заказа 70748029-0023-1
[2024-12-09 08:27:35] Создан заказ: 54810 для заказа 70748029-0023-1
[2024-12-09 08:27:37] Создан заказ: 54812 для заказа 56199645-0087-1
[2024-12-09 08:27:37] Создан заказ: 54811 для заказа 56199645-0087-1

И лог здорового человека:

[2024-12-06 08:31:05] Создан заказ: 54742 для заказа 06655409-0755-2
[2024-12-06 08:31:08] Создан заказ: 54743 для заказа 55342968-0191-1
[2024-12-06 08:31:10] Создан заказ: 54744 для заказа 49996971-0215-1
[2024-12-06 08:31:13] Создан заказ: 54745 для заказа 91938069-0118-1
[2024-12-06 08:31:16] Создан заказ: 54746 для заказа 32359831-0117-1
[2024-12-06 08:31:18] Создан заказ: 54747 для заказа 0154475661-0016-1
[2024-12-06 08:31:20] Создан заказ: 54748 для заказа 0175711581-0031-1

Понял, но надо видеть функцию createOrder, это с одной стороны, а во-вторых - попытаться найти общий фактор в данных заказов, которые дублируются, так можно будет понять на что именно такая реакция

Это запросто:

function createOrder($order)
{
    // URL для создания заказа
    $url = "https://sww.com.ru/api/stores/1/orders";

    // Инициализация cURL
    $ch = curl_init($url);

    // Установка HTTP-заголовка для базовой авторизации
    $auth = base64_encode('тут_ключик@sww.com.ru:всякие_какие-то_символы');
    $headers = [
        'Authorization: Basic ' . $auth,
        'Content-Type: application/json'
    ];

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    // Установка опций для отправки POST-запроса
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($order));

    // Возврат ответа вместо вывода
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // Выполнение запроса и получение ответа от сервера
    $response = curl_exec($ch);

    // Проверка на наличие ошибок cURL
    if (curl_errno($ch)) {
        $error_msg = curl_error($ch);
    }

    // Закрытие сеанса cURL
    curl_close($ch);

    // Если была ошибка cURL, возвращаем её
    if (isset($error_msg)) {
        return "Ошибка cURL: " . $error_msg;
    }

    // Декодирование ответа из JSON
    $result = json_decode($response, true);

    // Проверка на наличие ошибок в ответе API
    if (isset($result['error'])) {
        return "Ошибка API: " . $result['error'];
    }

    // Возвращаем order_id
    return $result['order_id'] ?? null;
}

А в данных заказов нет никаких странностей. Только от общего количества заказов зависит. Такое ощущение, что cs-cart заказы ставит в очередь, захлебывается.

Вынес топик из багтрекера. Нет описания воспроизведения проблемы в дефолте (см. Описание раздела Баг-трекер)

Понял, приведенные функции у вас на стороне где-то, и они обращаются к API CS-Cart. Посмотрел по логам внимательнее, не знаю уж, но может быть… когда заказы нормально оформляются, между ними в логе 2-3 секунды, когда задваиваются - меньше двух секунд между записями в логе. Может попробовать в цикл вставить задержку? Например

sleep(2);

Возможно, попробую :slight_smile:

Прекрасно. Пять баллов.

А где у вас написано, как через API работать с вашим демо-магазином?

Потому что:

 // URL для создания заказа
    $url = "https://demo.cs-cart.ru/api/2.0/stores/38c47691319be367/orders";

не работает,

    // URL для создания заказа
    $url = "https://demo.cs-cart.ru/api/2.0/orders";

тоже не работает.

И как вам ее воспроизводить?
:face_with_symbols_over_mouth:

Это не то? Заказы: orders — Документация docs.cs-cart.ru 4.16.x

Благодарю, Артур, только я умею читать и знаю, где у них доки :wink:

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

Пытался помочь просто ))

1 лайк

Спасибо! :slight_smile: