WooCommerce: как правильно подключить платежные шлюзы без плагинов

Диагностика проблемы: когда нужен кастомный платежный шлюз

Стандартные плагины WooCommerce не всегда подходят под требования бизнеса: например, если требуется интеграция с локальным банком или уникальным способом оплаты, для которого нет готового плагина. Также бывают случаи, когда плагины конфликтуют с другими элементами сайта, замедляют его или обладают избыточным функционалом.

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

Основные шаги подключения платежного шлюза вручную

1. Создание собственного класса платежного шлюза

WooCommerce позволяет регистрировать собственные классы оплаты, наследующиеся от WC_Payment_Gateway. В этом классе описывается вся логика работы с платежами.

class WC_Gateway_Custom_Payment extends WC_Payment_Gateway {
    public function __construct() {
        $this->id = 'custom_gateway';
        $this->method_title = __('Custom Gateway', 'woocommerce');
        $this->has_fields = false;

        // Инициализация настроек
        $this->init_form_fields();
        $this->init_settings();

        $this->title = $this->get_option('title');
        $this->description = $this->get_option('description');

        // Обработчик оплаты
        add_action('woocommerce_api_' . strtolower(get_class($this)), array($this, 'handle_response'));
    }

    public function init_form_fields() {
        $this->form_fields = array(
            'enabled' => array(
                'title' => __('Enable/Disable', 'woocommerce'),
                'type' => 'checkbox',
                'label' => __('Enable Custom Payment Gateway', 'woocommerce'),
                'default' => 'yes'
            ),
            'title' => array(
                'title' => __('Title', 'woocommerce'),
                'type' => 'text',
                'default' => __('Custom Payment', 'woocommerce')
            ),
            'description' => array(
                'title' => __('Description', 'woocommerce'),
                'type' => 'textarea',
                'default' => __('Pay securely using our custom gateway.', 'woocommerce')
            ),
        );
    }

    public function process_payment($order_id) {
        $order = wc_get_order($order_id);

        // Логика создания платежа: например, редирект на платежный шлюз
        return array(
            'result' => 'success',
            'redirect' => $this->get_payment_url($order)
        );
    }

    private function get_payment_url($order) {
        // Формируем URL платежа, например на стороне шлюза
        return 'https://your-payment-gateway.example/pay?order_id=' . $order->get_id();
    }

    public function handle_response() {
        // Обработка ответа от платежного шлюза
        $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
        $order = wc_get_order($order_id);

        if (!$order) {
            wp_die('Invalid order');
        }

        // Проверяем статус оплаты, подписи и т.п.
        // Если оплата успешна:
        $order->payment_complete();
        wp_redirect($this->get_return_url($order));
        exit;
    }
}

2. Регистрация собственного шлюза в WooCommerce

Чтобы WooCommerce начал использовать ваш класс, нужно добавить его в список платежных методов:

add_filter('woocommerce_payment_gateways', 'add_custom_gateway_class');
function add_custom_gateway_class($methods) {
    $methods[] = 'WC_Gateway_Custom_Payment';
    return $methods;
}

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

После добавления кода и активации шлюза в админке WooCommerce:

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

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

  • Шлюз не отображается в списке платежных методов. Проверьте, что функция регистрации шлюза подключена и фильтр woocommerce_payment_gateways возвращает корректный класс.
  • Ошибка 404 или пустая страница при обработке ответа от платежного шлюза. Убедитесь, что URL для callback совпадает с хуком woocommerce_api_ и что метод handle_response подключен.
  • Заказ не меняет статус на "оплачен" после успешного платежа. Проверьте, что вызывается метод $order->payment_complete(); и нет ошибок в логах.
  • Редирект на платежный шлюз не происходит. Убедитесь, что метод process_payment возвращает массив с ключом redirect и URL валиден.

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

  • При обработке ответов от платежного шлюза обязательно проверяйте подписи и уникальность запросов, чтобы избежать подделки.
  • Не храните чувствительные данные платежей в базе без шифрования.
  • Используйте wp_safe_redirect() вместо wp_redirect(), если редирект идет на внутренние страницы.
  • Минимизируйте количество внешних запросов в process_payment, чтобы не тормозить оформление заказа.
  • Регистрируйте и логируйте ошибки для быстрого выявления проблем.

Сравнение вариантов реализации подключения платежных шлюзов

ВариантПреимуществаНедостаткиКогда использовать
Готовые плагиныБыстро, поддержка, обновленияМогут быть тяжеловесными, не всегда подходят под задачиСтандартные платежи, популярные шлюзы
Кастомный класс шлюзаМаксимальный контроль, легковесностьТребует разработки и тестированияСпецифичные или локальные шлюзы, уникальные бизнес-процессы
Внешние сервисы с APIГибкость, масштабируемостьНужна интеграция и поддержка APIСложные решения, мультиканальные платежи
Автоматическое изменение статуса заказа WooCommerce при оплате PayPal
07.05.2026
WooCommerce: решение проблемы отключения email-уведомлений о заказах
17.07.2026
Динамический фильтр по тегам товаров WooCommerce: пошаговое создание
13.03.2026
Удаление старых ревизий постов WordPress без плагинов: оптимизация базы данных
01.01.2026
Как создать динамический календарь событий в WordPress с примерами и кодом
24.01.2026

Плагин службы технической поддержки для WordPress. Создание, просмотр и ответ на тикеты. Уведомление пользователей и другие функции.