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

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

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

Диагностика проблемы авторизации и обновления статуса заказа

Для проверки ошибок нужно сделать несколько шагов:

  • Проверить правильность ключей Consumer Key и Consumer Secret в настройках WooCommerce (WooCommerce > Настройки > Расширенные > REST API).
  • Посмотреть, не блокирует ли сервер запросы (firewall, mod_security).
  • Проверить, что используемый токен соответствует назначенным правам (доступ к заказам, обновление заказов).
  • Изучить ответ API на запросы обновления — часто возвращаются ошибки 401 Unauthorized, 403 Forbidden или 400 Bad Request.

Пошаговое решение: авторизация по токену и обновление статуса заказа

1. Создание API ключей в WooCommerce

Перейдите в WooCommerce > Настройки > Расширенные > REST API, нажмите "Добавить ключ", укажите пользователя с правами администратора, выберите права "Чтение/Запись" и сохраните ключи.

2. Использование Basic Authentication с Consumer Key и Secret

WooCommerce REST API использует Basic Auth, где токен формируется из consumer_key:consumer_secret в base64.

function get_auth_header($consumer_key, $consumer_secret) {
    $token = base64_encode($consumer_key . ':' . $consumer_secret);
    return 'Authorization: Basic ' . $token;
}

3. Пример запроса обновления статуса заказа с PHP cURL

$consumer_key = 'ck_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$consumer_secret = 'cs_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$order_id = 123;

$api_url = "https://example.com/wp-json/wc/v3/orders/" . $order_id;

$data = json_encode(['status' => 'completed']);

$ch = curl_init($api_url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    get_auth_header($consumer_key, $consumer_secret),
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data)
]);

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($http_code === 200) {
    echo "Статус заказа обновлен успешно.";
} else {
    echo "Ошибка обновления: " . $response;
}

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

  • Убедитесь, что в ответе API при обновлении заказа приходит статус 200 и данные заказов с новым статусом.
  • Проверьте в админке WooCommerce, что статус заказа действительно изменился.
  • Для отладки используйте логирование ответов и ошибок cURL.

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

  • 401 Unauthorized: Неправильные ключи или недостаточно прав. Проверьте API ключи и права пользователя.
  • 403 Forbidden: Ограничения сервера или плагина безопасности. Проверьте firewall, .htaccess и плагины безопасности.
  • 400 Bad Request: Некорректный JSON или неверный формат данных. Используйте json_encode и проверяйте структуру запроса.
  • 429 Too Many Requests: Превышен лимит запросов. Внедрите задержки или кэширование.

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

  • Используйте HTTPS для всех API запросов — передача ключей без шифрования опасна.
  • Ограничьте права API ключей только необходимыми (например, только доступ к заказам).
  • Логируйте запросы и ошибки для быстрого выявления проблем.
  • При массовом обновлении статусов используйте пакетные запросы с задержками, чтобы не перегружать сервер.
  • Рассмотрите внедрение OAuth 1.0a, если Basic Auth не подходит по безопасности (WooCommerce поддерживает оба варианта).

Сравнение способов авторизации в WooCommerce REST API

МетодПреимуществаНедостатки
Basic Authentication (Consumer Key/Secret)Простота реализации, поддержка большинством клиентовНужен HTTPS, ключи в каждом запросе
OAuth 1.0aБолее безопасный, поддерживает подпись запросовСложнее в настройке, требует дополнительной библиотеки

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