Криптоплатежи для Marzban VPN
Небольшой сервис на вашем сервере, который продаёт подписки Marzban VPN за криптовалюту через SnapEX Pay. Магазин или Telegram-бот запрашивает у него ссылку на оплату, клиент платит на странице SnapEX Pay (USDT в TRC20, ERC20 или BEP20 и другие способы, доступные для этой суммы), а после оплаты сервис создаёт или продлевает пользователя в панели Marzban и возвращает ссылку на подписку.
Бесплатно. Версия 1.0.0.
Что умеет модуль
- Не нужно держать кошелёк и ноду блокчейна.
POST /v1/checkoutсоздаёт счёт SnapEX Pay по тарифу и возвращаетpay_url;GET /v1/orders/{invoice_id}отдаёт статус и ссылку на подписку — бот может опрашивать его.- Подписанный вебхук (HMAC-SHA256, окно 5 минут). Телу вебхука сервис не доверяет: счёт перечитывается из API SnapEX Pay, пользователь создаётся только для оплаченного счёта.
- Идемпотентность: повторные и одновременные вебхуки создают пользователя по счёту только один раз.
- Новые пользователи получают все протоколы, для которых в панели есть inbound; существующие продлеваются от текущей даты окончания, тарифы с трафиком добавляют новую квоту сверх использованной.
- Тарифы задаются одной переменной окружения, заказы хранятся в SQLite. Тестовый режим — без реальных денег.
Установка
- Скачайте и распакуйте архив, в его папке выполните
cp .env.example .env. - В кабинете мерчанта SnapEX Pay создайте API-ключ с правами
invoices.readиinvoices.writeи впишите его вSNAPEX_API_KEY. - Задайте
API_TOKEN(например,openssl rand -hex 32),MARZBAN_URLи данные администратора Marzban (MARZBAN_USERNAMEиMARZBAN_PASSWORD), тарифы — вPLANS(id:дни:usd:байты_трафика,0— без лимита). - Запустите:
docker compose up -d, проверьтеcurl http://127.0.0.1:8080/health. Поставьте сервис за HTTPS reverse proxy. - В кабинете добавьте вебхук
https://<ваш сервис>/webhookминимум с событиемinvoice.paid, скопируйте его секрет вSNAPEX_WEBHOOK_SECRETи перезапустите сервис. - Из магазина или бота вызывайте
POST /v1/checkoutсAuthorization: Bearer <API_TOKEN>, отправляйте клиентуpay_urlи опрашивайтеGET /v1/orders/{invoice_id}, чтобы получить ссылку на подписку. Для теста без реальных денег —SNAPEX_ENVIRONMENT=test.
Настройки
| SNAPEX_API_KEY | API-ключ мерчанта (smk_…) с правами invoices.read и invoices.write. |
|---|---|
| SNAPEX_WEBHOOK_SECRET | Секрет подписи (whsec_…) вашего вебхука. |
| SNAPEX_ENVIRONMENT | live или test. Тестовые счета без реальных денег. |
| SNAPEX_FEE_ON | Кто платит комиссию SnapEX: merchant или customer. |
| API_TOKEN | Bearer-токен, который бот или магазин передаёт в /v1/checkout и /v1/orders/*. |
| MARZBAN_URL, MARZBAN_USERNAME, MARZBAN_PASSWORD | Адрес панели и данные администратора (или готовый MARZBAN_TOKEN; токены истекают, поэтому для постоянной работы лучше логин и пароль). |
| PLANS | Через запятую id:дни:usd:байты_трафика, по умолчанию month:30:5.00:0,quarter:90:12.00:0. |
Вопросы
Можно подключить к Telegram-боту?
Да. Бот вызывает POST /v1/checkout, отправляет пользователю pay_url и опрашивает GET /v1/orders/{invoice_id}, чтобы получить ссылку на подписку. Есть и готовый Telegram-бот для Marzban, 3x-ui и Remnawave.
Что будет, если существующий пользователь оплатит снова?
Подписка продлевается от текущей даты окончания (или от текущего момента, если она уже истекла); тарифы с трафиком добавляют новую квоту сверх использованной.
Может ли вебхук создать пользователя дважды?
Нет. Повторные и одновременные вебхуки обрабатывают счёт один раз, а перед любым действием сервис перечитывает счёт из API SnapEX Pay.
Что если панель Marzban недоступна в момент оплаты?
Обработчик вебхука отвечает 502, и SnapEX Pay повторит доставку позже.
Зачем нужен HTTPS?
SnapEX Pay доставляет вебхуки только на https://, поэтому сервис ставится за nginx, Caddy или Traefik.
Другие интеграции
Готовы принимать крипту?
Создайте аккаунт мерчанта, получите API-ключ и подключите модуль. 1% с платежа, без абонентской платы.