Что такое отложенные платежи и зачем они нужны в WooCommerce
Отложенные платежи позволяют покупателям оформить заказ, но оплатить его позже — например, после проверки товара или по согласованию. В стандартном WooCommerce такой функционал отсутствует, и все заказы считаются оплаченными сразу или ожидающими оплаты через сторонние платежные системы.
Реализация отложенных платежей напрямую через код поможет гибко настраивать логику оплаты, не устанавливая дополнительные плагины, которые могут утяжелять сайт или конфликтовать с другими расширениями.
Диагностика проблемы: почему стандартный WooCommerce не поддерживает отложенную оплату
По умолчанию WooCommerce использует статусы заказов, которые отражают этапы оплаты и обработки:
pending— заказ создан, но оплата не начата;processing— оплата подтверждена, идет обработка;on-hold— заказ поставлен на удержание, ожидание оплаты или подтверждения;completed— заказ выполнен;cancelledиfailed— отменён или неудачный заказ.
Чтобы реализовать отложенную оплату, нужно управлять статусами и разрешать покупателю оформлять заказ со статусом on-hold без немедленной оплаты, а затем дать возможность оплатить позже.
Пошаговое решение: добавляем поддержку отложенной оплаты через код
1. Добавление метода оплаты "Оплата позже"
Создадим кастомный метод оплаты, который будет переводить заказ в статус on-hold и не требовать оплату сразу.
add_filter('woocommerce_payment_gateways', 'add_later_payment_gateway');
function add_later_payment_gateway($gateways) {
$gateways[] = 'WC_Gateway_Later_Payment';
return $gateways;
}
class WC_Gateway_Later_Payment extends WC_Payment_Gateway {
public function __construct() {
$this->id = 'later_payment';
$this->method_title = 'Оплата позже';
$this->method_description = 'Позволяет оформить заказ и оплатить позже';
$this->has_fields = false;
$this->init_settings();
$this->title = $this->get_option('title');
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
}
public function process_payment($order_id) {
$order = wc_get_order($order_id);
// Устанавливаем статус заказа "on-hold"
$order->update_status('on-hold', 'Заказ ожидает оплату позже');
WC()->cart->empty_cart();
return array(
'result' => 'success',
'redirect' => $this->get_return_url($order)
);
}
}2. Настройка метода оплаты в админке
Перейдите в WooCommerce > Настройки > Платежи и включите метод "Оплата позже". В настройках можно задать название, которое увидит покупатель.
3. Добавление уведомления покупателю с инструкциями по оплате
Чтобы покупатель знал, что нужно оплатить заказ позже, добавим сообщение на страницу подтверждения заказа и в письма.
add_action('woocommerce_thankyou_later_payment', 'custom_later_payment_thankyou_message');
function custom_later_payment_thankyou_message($order_id) {
echo '<p>Спасибо за заказ! Вы выбрали оплату позже. Пожалуйста, свяжитесь с нами для подтверждения оплаты.</p>';
}
add_action('woocommerce_email_before_order_table', 'custom_later_payment_email_message', 10, 4);
function custom_later_payment_email_message($order, $sent_to_admin, $plain_text, $email) {
if ($order->get_payment_method() === 'later_payment') {
echo '<p>Вы выбрали оплату позже. Пожалуйста, оплатите заказ после получения подтверждения.</p>';
}
}4. Создание страницы или механизма для последующей оплаты
Для реализации оплаты после оформления заказа можно использовать стандартную систему WooCommerce "Оплатить заказ" по ссылке /checkout/order-pay/{order_id}/, где покупатель сможет выбрать другой способ оплаты и завершить оплату.
Если нужно, можно отправлять эту ссылку клиенту вручную или автоматизировать отправку письма с ней.
Проверка результата после внедрения
- Перейдите в магазин и оформите заказ, выбрав метод оплаты "Оплата позже".
- После оформления заказ должен получить статус
on-hold. - Покупатель должен увидеть сообщение с инструкциями.
- В админке WooCommerce > Заказы можно проверить статус заказа и отправить ссылку для последующей оплаты.
- Покупатель может перейти по ссылке
/checkout/order-pay/{order_id}/и оплатить заказ обычным способом.
Частые ошибки и как их исправлять
- Метод оплаты не отображается на фронте: Проверьте, что класс метода оплаты зарегистрирован и добавлен через фильтр
woocommerce_payment_gateways. - Заказ не меняет статус на
on-hold: Убедитесь, что в методеprocess_paymentвызвана функция$order->update_status('on-hold')до очистки корзины. - Письма с инструкциями не отправляются: Проверьте, что хук
woocommerce_email_before_order_tableкорректно добавлен, и метод оплаты совпадает с ID вашего шлюза. - Покупатель не может оплатить заказ позже: Проверьте, что ссылка
/checkout/order-pay/{order_id}/доступна и заказ не отменён или не завершён.
Практические советы по безопасности и производительности
- Не храните платежные данные при отложенной оплате; используйте встроенные методы WooCommerce для повторного проведения оплаты, чтобы избежать утечек данных.
- Регулярно проверяйте заказы со статусом
on-holdи очищайте неактивные, чтобы не захламлять базу. - Используйте nonce и проверки прав пользователя при реализации дополнительных функций по оплате, чтобы избежать несанкционированных изменений заказов.
- Оптимизируйте уведомления, чтобы не дублировать сообщения в письмах и на сайте.
Сравнение вариантов реализации отложенных платежей
| Способ | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Плагин (например, WooCommerce Deposits) | Готовое решение с настройками, поддержка частичной оплаты | Дополнительная нагрузка, может конфликтовать с другими плагинами, платные версии | Если нужна сложная логика и частичная оплата — использовать |
| Кастомный метод оплаты (кодом) | Минимальная нагрузка, полный контроль, адаптивность под задачи | Требует знаний PHP и WooCommerce API, нужно самостоятельно поддерживать | Подходит для простых сценариев и опытных разработчиков |
Использование стандартного статуса on-hold без изменений | Просто, без кода | Нет удобного интерфейса для оплаты позже, пользователь может запутаться | Подходит для небольших магазинов без требований к UX |