Диагностика проблемы с отклонёнными платежами в WooCommerce
В интернет-магазинах на WooCommerce частая ситуация — платеж не проходит, но заказ остаётся в статусе «Обработка» или «Ожидает оплаты». Это создаёт путаницу и негативно влияет на учет и взаимодействие с клиентами. Основная проблема — отсутствие автоматического возврата средств или корректного изменения статуса заказа при отклонённом платеже.
Для диагностики:
1. Проверьте статус заказов с помощью админки WooCommerce (WooCommerce > Заказы).
2. Убедитесь, что платежный шлюз корректно передаёт статусы (например, PayPal, Stripe).
3. Посмотрите логи платежного шлюза и WooCommerce (WooCommerce > Статус > Логи).
4. Проверьте, не блокирует ли кэширование или плагины безопасности обновление статусов.
Пошаговое решение: автоматический возврат денег и изменение статуса заказа
1. Отслеживаем событие отклонённого платежа
WooCommerce не всегда автоматически меняет статус заказа при отклонении платежа, особенно если используется кастомный платежный шлюз. Для автоматизации используем хук woocommerce_order_status_failed, который срабатывает при смене статуса заказа на «неудачный».
2. Добавляем код для возврата денег и уведомления
Пример функции, которая выполняет возврат средств и меняет статус заказа на «отменён»:
add_action('woocommerce_order_status_failed', 'auto_refund_on_failed_payment');
function auto_refund_on_failed_payment($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем, был ли уже возврат
if ($order->get_refunds()) return;
// Пытаемся создать возврат
try {
$refund = wc_create_refund(array(
'amount' => $order->get_total(),
'reason' => 'Отклонённый платёж — автоматический возврат',
'order_id' => $order_id,
'refund_payment' => true,
));
$order->update_status('cancelled', 'Автоматический возврат средств при отклонённом платеже.');
} catch (Exception $e) {
error_log('Ошибка при автоматическом возврате: ' . $e->getMessage());
}
}Этот код создаёт возврат средствами WooCommerce, если платеж отклонён, и меняет статус заказа на «отменён».
3. Настройка уведомлений клиенту и администратору
Для информирования добавьте в functions.php или плагин следующие хуки, чтобы отправить письмо при возврате:
add_action('woocommerce_order_refunded', 'notify_on_auto_refund', 10, 2);
function notify_on_auto_refund($order_id, $refund_id) {
$order = wc_get_order($order_id);
$mailer = WC()->mailer();
$mails = $mailer->get_emails();
if (!empty($mails['WC_Email_Customer_Refunded_Order'])) {
$mails['WC_Email_Customer_Refunded_Order']->trigger($order_id, $refund_id);
}
}Проверка результата после внедрения
- Создайте тестовый заказ и искусственно переведите его в статус «неудачный» (failed). Это можно сделать вручную или с помощью тестового платежного шлюза.
- Проверьте, что возврат средств создан (в админке в заказе вкладка «Возвраты»).
- Убедитесь, что статус заказа изменился на «отменён».
- Проверьте почту клиента и администратора — должны прийти уведомления о возврате.
- В логах ошибок WordPress и WooCommerce отсутствуют сообщения об ошибках возврата.
Частые ошибки и как исправить
- Возврат не создаётся и появляется ошибка «Refund failed». Проверьте, поддерживает ли платежный шлюз автоматические возвраты через WooCommerce. Не все шлюзы позволяют API-возвраты. В этом случае возврат придётся делать вручную.
- Статус заказа не меняется на «отменён». Убедитесь, что код не конфликтует с другими плагинами, которые могут перезаписывать статус. Попробуйте отключить сторонние плагины для теста.
- Письма не отправляются. Проверьте настройки SMTP и почтового сервера WordPress. Также убедитесь, что хук
woocommerce_order_refundedсрабатывает. - Кэшировка мешает обновлению статуса. Отключите кэширование страниц для страниц админки и корзины.
Практические рекомендации по безопасности и производительности
- Не храните данные кредитных карт на сервере, используйте только проверенные платёжные шлюзы.
- Включите логирование ошибок WooCommerce для отслеживания сбоев возвратов.
- При большом количестве заказов с возвратами настройте асинхронную обработку через WP-Cron или сторонние очереди.
- Используйте child-тему или собственный плагин для добавления кода, чтобы не потерять изменения при обновлениях.
Сравнение решений для автоматического возврата при отклонённых платежах
| Метод | Пример | Плюсы | Минусы |
|---|---|---|---|
Код на хуке woocommerce_order_status_failed | Пример выше | Полный контроль, работает с большинством шлюзов, бесплатное решение | Зависит от поддержки возвратов платежным шлюзом, требует навыков программирования |
| Плагин для управления возвратами (например, WooCommerce Smart Refunder) | Готовое решение из репозитория | Простая настройка, поддержка разных шлюзов | Платные версии, ограниченная кастомизация |
| Ручное управление возвратами | Админка WooCommerce | Безопасно, без разработки | Трудозатратно, высокая вероятность ошибок |