Диагностика проблемы: когда нужен кастомный платежный шлюз
Стандартные плагины 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 | Сложные решения, мультиканальные платежи |