Диагностика проблемы: зачем нужна автоматизация возвратов в WooCommerce
В стандартном WooCommerce возвраты чаще всего обрабатываются вручную через админку или сторонние плагины. При большом количестве заказов и возвратов это занимает много времени и увеличивает риск ошибок. Автоматизация процесса по заданным условиям (например, возврат по истечении срока, возврат при отмене оплаты) позволяет снизить нагрузку и ускорить обработку.
Как работает обработка возвратов в WooCommerce: ключевые хуки и функции
Возвраты в WooCommerce связаны с объектом WC_Order_Refund. Для создания возврата программно используется функция wc_create_refund(). Основные хуки для обработки статусов заказов:
woocommerce_order_status_changed— срабатывает при изменении статуса заказа;woocommerce_order_refunded— после создания возврата;woocommerce_refund_created— после сохранения возврата.
Пошаговое решение: автоматический возврат средств при отмене оплаченного заказа
Рассмотрим пример, когда при смене статуса заказа на cancelled и условии, что оплата была проведена, автоматически создаётся возврат на полную сумму.
1. Подключение к хуку изменения статуса заказа
add_action('woocommerce_order_status_changed', 'auto_refund_on_cancelled', 10, 4);2. Функция автоматического создания возврата
function auto_refund_on_cancelled($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'cancelled') {
return;
}
// Проверяем, был ли заказ оплачен
if (!$order->is_paid()) {
return;
}
// Проверяем, есть ли уже возврат для этого заказа
$refunds = $order->get_refunds();
if (!empty($refunds)) {
return; // Возврат уже создан
}
$amount = $order->get_total();
if ($amount <= 0) {
return; // Нет суммы для возврата
}
$refund_data = array(
'amount' => $amount,
'reason' => 'Автоматический возврат при отмене заказа',
'order_id' => $order_id,
'refund_payment' => true,
);
$refund = wc_create_refund($refund_data);
if (is_wp_error($refund)) {
error_log('Ошибка создания возврата: ' . $refund->get_error_message());
}
}Проверка результата после внедрения
1. Создайте тестовый заказ и оплатите его (например, через режим песочницы платежного шлюза).
2. В админке WooCommerce измените статус заказа на cancelled.
3. Проверьте журнал заказов — должен появиться возврат на полную сумму.
4. В разделе возвратов убедитесь, что возврат создан и статус платежа обновлён.
5. Проверьте логи ошибок (если включено логирование), чтобы убедиться в отсутствии ошибок.
Частые ошибки и как их исправить
- Возврат не создаётся, хотя статус изменён: проверьте, что заказ действительно оплачен. Метод
$order->is_paid()возвращает false для неоплаченных заказов. - Дублирование возвратов: добавьте проверку на существующие возвраты с помощью
$order->get_refunds(). - Ошибка «Refund failed»: проверьте, поддерживает ли платежный шлюз автоматические возвраты через API и корректно ли настроены ключи и разрешения.
- Возврат создаётся, но деньги не возвращаются: в WooCommerce возврат создаётся локально, но реальный возврат средств зависит от шлюза. Убедитесь, что он поддерживает автоматические возвраты.
Практические советы по безопасности и производительности
- Используйте
is_admin()и проверяйте права пользователя, если добавляете обработку возвратов в пользовательских местах. - Логируйте ошибки возвратов для быстрого выявления проблем.
- Не создавайте возвраты в хуках, которые вызываются слишком часто, чтобы избежать нагрузок.
- При большом количестве заказов используйте асинхронные задачи (например, WP-Cron) для создания возвратов во внепиковое время.
Сравнение подходов автоматизации возвратов в WooCommerce
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| Простая автоматизация возвратов | WooCommerce Smart Refund | Хук woocommerce_order_status_changed + wc_create_refund() | Плагин проще, но менее гибкий, код — требует поддержки |
| Продвинутая логика возвратов | Расширенные плагины обработки платежей | Кастомные функции с проверкой API платежных систем | Плагины дороже, код сложнее в поддержке |