Диагностика проблемы: заказ не меняет статус после оплаты
В 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 или очередь задач для асинхронной обработки статусов.
Чек-лист для внедрения автоматической смены статуса заказа
- Убедитесь, что платежный шлюз поддерживает callback / webhook.
- Реализуйте обработчик платежных уведомлений (REST API или обычный PHP-скрипт).
- Получайте и валидируйте ID заказа из уведомления.
- Проверяйте подпись или токен платежного шлюза.
- Меняйте статус заказа через
$order->update_status()с сохранением. - Проверяйте на тестовой оплате корректность смены статусов и отправку писем.
- Логируйте ошибки и успешные изменения для отладки.