WooCommerce: авторизация и обновление статуса заказов через REST API

Диагностика проблемы: невозможность обновления статуса заказов через REST API

Частая задача при интеграции WooCommerce с внешними сервисами — обновление статуса заказов через REST API. Однако разработчики часто сталкиваются с ошибками авторизации или с тем, что статус заказа не меняется, несмотря на успешный запрос. Причины могут быть следующими:

  • Неправильная настройка прав доступа пользователя или ключей API.
  • Отсутствие нужных прав на изменение заказов (capabilities).
  • Неправильный формат или неполные данные в запросе.
  • Кэширование или задержка обработки изменений на стороне WooCommerce.

Как проверить: диагностика прав и статусов

Для начала убедитесь, что ваш пользователь REST API обладает нужными правами:

function check_user_capabilities() {
    $user = wp_get_current_user();
    if ( user_can( $user, 'edit_shop_orders' ) ) {
        error_log('Пользователь может редактировать заказы');
    } else {
        error_log('Нет прав на редактирование заказов');
    }
}

Запустите этот код в контексте вашего REST API запроса (например, внутри вашего обработчика) и посмотрите логи. Если прав нет, необходимо создать пользователя с ролью, которая включает edit_shop_orders (обычно это роль shop_manager или администратор).

Пошаговое решение: обновление статуса заказа через REST API

1. Создайте пользователя и ключи API с правами shop_manager

В админке WordPress создайте пользователя с ролью shop_manager и сгенерируйте для него ключи REST API (WooCommerce > Settings > Advanced > REST API).

2. Отправьте запрос на обновление заказа

Пример запроса на обновление статуса заказа с помощью cURL:

curl -X PUT https://example.com/wp-json/wc/v3/orders/12345 \
-u consumer_key:consumer_secret \
-H "Content-Type: application/json" \
-d '{"status": "completed"}'

Где 12345 — ID заказа, consumer_key и consumer_secret — ключи API.

3. Обработка запроса в WordPress (если нужен кастомный эндпоинт)

Если вы делаете кастомный REST API эндпоинт, пример обновления статуса заказа:

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/order/(?P<id>\d+)', [
        'methods' => 'PUT',
        'callback' => 'custom_update_order_status',
        'permission_callback' => function () {
            return current_user_can('edit_shop_orders');
        },
        'args' => [
            'id' => ['required' => true, 'validate_callback' => 'is_numeric'],
        ],
    ]);
});

function custom_update_order_status(WP_REST_Request $request) {
    $order_id = $request->get_param('id');
    $status = $request->get_param('status');

    if ( ! in_array($status, wc_get_order_statuses(), true) ) {
        return new WP_Error('invalid_status', 'Неверный статус заказа', ['status' => 400]);
    }

    $order = wc_get_order($order_id);
    if ( ! $order ) {
        return new WP_Error('order_not_found', 'Заказ не найден', ['status' => 404]);
    }

    $order->update_status($status, 'Статус обновлен через REST API');
    return rest_ensure_response(['success' => true, 'order_id' => $order_id, 'status' => $status]);
}

Проверка результата после внедрения

  • Отправьте PUT-запрос с помощью Postman или curl и проверьте тело ответа — должен быть успех и актуальный статус.
  • Зайдите в админку WooCommerce > Заказы и убедитесь, что статус изменился.
  • Проверьте логи ошибок сервера на предмет возможных предупреждений.

Частые ошибки и способы исправления

  • 403 Forbidden при запросе: нет прав у пользователя. Проверьте роль и capabilities, сгенерируйте ключи от пользователя с ролью shop_manager.
  • 400 Bad Request с сообщением о неверном статусе: убедитесь, что в запросе передается статус из списка wc_get_order_statuses(), например, completed, processing, on-hold.
  • 404 Not Found: проверьте, что ID заказа существует и вы используете правильный URL.
  • Статус не меняется, но ответ успешный: возможно, конфликт с плагинами или кэшированием. Попробуйте временно отключить кэш-плагины, проверьте хуки, которые могут блокировать изменение статуса.

Практические советы по безопасности и производительности

  • Используйте HTTPS для всех REST API запросов.
  • Ограничьте права пользователей, создавая отдельные аккаунты только с нужными capabilities.
  • Настройте rate limiting (ограничение частоты запросов), чтобы избежать DoS-атак.
  • Кэшируйте GET-запросы, но избегайте кэширования PUT/POST запросов.
  • Для сложных сценариев автоматизации используйте WP-Cron с задержкой, если необходимо массовое обновление заказов.

Сравнение вариантов реализации обновления статуса заказа

ВариантПлюсыМинусы
Использование стандартного WooCommerce REST APIПростота, поддержка официальная, безопасностьОграниченная кастомизация, зависит от ролей и ключей
Кастомный REST API эндпоинтГибкость, можно добавить дополнительную логику и проверкиТребует разработки и тестирования, ответственность за безопасность на разработчике
Плагины автоматизации (например, WPShop Clearfy Pro)Ускоряют настройку, дополнительная безопасность и оптимизацияМожет быть избыточным для простых задач, дополнительная нагрузка

Шаблоны для WP Плагины для WP