Диагностика задачи: зачем нужна отложенная оплата в WooCommerce
Отложенная оплата — это возможность для покупателей оформить заказ на сайте, но оплатить его позже. Это удобно для B2B-клиентов, корпоративных заказов или при необходимости согласования с бухгалтерией. WooCommerce не поддерживает такую функцию из коробки, поэтому нужна настройка через дополнительные инструменты и интеграцию с платежными системами, например, Polygon.
Как работает отложенная оплата с Polygon в WooCommerce
Polygon — популярный сервис для приема платежей в России, поддерживающий различные методы оплаты. Для отложенной оплаты нужна логика, которая позволит создать заказ со статусом «ожидает оплату» и отправить клиенту ссылку на оплату позже (например, в письме). После оплаты статус заказа автоматически обновится.
Основные этапы реализации:
- Добавление метода оплаты «Отложенная оплата» в WooCommerce;
- Интеграция с Polygon для генерации платежных ссылок;
- Обработка статусов оплаты через вебхуки Polygon;
- Обновление статуса заказа после оплаты.
Пошаговое решение: настройка и код для отложенной оплаты через Polygon
1. Добавляем метод оплаты «Отложенная оплата»
Создаем кастомный класс метода оплаты, используя стандартный шаблон WooCommerce:
add_action('plugins_loaded', 'register_delayed_payment_method');
function register_delayed_payment_method() {
if (!class_exists('WC_Payment_Gateway')) return;
class WC_Gateway_Delayed_Payment extends WC_Payment_Gateway {
public function __construct() {
$this->id = 'delayed_payment';
$this->method_title = __('Отложенная оплата', 'woocommerce');
$this->has_fields = false;
$this->init_settings();
$this->title = $this->get_option('title');
$this->description = $this->get_option('description');
$this->enabled = $this->get_option('enabled');
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
}
public function init_form_fields() {
$this->form_fields = array(
'enabled' => array(
'title' => __('Включить/выключить', 'woocommerce'),
'type' => 'checkbox',
'label' => __('Включить отложенную оплату', 'woocommerce'),
'default' => 'yes'
),
'title' => array(
'title' => __('Название', 'woocommerce'),
'type' => 'text',
'default' => __('Отложенная оплата', 'woocommerce')
),
'description' => array(
'title' => __('Описание', 'woocommerce'),
'type' => 'textarea',
'default' => __('Оплатите заказ позже по ссылке, которую мы вам отправим', 'woocommerce')
)
);
}
public function process_payment($order_id) {
$order = wc_get_order($order_id);
// Устанавливаем статус на ожидание оплаты
$order->update_status('on-hold', __('Ожидает отложенной оплаты', 'woocommerce'));
// Очищаем корзину
WC()->cart->empty_cart();
// Возвращаем результат с редиректом на страницу благодарности
return array(
'result' => 'success',
'redirect' => $this->get_return_url($order)
);
}
}
function add_delayed_payment_gateway($methods) {
$methods[] = 'WC_Gateway_Delayed_Payment';
return $methods;
}
add_filter('woocommerce_payment_gateways', 'add_delayed_payment_gateway');
}
2. Интеграция с Polygon для генерации ссылок на оплату
Для генерации платежной ссылки используем API Polygon. Важно хранить ключи API в настройках плагина или в wp-config.php.
function generate_polygon_payment_link($order) {
$api_key = 'ВАШ_API_КЛЮЧ';
$payment_data = array(
'amount' => $order->get_total(),
'currency' => $order->get_currency(),
'order_id' => $order->get_id(),
'description' => 'Оплата заказа #' . $order->get_id(),
'callback_url' => site_url('/polygon-webhook')
);
$response = wp_remote_post('https://api.polygon.io/payments/create', array(
'headers' => array(
'Authorization' => 'Bearer ' . $api_key,
'Content-Type' => 'application/json'
),
'body' => json_encode($payment_data)
));
if (is_wp_error($response)) {
return false;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (isset($body['payment_link'])) {
return $body['payment_link'];
}
return false;
}
Примечание: URL и параметры API указаны для примера. Реальный API Polygon уточняйте в документации.
3. Отправка ссылки на оплату клиенту
При переходе на страницу благодарности или при смене статуса заказа на «on-hold» нужно отправить письмо с платежной ссылкой. Пример хука:
add_action('woocommerce_order_status_on-hold', 'send_delayed_payment_link', 10, 1);
function send_delayed_payment_link($order_id) {
$order = wc_get_order($order_id);
$payment_link = generate_polygon_payment_link($order);
if (!$payment_link) return;
$to = $order->get_billing_email();
$subject = 'Ссылка для оплаты вашего заказа #' . $order_id;
$message = 'Здравствуйте!\nДля оплаты вашего заказа перейдите по ссылке: ' . $payment_link;
wp_mail($to, $subject, $message);
}
4. Обработка вебхуков от Polygon для обновления статуса оплаты
Создайте эндпоинт в WordPress для приема уведомлений о статусе оплаты:
add_action('init', 'register_polygon_webhook_endpoint');
function register_polygon_webhook_endpoint() {
if ($_SERVER['REQUEST_URI'] === '/polygon-webhook') {
$payload = file_get_contents('php://input');
$data = json_decode($payload, true);
if (isset($data['order_id']) && isset($data['status'])) {
$order = wc_get_order($data['order_id']);
if ($data['status'] === 'paid') {
$order->payment_complete();
$order->add_order_note('Оплата получена через Polygon');
} elseif ($data['status'] === 'failed') {
$order->update_status('failed', 'Оплата не прошла через Polygon');
}
}
status_header(200);
exit;
}
}
Проверка результата после внедрения
- Создайте тестовый заказ с методом оплаты «Отложенная оплата»;
- Проверьте, что заказ получает статус «on-hold» после оформления;
- Проверьте, что письмо с ссылкой на оплату отправляется на почту;
- Имитируйте вызов вебхука с параметром
status=paidи убедитесь, что статус заказа меняется на «завершен»; - Проверьте логи почтовых отправок и ошибок API.
Частые ошибки и как их исправить
- Письмо с ссылкой не приходит: проверьте настройки SMTP и функцию
wp_mail. Для теста используйте плагин Email Log. - Вебхук не обновляет статус: проверьте правильность URL и формат данных, убедитесь, что WordPress обрабатывает запросы на /polygon-webhook;
- Ошибка при генерации ссылки Polygon: проверьте API ключ и формат запроса, логируйте ответ сервера;
- Статусы заказа не меняются: убедитесь, что функции
payment_complete()иupdate_status()вызываются корректно и нет конфликтов с другими плагинами.
Практические советы по безопасности и производительности
- Для защиты вебхука добавьте проверку подписи или токена в заголовках запроса;
- Используйте transient API для кеширования ответов от Polygon при генерации платежных ссылок, чтобы не перегружать API;
- Храните API ключи в
wp-config.phpили в настройках плагина с шифрованием; - Ограничьте доступ к эндпоинту вебхука по IP, если это возможно;
- Логируйте все ошибки и статусы в отдельный файл для отладки и мониторинга.
Сравнение вариантов реализации отложенной оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин от Polygon (если есть) | Готовое решение под интеграцию | Быстрая установка, поддержка | Зависимость от стороннего кода, возможные ограничения |
| Кастомный код с API Polygon | Полный контроль над логикой оплаты и уведомлений | Гибкость, расширяемость, можно интегрировать в бизнес-процессы | Требует поддержки и тестирования, сложнее внедрять |
| Использование других методов оплаты и ручная отправка счетов | Простейший вариант без интеграции | Простота реализации | Низкая автоматизация, риск пропуска платежей |