Интеграция платёжного шлюза в WooCommerce
Клиент приходит с задачей подключить региональный банк, которого нет в списке готовых плагинов. Стандартный WooCommerce не умеет работать с нестандартными API. Начинаются костыли: форки чужих модулей, потеря данных, неработающие возвраты. Мы решаем это раз и навсегда — пишем кастомный gateway под ваш стек, с полным контролем над кодом.
Недавно мы интегрировали шлюз для латвийского банка Citadele: написание gateway-класса заняло три дня, ещё день — отладка вебхуков. После релиза заказчик получил не только работающий плагин, но и полную документацию по эксплуатации. Особенно остро стоит вопрос безопасности: старые плагины не проверяют подписи вебхуков, что открывает путь для фальшивых колбэков. Мы внедряем проверку через hash_equals и строгую валидацию входящих запросов.
Недостатки стандартных плагинов
- Устаревшие версии — многие популярные gateway-плагины не обновлялись годами, используют устаревшие классы вроде
WC_APIи несовместимы с PHP 8.2+. - Нет поддержки webhook — половина проблем с оплатой решается правильной обработкой колбэков, но в готовых плагинах её либо нет, либо она кривая.
- Частичные возвраты — если нужно вернуть часть заказа (частичный capture), большинство плагинов просто не вызывают
process_refund. - Сложная кастомизация — допилить свою логику (например, добавить метку платежа в админке) в чужой плагин без риска поломать всё при обновлении — тот ещё квест.
Архитектура кастомного gateway
Базовый класс наследуется от WC_Payment_Gateway. Весь платёжный путь — от редиректа на страницу оплаты до обработки вебхука — замыкается в трёх файлах:
wp-content/plugins/mypay-gateway/ ├── mypay-gateway.php # Точка входа, регистрация ├── includes/ │ ├── class-wc-gateway-mypay.php │ └── class-mypay-api-client.php └── assets/ └── js/checkout.js Класс gateway регистрируется в woocommerce_payment_gateways. В конструкторе мы задаём supports — обязательно ['products', 'refunds'], опционально ['subscriptions']. Вот минимальный набор полей формы:
$this->form_fields = [ 'enabled' => ['title' => 'Включить', 'type' => 'checkbox', 'default' => 'yes'], 'title' => ['title' => 'Название', 'type' => 'text', 'default' => 'Банковская карта'], 'api_key' => ['title' => 'API Key', 'type' => 'password'], 'secret_key' => ['title' => 'Secret Key', 'type' => 'password'], 'testmode' => ['title' => 'Тестовый режим', 'type' => 'checkbox', 'default' => 'no'], ]; Сравнение популярных платёжных шлюзов
| Провайдер | Комиссия (примерно) | Webhook | Возвраты | Тестовый режим | Готовый плагин | Наш опыт, проектов |
|---|---|---|---|---|---|---|
| Stripe | 2.9% + 0.30$ | Да | Да | Да | Да (но тяжёлый) | 12 |
| PayPal | 3.49% + 0.49$ | Да | Да | Да | Да | 8 |
| LiqPay | от 1.5% | Да | Да | Да | Нет | 5 |
| Fondy | от 1.7% | Да | Да | Да | Нет | 4 |
| Robokassa | от 3.5% | Да | Нет | Да | Да (устарел) | 3 |
Таблица приблизительная — комиссии меняются. Главное: если у вас высокие требования к надёжности и нужны возвраты, лучше Stripe. Если бюджет ограничен — LiqPay или Fondy, но они без готового плагина.
Типичные ошибки при интеграции
- Неверная проверка подписи вебхука — используем
hash_equalsдля защиты от timing attack. - Отсутствие обработки статуса
pending— заказ может висеть в «Ожидании» вечно, если не обработать колбэк. - Игнорирование частичных возвратов — клиент не может вернуть часть товара, приходится переделывать.
- Хардкод URL вебхука — при смене домена всё ломается; используем
home_url('/wc-api/mypay_callback').
Как обеспечить безопасность вебхуков?
Для защиты от поддельных колбэков мы применяем проверку подписи с помощью hash_equals и HMAC. Дополнительно фильтруем IP-адреса провайдера, логируем все входящие запросы. WordPress Coding Standards рекомендуют проверять nonce и капабилити, но для вебхуков этого недостаточно — нужна криптографическая подпись. Пример проверки:
function verify_webhook_signature($payload, $signature, $secret) { $expected = hash_hmac('sha256', $payload, $secret); return hash_equals($expected, $signature); } Какие тесты мы проводим?
- Юнит-тесты PHPUnit для API-клиента: проверяем корректную сериализацию запросов, обработку ошибок, таймауты.
- Интеграционные тесты в сэндбоксе провайдера с Ngrok: эмулируем полный цикл оплаты, вебхуки, частичные возвраты.
- Ручное тестирование в админке: проверяем кнопку «Возврат», логи, статусы заказов.
Все тесты прогоняются в CI перед деплоем.
Процесс разработки
- Аналитика — знакомимся с REST API провайдера, собираем требования (одностадийная оплата, подписки, возвраты).
- Проектирование — рисуем диаграмму состояний заказа, согласовываем схему вебхуков.
- Реализация — пишем gateway-класс, API-клиент, обработку вебхука. В среднем 2–4 дня на базовую интеграцию.
- Тестирование — юнит-тесты, ручное тестирование в сэндбоксе с Ngrok.
- Деплой и документация — заливаем на боевой, обучаем админа, передаём README с примерами запросов.
Что входит в работу
- Полный исходный код плагина в вашем репозитории (GitLab/GitHub).
- Документация по установке, настройке и эксплуатации (README с примерами запросов).
- Обучение администратора работе с плагином (настройка шлюза, просмотр логов, возвраты).
- Гарантийная поддержка 14 дней после сдачи, включая бесплатные доработки по текущему шлюзу.
Сроки и стоимость
Базовая интеграция одного шлюза занимает от 2 до 5 рабочих дней. Стоимость рассчитывается индивидуально — зависит от сложности API провайдера и необходимости дополнительных функций (подписки, мультивалютность). Оценим ваш проект за один рабочий день. Получите консультацию по интеграции вашего шлюза — свяжитесь с нами по email или через форму на сайте. Закажите интеграцию, и мы подготовим предложение.
Гарантии
- Код соответствует WordPress Coding Standards.
- Полная обратная совместимость с WooCommerce 8+.
- Все методы защищены от прямого вызова — используем
wp_dieс корректными кодами ответа. - Наши решения проверены на 20+ проектах, включая крупные интернет-магазины с оборотом >1 млн руб./мес.
Свяжитесь с нами, чтобы обсудить ваш проект — мы подготовим предложение и сроки.







