Есть не очень понятная ситуация при создании заказов через 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 может создаваться два заказа?
От этого пользователя заказы создаются только через API, какой может быть внешний фактор
Часть сегодняшнего лога курильщика:
[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 секунды, когда задваиваются - меньше двух секунд между записями в логе. Может попробовать в цикл вставить задержку? Например
Благодарю, Артур, только я умею читать и знаю, где у них доки
И естественно, что я создал для администратора новый ключ. Не создаются заказы, а заниматься отладкой я лучше буду у себя, мне важнее, чтоб у меня все работало верно.