Как создать платёжный модуль на PHP, который будет работать с любой системой
Ты разработчик. У тебя есть сайт, магазин, сервис — и тебе нужно принять оплату. Но платёжные шлюзы вроде Stripe, PayPal или Сбербанка не подходят: они не интегрируются с твоей CMS, не работают с твоей логикой скидок, не поддерживают нужные способы оплаты, или ты просто хочешь контролировать весь процесс. Ты не хочешь зависеть от чужих API, которые ломаются без предупреждения. Ты хочешь свой модуль — гибкий, надёжный, и чтобы его можно было подключить к любой системе. Это возможно. И я покажу, как сделать это без лишней сложности.
Почему не использовать готовые решения?
Готовые плагины — это удобно, пока они работают. Но когда у тебя:
- Своя система учёта заказов с кастомными статусами;
- Нужно обрабатывать оплату по SMS-коду или через криптовалюту;
- Ты работаешь в стране, где нет поддержки Stripe;
- Или тебе нужно логировать каждое действие в своей базе, а не в логах платёжной системы;
— тогда готовые решения начинают мешать. Они требуют костылей, переопределений, хаков. А ты хочешь, чтобы всё работало как часы — без зависимостей.
Создать свой модуль — значит получить полный контроль. Ты сам решаешь, как обрабатывать ошибки, как хранить данные, как уведомлять пользователя. И главное — ты не привязан к одному провайдеру. Модуль можно подключить к любому шлюзу: Сбер, Тинькофф, Qiwi, ЮKassa, даже к локальному терминалу.
Как устроен платёжный модуль: простая схема
Платёжный модуль — это не монолит. Это интерфейс между твоей системой и внешним платёжным сервисом. Он должен выполнять три задачи:
- Принять данные заказа от твоей системы (сумма, ID, email, описание).
- Перенаправить пользователя на платёжный шлюз (или открыть форму оплаты).
- Принять и обработать ответ от шлюза (успешно/ошибка), обновить статус заказа и уведомить пользователя.
Всё. Больше ничего не нужно. Ни базы данных для платежей, ни сложной логики — только чистый обмен данными.
Вот как это выглядит на практике:
- Пользователь нажимает «Оплатить» на сайте → твой модуль создаёт заказ в твоей БД (статус: ожидает оплаты).
- Модуль генерирует ссылку на платёжный шлюз с нужными параметрами (сумма, ID заказа, URL-возврата).
- Пользователь переходит на сайт шлюза, оплачивает.
- Шлюз отправляет POST-запрос на твой сервер с результатом (например,
/payment/webhook). - Твой модуль проверяет подпись, сверяет сумму, обновляет статус заказа → отправляет письмо пользователю.
Ты не пишешь код для каждого шлюза отдельно. Ты пишешь один модуль, который умеет работать с разными шлюзами через единый интерфейс.
Архитектура: интерфейс + адаптеры
Вот как это реализуется на PHP. Создаём два ключевых элемента:
1. Интерфейс PaymentGateway
Он описывает, что должен уметь делать любой платёжный модуль:



