WooCommerce: установка и настройка отложенной оплаты с использованием Polygon

Диагностика задачи: зачем нужна отложенная оплата в 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Полный контроль над логикой оплаты и уведомленийГибкость, расширяемость, можно интегрировать в бизнес-процессыТребует поддержки и тестирования, сложнее внедрять
Использование других методов оплаты и ручная отправка счетовПростейший вариант без интеграцииПростота реализацииНизкая автоматизация, риск пропуска платежей

Наш каталог плагинов WordPress