Создание собственного платежного шлюза в 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.