wp-kurs.ru wordpress WP-Kurs

WooCommerce: отмена и возврат платежей программно с примерами кода

Диагностика задачи: когда нужен программный возврат и отмена заказа

В стандартном WooCommerce возврат средств и отмена заказов выполняются вручную через админку. Но в ряде случаев требуется автоматизация — например, при интеграции с внешними системами, массовой обработке заказов или нестандартных бизнес-процессах. Программное управление возвратами позволяет:

  • Автоматизировать отмену и возврат по определенным условиям (например, по статусу заказа, дате, причине);
  • Интегрироваться с API платежных шлюзов;
  • Обрабатывать возвраты массово через WP-CLI или кастомные скрипты;
  • Сократить время поддержки клиентов.

Перед интеграцией нужно проверить, поддерживает ли ваш платежный шлюз возврат через API и есть ли в WooCommerce соответствующие функции.

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

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

Для начала нужно получить объект заказа (WC_Order). Например, по ID заказа:

$order_id = 123; // ID вашего заказа
$order = wc_get_order($order_id);
if (!$order) {
    return; // Заказ не найден
}

2. Проверка статуса заказа и возврата

Убедитесь, что заказ в статусе, позволяющем возврат (например, 'processing' или 'completed') и что возврат еще не был выполнен.

3. Создание возврата (refund) средствами WooCommerce

WooCommerce имеет класс WC_Refund для создания возвратов. Ниже пример создания возврата на всю сумму заказа:

function create_refund_for_order($order) {
    $amount = $order->get_total();
    $refund = wc_create_refund(array(
        'amount'         => $amount,
        'reason'         => 'Автоматический возврат',
        'order_id'       => $order->get_id(),
        'refund_payment' => true, // Попытка возврата через шлюз
    ));

    if (is_wp_error($refund)) {
        error_log('Ошибка возврата: ' . $refund->get_error_message());
        return false;
    }
    return true;
}

Обратите внимание, параметр 'refund_payment' => true попытается сделать возврат через платежный шлюз, если он поддерживает автоматический возврат.

4. Изменение статуса заказа после возврата

Если возврат успешен, рекомендуется сменить статус заказа, например, на refunded:

if (create_refund_for_order($order)) {
    $order->update_status('refunded', 'Заказ отменен и возвращены средства автоматически');
}

Проверка результата после внедрения

  • В админке WooCommerce проверьте, что у заказа появился возврат (Refund) с нужной суммой и статусом.
  • Проверьте в платежном шлюзе, что возврат был проведен (если поддерживается автоматический возврат).
  • При необходимости, создайте тестовый заказ и выполните возврат программно, чтобы убедиться в корректности работы.

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

  • Ошибка: Возврат не создается, возвращается WP_Error.
    Причина: Неверный ID заказа, заказ не в подходящем статусе или не поддерживается возврат платежным шлюзом.
    Решение: Проверьте статус заказа, логируйте ошибки с помощью error_log().
  • Ошибка: Возврат создается, но средства не возвращаются клиенту.
    Причина: Платежный шлюз не поддерживает автоматический возврат или отсутствует интеграция.
    Решение: Проверьте документацию платежного шлюза, возможно, нужно вручную запускать возврат в кабинете шлюза.
  • Ошибка: Статус заказа не меняется после возврата.
    Причина: Метод update_status() не вызывается или вызывается некорректно.
    Решение: Вызовите $order->save() после смены статуса для сохранения изменений.

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

  • Всегда проверяйте права пользователя перед выполнением возврата (например, current_user_can('manage_woocommerce')).
  • Логируйте ошибки возврата в отдельный файл или систему мониторинга.
  • Не делайте массовые возвраты в один запрос — используйте очереди или WP-Cron для распределения нагрузки.
  • Обновляйте WooCommerce и плагины платежных шлюзов, чтобы иметь актуальные API и исправления безопасности.

Сравнение методов автоматического возврата в WooCommerce

МетодПлюсыМинусыКогда использовать
WC_Refund с refund_payment=trueАвтоматический возврат через шлюз, единый API WooCommerceЗависит от поддержки шлюза, возможны ошибки при несовместимостиЕсли платежный шлюз поддерживает автоматические возвраты
API платежного шлюза напрямуюПолный контроль, можно реализовать любые сценарииТребуется отдельная интеграция, сложность поддержкиКогда нужен кастомный сценарий или нестандартный платежный шлюз
Ручной возврат через админкуПростота, не требует кодаНе подходит для автоматизации и массовых возвратовДля редких случаев и небольших магазинов
×
WPShop
партнерка без «но»!

До 3225₽ за каждую продажу

Подключиться к игре