WooCommerce: автоматическое изменение статуса заказа при оплате через кастомный шлюз

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

В WooCommerce часто возникает ситуация, когда при использовании нестандартных или кастомных платежных шлюзов заказ остаётся в статусе "Ожидает оплату" (pending) даже после успешного проведения транзакции. Это приводит к тому, что магазин не отправляет уведомления, не запускает обработку заказа и вызывает недовольство клиентов.

Основные признаки проблемы:

  • Заказ создан в WooCommerce, но статус не изменяется автоматически после оплаты;
  • Письма с подтверждением оплаты не отправляются;
  • Ручное изменение статуса решает проблему, но это неудобно при большом потоке заказов;
  • Плагин платежного шлюза не поддерживает корректное уведомление WooCommerce о смене статуса.

Пошаговое решение: как автоматизировать смену статуса заказа

Для корректной работы необходимо вручную обработать уведомление от платежного шлюза и изменить статус заказа программно. Ниже приведён пример кода, который обрабатывает успешную оплату и меняет статус заказа на processing или completed в зависимости от типа товара.

1. Получение объекта заказа

Предполагается, что вы получаете ID заказа из данных платежного шлюза (например, в callback обработчике).

function handle_payment_callback() {
    $order_id = isset($_POST['order_id']) ? intval($_POST['order_id']) : 0;
    if (!$order_id) {
        wp_send_json_error('Order ID not found');
        exit;
    }
    $order = wc_get_order($order_id);
    if (!$order) {
        wp_send_json_error('Order not found');
        exit;
    }
    // Продолжение обработки...
}

2. Проверка статуса оплаты и изменение статуса заказа

После подтверждения успешной оплаты необходимо вызвать метод для смены статуса.

if ($payment_successful) { // условие, основанное на ответе шлюза
    if ($order->has_downloadable_item()) {
        $order->update_status('completed', 'Оплата прошла успешно, заказ завершён автоматически.');
    } else {
        $order->update_status('processing', 'Оплата прошла успешно, заказ в обработке.');
    }
    $order->save();
} else {
    // Логируем ошибку или ставим статус failed
    $order->update_status('failed', 'Оплата не прошла.');
    $order->save();
}

3. Добавление хуков для кастомных платежных шлюзов

Иногда необходимо интегрировать код в callback URL, который вызывается платежной системой. Пример регистрации REST API endpoint для приёма уведомлений:

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

Как проверить, что решение работает

  • Совершите тестовый заказ через платежный шлюз;
  • Убедитесь, что после успешной оплаты статус заказа меняется автоматически;
  • Проверьте логи WooCommerce и письма с уведомлениями;
  • Для дополнительной проверки можно вывести в лог сообщения из функции handle_payment_callback;
  • Проверьте, что при ошибке оплаты статус меняется на failed и уведомления отправляются корректно.

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

  • Неверный ID заказа или его отсутствие в callback: Проверьте, что при передаче данных от платежного шлюза ID заказа передаётся корректно и совпадает с ID в WooCommerce.
  • Кэширование или блокировка REST API: Убедитесь, что endpoint callback доступен без авторизации и не блокируется плагинами безопасности.
  • Отсутствие проверки подписи платежного уведомления: Для безопасности всегда проверяйте подпись или токен, который присылает платежный шлюз, чтобы избежать подделки запросов.
  • Не сохранён статус заказа: Всегда вызывайте $order->save() после обновления статуса.
  • Отсутствие обработки разных типов товаров: Для цифровых товаров лучше ставить статус completed, для физических — processing.

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

  • Используйте проверку подписи платежного шлюза в callback-функции.
  • Регулярно логируйте события оплаты в отдельный файл для аудита.
  • Минимизируйте время обработки в callback, чтобы не блокировать сервер.
  • Если ваш магазин интенсивно принимает заказы, используйте WP-Cron или очередь задач для асинхронной обработки статусов.

Чек-лист для внедрения автоматической смены статуса заказа

  1. Убедитесь, что платежный шлюз поддерживает callback / webhook.
  2. Реализуйте обработчик платежных уведомлений (REST API или обычный PHP-скрипт).
  3. Получайте и валидируйте ID заказа из уведомления.
  4. Проверяйте подпись или токен платежного шлюза.
  5. Меняйте статус заказа через $order->update_status() с сохранением.
  6. Проверяйте на тестовой оплате корректность смены статусов и отправку писем.
  7. Логируйте ошибки и успешные изменения для отладки.
WooCommerce: решение проблемы с неотображением дополнительного поля в форме регистрации
09.06.2026
Как удалить вредоносные коды из WordPress: практическое руководство
20.12.2025
Как отладить проблемы с PHP в WordPress с помощью Xdebug
19.01.2026
Как удалить пустые термины таксономий в WordPress через PHP
06.04.2026
Как создать и использовать кастомные типы записей в WordPress
14.01.2026