RU
VPN-панели

Криптоплатежи для 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. Тестовый режим — без реальных денег.

Установка

  1. Скачайте и распакуйте архив, в его папке выполните cp .env.example .env.
  2. В кабинете мерчанта SnapEX Pay создайте API-ключ с правами invoices.read и invoices.write и впишите его в SNAPEX_API_KEY.
  3. Задайте API_TOKEN (например, openssl rand -hex 32), MARZBAN_URL и данные администратора Marzban (MARZBAN_USERNAME и MARZBAN_PASSWORD), тарифы — в PLANS (id:дни:usd:байты_трафика, 0 — без лимита).
  4. Запустите: docker compose up -d, проверьте curl http://127.0.0.1:8080/health. Поставьте сервис за HTTPS reverse proxy.
  5. В кабинете добавьте вебхук https://<ваш сервис>/webhook минимум с событием invoice.paid, скопируйте его секрет в SNAPEX_WEBHOOK_SECRET и перезапустите сервис.
  6. Из магазина или бота вызывайте POST /v1/checkout с Authorization: Bearer <API_TOKEN>, отправляйте клиенту pay_url и опрашивайте GET /v1/orders/{invoice_id}, чтобы получить ссылку на подписку. Для теста без реальных денег — SNAPEX_ENVIRONMENT=test.

Настройки

SNAPEX_API_KEYAPI-ключ мерчанта (smk_…) с правами invoices.read и invoices.write.
SNAPEX_WEBHOOK_SECRETСекрет подписи (whsec_…) вашего вебхука.
SNAPEX_ENVIRONMENTlive или test. Тестовые счета без реальных денег.
SNAPEX_FEE_ONКто платит комиссию SnapEX: merchant или customer.
API_TOKENBearer-токен, который бот или магазин передаёт в /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% с платежа, без абонентской платы.