WooCommerce REST API: автоматическое обновление статуса заказа после callback платёжной системы

Проблема: необходимость автоматического обновления заказа после callback платёжной системы

При интеграции платёжных систем с WooCommerce часто возникает задача — автоматически обновлять статус заказа после получения callback (уведомления о платеже). Без правильной настройки обновление статуса приходится делать вручную, что замедляет обработку заказов и увеличивает риск ошибок.

Диагностика проблемы

Проверьте, что callback от платёжной системы успешно доходит до вашего сайта и возвращает корректный HTTP статус (200 OK). Убедитесь, что WooCommerce не обновляет статус заказа автоматически после callback, либо обновляет неправильно.

Для диагностики используйте:

  • Логи сервера (error_log, access_log)
  • Плагины для логирования REST API запросов и ответов
  • Инструменты отладки платёжной системы (например, sandbox режим)

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

1. Настройка endpoint для callback платёжной системы

Создайте кастомный endpoint в WordPress, который будет принимать callback:

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/payment-callback', [
        'methods' => 'POST',
        'callback' => 'handle_payment_callback',
        'permission_callback' => '__return_true',
    ]);
});

function handle_payment_callback(WP_REST_Request $request) {
    $data = $request->get_json_params();
    // Здесь должна быть ваша валидация данных callback
    $order_id = intval($data['order_id'] ?? 0);
    $payment_status = sanitize_text_field($data['status'] ?? '');

    if (!$order_id || !$payment_status) {
        return new WP_REST_Response(['error' => 'Invalid data'], 400);
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return new WP_REST_Response(['error' => 'Order not found'], 404);
    }

    // Обновляем статус заказа на основании статуса платежа
    if ($payment_status === 'success') {
        $order->update_status('processing', 'Оплата подтверждена через callback');
    } elseif ($payment_status === 'failed') {
        $order->update_status('failed', 'Оплата не прошла');
    }

    return new WP_REST_Response(['success' => true], 200);
}

2. Установка авторизации для безопасности callback

Чтобы callback не мог вызвать любой посторонний, добавьте проверку секретного ключа в заголовке:

function handle_payment_callback(WP_REST_Request $request) {
    $secret = $request->get_header('X-Secret-Key');
    if ($secret !== 'ваш_секретный_ключ') {
        return new WP_REST_Response(['error' => 'Unauthorized'], 401);
    }
    // остальной код обработки
}

3. Обработка ошибок и логирование

Добавьте логирование для отладки и мониторинга:

function handle_payment_callback(WP_REST_Request $request) {
    // ... проверка секретного ключа
    try {
        // обработка
        return new WP_REST_Response(['success' => true], 200);
    } catch (Exception $e) {
        error_log('Payment callback error: ' . $e->getMessage());
        return new WP_REST_Response(['error' => 'Internal error'], 500);
    }
}

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

  • Отправьте тестовый POST-запрос на ваш endpoint с правильным payload и секретным ключом.
  • Проверьте, что статус заказа в админке WooCommerce обновился в соответствии с данными callback.
  • Убедитесь, что ответ сервера содержит статус 200 и success: true.
  • Проверьте логи на отсутствие ошибок.

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

  • Ошибка 401 Unauthorized: Неправильный или отсутствующий секретный ключ в заголовках. Проверьте заголовок X-Secret-Key и совпадение с ключом на сервере.
  • Заказы не обновляются: Проверьте, что order_id корректно передаётся и что заказ существует. Используйте wc_get_order() для проверки наличия заказа.
  • Callback не доходит или возвращает ошибку 404: Проверьте правильность URL REST API endpoint и что он зарегистрирован.
  • Ошибка 500 Internal Server Error: Проверьте логи ошибки PHP, возможно, где-то ошибка в коде обработки.

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

  • Используйте HTTPS для всех callback URL, чтобы исключить перехват данных.
  • Ограничьте доступ к endpoint по IP-адресам платёжной системы, если это возможно.
  • Добавьте rate limiting (ограничение количества запросов) для защиты от DDoS-атак.
  • Кэшировать данные заказов не нужно, обновление должно происходить в реальном времени.

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

ВариантПреимуществаНедостатки
Webhook платёжной системы + кастомный REST API endpointГибкость, контроль, безопасность через проверку ключейНужно писать и поддерживать код, требует тестирования
Плагины для интеграции платёжных систем (например, WooCommerce Payment Gateways)Быстрое подключение, поддержка обновленийМогут не поддерживать все платёжные системы, ограниченная кастомизация
Обработка callback напрямую через PHP-скрипт (без REST API)Простота реализацииМеньше стандартизации, сложнее масштабировать и интегрировать

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