Диагностика проблемы с неподтверждёнными заказами и возвратом платежей в WooCommerce
В интернет-магазинах на WooCommerce часто возникают ситуации, когда заказы остаются в статусе «ожидает подтверждения» или «на рассмотрении» длительное время. Это может создать путаницу у покупателей и владельцев магазина, а также привести к заморозке денежных средств на счетах.
Типичные признаки проблемы:
- Заказ не переводится в статус «завершён» или «обработан» автоматически;
- Оплата была произведена, но заказ не подтверждён и не завершён;
- Покупатель не получает уведомления о возврате;
- Ручное управление возвратами занимает много времени и увеличивает риск ошибок.
Для проверки статусов заказов можно использовать SQL-запрос к базе данных или стандартный экран заказов в админке WooCommerce.
Пошаговое решение: настройка автоматического возврата по неподтверждённым заказам
1. Определяем критерии неподтверждённых заказов
Например, заказы, которые находятся в статусе on-hold или pending более 24 часов без изменений.
2. Реализация автоматического возврата через WP-Cron и WooCommerce API
Добавим в файл functions.php вашей темы следующий код, который будет запускать проверку заказов и инициировать возврат:
if ( ! wp_next_scheduled( 'auto_refund_unconfirmed_orders' ) ) {
wp_schedule_event( time(), 'hourly', 'auto_refund_unconfirmed_orders' );
}
add_action( 'auto_refund_unconfirmed_orders', 'auto_refund_unconfirmed_orders_callback' );
function auto_refund_unconfirmed_orders_callback() {
$args = [
'limit' => -1,
'status' => [ 'pending', 'on-hold' ],
'date_created' => '<' . ( time() - 86400 ), // старше 24 часов
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
if ( ! $order->has_status( 'completed' ) && ! $order->has_status( 'cancelled' ) ) {
// Проверяем, был ли уже возврат
$refunds = $order->get_refunds();
if ( empty( $refunds ) ) {
try {
$amount = $order->get_total();
$refund = wc_create_refund( array(
'amount' => $amount,
'reason' => 'Автоматический возврат за неподтверждённый заказ',
'order_id' => $order->get_id(),
'refund_payment' => true,
) );
// Меняем статус заказа на отменён
$order->update_status( 'cancelled', 'Автоматический возврат выполнен.' );
} catch ( Exception $e ) {
error_log( 'Ошибка возврата заказа ID ' . $order->get_id() . ': ' . $e->getMessage() );
}
}
}
}
}
3. Настройка уведомлений покупателю
Чтобы покупатель получил уведомление о возврате, можно использовать стандартные email-шаблоны WooCommerce с кастомизацией:
add_action( 'woocommerce_order_status_cancelled', function( $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
WC()->mailer()->emails['WC_Email_Cancelled_Order']->trigger( $order_id );
}
} );
Проверка результата после внедрения решения
- В разделе WooCommerce → Заказы убедитесь, что неподтверждённые заказы старше 24 часов автоматически меняют статус на
cancelled. - Проверьте наличие записей о возвратах в заказах и историю транзакций платежной системы (например, PayPal или Stripe).
- Проверьте, пришли ли уведомления покупателям о возврате средств.
- В логе ошибок WordPress не должно быть сообщений об ошибках возврата.
Частые ошибки и как их исправить
- Проблема с запуском WP-Cron: Если сайт получает мало трафика, WP-Cron может не запускаться вовремя. Решение — настроить системный cron на сервере для вызова WP-Cron.
Команда для системного cron (пример):wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Отсутствие возврата в платежной системе: Убедитесь, что используемый платежный шлюз поддерживает автоматические возвраты через API WooCommerce и что ключи API корректны.
- Права доступа и безопасность: Проверьте, что ваш код не вызывает возврат средств по ошибке для не тех заказов. Добавьте логи и проверки.
- Не приходят уведомления: Проверьте настройки email WooCommerce, SMTP-сервер и шаблоны писем.
Практические советы по безопасности и производительности
- Ограничьте период проверки заказов (например, только за последние 7 дней), чтобы не перегружать базу.
- Добавьте логирование успешных и неуспешных возвратов для аудита.
- Используйте транзакции базы данных, если ваш сервер и WooCommerce их поддерживают, чтобы избежать проблем с целостностью данных.
- При тестировании на продакшене сначала отключите автоматический запуск и запускайте функцию вручную, чтобы проверить логику.
- Рассмотрите возможность интеграции с плагинами для отчетности и мониторинга заказов, например, Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpexpert.ru&utm_medium=article&utm_campaign=woocommerce-kak-ustanovit-i-nastroit-avtomaticheskoe-vozvrashhenie-deneg-posle-nepodtverzhdennyh-zakazov), чтобы улучшить управление процессом.
Сравнение вариантов реализации автоматического возврата
| Вариант | Плюсы | Минусы |
|---|---|---|
| Ручное управление возвратами | Полный контроль, минимальный риск ошибок | Трудозатратно, медленно, риск пропуска заказов |
| Плагины автоматизации возвратов | Простота настройки, готовый функционал | Зависимость от сторонних разработчиков, возможны конфликты |
| Код на functions.php с WP-Cron | Гибкость, полный контроль, отсутствие сторонних плагинов | Необходимы навыки программирования, возможные проблемы с WP-Cron |