Диагностика проблемы с обновлением статуса заказа в WooCommerce
Проблема необновления статуса заказов через вебхуки в WooCommerce часто возникает при интеграции с CRM, службами доставки или платежными системами. Основные симптомы:
- Статус заказа в админке WooCommerce не меняется после получения webhook-сообщения.
- Отсутствие логов об успешном обновлении статуса.
- Ошибки 400/500 при попытке обработки webhook.
Для диагностики сначала проверьте журнал вебхуков WooCommerce (WooCommerce → Статус → Журналы) и логи сервера (error_log). Убедитесь, что URL вебхука корректен и что сервер принимает POST-запросы.
Пошаговое решение: правильное обновление статуса заказа через webhook
1. Создайте endpoint для приёма webhook
Лучше создать кастомный endpoint, чтобы получать вебхуки и обрабатывать их без конфликтов с другими плагинами:
add_action('rest_api_init', function () {
register_rest_route('custom/v1', '/update-order-status/', [
'methods' => 'POST',
'callback' => 'handle_order_status_webhook',
'permission_callback' => '__return_true',
]);
});
function handle_order_status_webhook(WP_REST_Request $request) {
$data = $request->get_json_params();
if (empty($data['order_id']) || empty($data['new_status'])) {
return new WP_REST_Response(['error' => 'Missing parameters'], 400);
}
$order_id = intval($data['order_id']);
$new_status = sanitize_text_field($data['new_status']);
$order = wc_get_order($order_id);
if (!$order) {
return new WP_REST_Response(['error' => 'Order not found'], 404);
}
// Проверяем валидность статуса
$valid_statuses = wc_get_order_statuses();
$formatted_status = 'wc-' . $new_status;
if (!array_key_exists($formatted_status, $valid_statuses)) {
return new WP_REST_Response(['error' => 'Invalid status'], 400);
}
// Обновляем статус
$order->update_status($new_status, 'Статус обновлен через webhook', true);
return new WP_REST_Response(['success' => true], 200);
}2. Настройте отправку webhook на новый endpoint
В CRM или платежной системе укажите URL вида https://example.com/wp-json/custom/v1/update-order-status/ для отправки POST-запросов с JSON, например:
{
"order_id": 1234,
"new_status": "completed"
}Проверка результата после внедрения
- Отправьте тестовый webhook с корректным
order_idиnew_status. - Перейдите в WooCommerce → Заказы и проверьте, что статус заказа изменился.
- Проверьте логи REST API или создайте логирование в функции для отладки:
error_log('Webhook received for order ' . $order_id . ' with status ' . $new_status);Частые ошибки и как их исправить
- Некорректный URL webhook: Проверьте, что в CRM/платежной системе указан правильный endpoint с префиксом
/wp-json/. - Неправильный формат JSON: Убедитесь, что запросы отправляются с заголовком
Content-Type: application/jsonи корректным телом. - Недостаточные права доступа: В приведённом примере
permission_callbackвсегда возвращаетtrue— для безопасности рекомендуется добавить проверку ключа или токена. - Неверный статус заказа: WooCommerce принимает только определённые статусы, например,
pending,processing,completed. Проверьте массивwc_get_order_statuses(). - Кэширование REST API: Если используется кэширование, отключите его для endpoint или настройте исключения.
Практические советы по безопасности и производительности
- Аутентификация webhook: Добавьте проверку секретного ключа в заголовках запроса и сравнивайте его в
permission_callback, чтобы предотвратить несанкционированный доступ. - Логирование: Включите запись ошибок и запросов в отдельный файл для мониторинга и отладки.
- Ограничение частоты: Если возможно, настройте ограничение на количество запросов от одного IP, чтобы избежать атаки.
- Обработка ошибок: При неуспешном обновлении статуса отправляйте ответ с кодом ошибки и сообщением для повторной отправки webhook.
Сравнение вариантов реализации обновления статуса заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Использование встроенных вебхуков WooCommerce | Настройка в админке WooCommerce с автоматической отправкой | Простая настройка, нет кода | Ограниченные возможности обработки, сложность кастомизации |
| Кастомный REST API endpoint (пример выше) | Создание собственного endpoint для приёма webhook и ручное обновление статуса | Гибкость, возможность валидации и логирования | Требует разработки и поддержки кода |
| Использование сторонних плагинов интеграции | Плагины для интеграции с CRM и платежными системами | Много функций, готовые решения | Стоимость, возможные конфликты с другими плагинами |