Как создать индивидуальный платежный шлюз в WordPress

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

Что такое платежный шлюз и зачем он нужен в WordPress

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

Индивидуальный платежный шлюз позволяет:

  • Поддерживать уникальные методы оплаты или локальные платежные системы.
  • Добавлять собственную логику обработки платежей.
  • Обеспечивать дополнительную безопасность и контроль.

Далее рассмотрим, как создать такой шлюз на примере WooCommerce — самой популярной платформы для интернет-магазинов на WordPress.

Создание платежного шлюза в WooCommerce: базовая структура

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

<?php
// Файл: wp-content/plugins/wppay-custom-gateway/wppay-custom-gateway.php

if ( ! defined( 'ABSPATH' ) ) exit; // Защита от прямого доступа

/**
 * Инициализация платежного шлюза
 */
add_filter( 'woocommerce_payment_gateways', 'wppay_add_custom_gateway' );
function wppay_add_custom_gateway( $gateways ) {
    $gateways[] = 'WC_WPPAY_Custom_Gateway';
    return $gateways;
}

/**
 * Класс платежного шлюза
 */
class WC_WPPAY_Custom_Gateway extends WC_Payment_Gateway {
    public function __construct() {
        $this->id = 'wppay_custom';
        $this->method_title = 'WPPay Custom Gateway';
        $this->has_fields = true; // Поля на странице оплаты

        // Загрузка настроек
        $this->init_form_fields();
        $this->init_settings();

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

        // Сохранение настроек
        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' => 'Включить/выключить',
                'type' => 'checkbox',
                'label' => 'Включить WPPay Custom Gateway',
                'default' => 'yes'
            ),
            'title' => array(
                'title' => 'Название метода оплаты',
                'type' => 'text',
                'default' => 'Оплата через WPPay'
            ),
            'description' => array(
                'title' => 'Описание',
                'type' => 'textarea',
                'default' => 'Оплата с использованием кастомного платежного шлюза WPPay'
            ),
        );
    }

    /**
     * Отображение полей на странице оплаты
     */
    public function payment_fields() {
        echo '<p>Введите данные для оплаты через WPPay.</p>';
        // Здесь можно добавить кастомные поля, например:
        echo '<p><label>Номер карты:<input type="text" name="wppay_card_number" required /></label></p>';
    }

    /**
     * Обработка платежа
     */
    public function process_payment( $order_id ) {
        $order = wc_get_order( $order_id );

        // Проверка данных и логика отправки запроса в платежный сервис
        // Для примера допустим, что платеж прошел успешно

        $order->payment_complete(); // Отметить заказ оплаченным
        $order->reduce_order_stock(); // Списать товар

        // Очистка корзины
        WC()->cart->empty_cart();

        // Редирект на страницу благодарности
        return array(
            'result' => 'success',
            'redirect' => $this->get_return_url( $order )
        );
    }
}
?>

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

Расширение функционала: интеграция с API платежного провайдера

Чтобы шлюз стал полноценным, нужно интегрировать его с API платежной системы. Рассмотрим базовый пример, как отправить запрос на сервер и обработать ответ.

Предположим, у вас есть API с методом POST по адресу https://api.paymentprovider.com/pay, который принимает JSON с параметрами:

  • amount — сумма
  • card_number — номер карты
  • order_id — ID заказа

Добавим в метод process_payment отправку запроса:

public function process_payment( $order_id ) {
    $order = wc_get_order( $order_id );
    $card_number = sanitize_text_field( $_POST['wppay_card_number'] ?? '' );

    if ( empty( $card_number ) ) {
        wc_add_notice( 'Пожалуйста, введите номер карты.', 'error' );
        return;
    }

    $request_body = json_encode(array(
        'amount' => $order->get_total(),
        'card_number' => $card_number,
        'order_id' => $order_id
    ));

    $response = wp_remote_post('https://api.paymentprovider.com/pay', array(
        'headers' => array('Content-Type' => 'application/json'),
        'body' => $request_body,
        'timeout' => 20
    ));

    if ( is_wp_error( $response ) ) {
        wc_add_notice( 'Ошибка соединения с платежным сервисом.', 'error' );
        return;
    }

    $response_code = wp_remote_retrieve_response_code( $response );
    $response_body = json_decode( wp_remote_retrieve_body( $response ), true );

    if ( $response_code === 200 && $response_body['status'] === 'success' ) {
        $order->payment_complete();
        $order->reduce_order_stock();
        WC()->cart->empty_cart();

        return array(
            'result' => 'success',
            'redirect' => $this->get_return_url( $order )
        );
    } else {
        wc_add_notice( 'Платёж отклонён: ' . ( $response_body['message'] ?? 'неизвестная ошибка' ), 'error' );
        return;
    }
}

Обратите внимание на проверку ошибок и валидацию входных данных — это важно для безопасности и стабильности.

Обеспечение безопасности платежного шлюза в WordPress

Платежные данные — одна из самых уязвимых частей сайта. Вот основные рекомендации по безопасности:

  • Используйте SSL (https) для всего сайта.
  • Не храните данные карт на сервере.
  • Валидация и санитизация всех пользовательских данных.
  • Используйте nonce для проверки форм.
  • Обрабатывайте ошибки корректно, не раскрывая внутреннюю информацию.
  • Отдельно тестируйте шлюз в песочнице (sandbox) платежного провайдера.

Пример добавления nonce в форму платежа:

public function payment_fields() {
    wp_nonce_field( 'wppay_custom_payment', 'wppay_custom_nonce' );
    echo '<p><label>Номер карты:<input type="text" name="wppay_card_number" required /></label></p>';
}

И проверка nonce в process_payment:

if ( ! isset( $_POST['wppay_custom_nonce'] ) || ! wp_verify_nonce( $_POST['wppay_custom_nonce'], 'wppay_custom_payment' ) ) {
    wc_add_notice( 'Ошибка безопасности. Пожалуйста, обновите страницу и попробуйте снова.', 'error' );
    return;
}

Полезные плагины для разработки и тестирования платежных шлюзов

Для удобства разработки и тестирования можно использовать следующие плагины:

  • Clearfy Pro — оптимизация и безопасность WordPress.
  • WPCommunity — для организации обратной связи и поддержки пользователей.

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

Заключение

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

Если вы хотите глубже разобраться с тонкостями платежей в WordPress, рекомендуем ознакомиться с другими статьями на WPSHOP.

WooCommerce: как разрешить оплату в разных валютах с проверкой и настройкой
21.04.2026
Как отладить проблемы с подключением платежных систем в WordPress
02.02.2026
Как настроить безопасные платежные формы в WordPress
21.12.2025
Как создать автоматическую отчетность по платежам в WordPress
26.12.2025
Как использовать вебхуки для платежей в WordPress
15.01.2026