PT
Painéis de VPN

Pagamentos em cripto para VPN com Marzban

Um pequeno serviço auto-hospedado que vende assinaturas de VPN do Marzban por cripto pela SnapEX Pay. Sua loja ou bot do Telegram pede a ele um link de pagamento, o cliente paga na página da SnapEX Pay (USDT nas redes TRC20, ERC20 ou BEP20, além de outras formas que a SnapEX oferecer para esse valor) e, assim que a fatura é paga, o serviço cria ou renova o usuário no seu painel Marzban e devolve o link da assinatura.

Baixar o módulo

Grátis. Versão 1.1.0.

O que faz

  • Sem carteira nem node de blockchain para manter.
  • POST /v1/checkout cria uma fatura da SnapEX Pay para um plano e devolve pay_url; GET /v1/orders/{invoice_id} devolve o status e a URL da assinatura a partir dos registros do próprio serviço (atualizados pelo webhook), para que um bot possa consultá-lo periodicamente.
  • Webhook assinado (HMAC-SHA256, janela de 5 minutos para o timestamp). O corpo do webhook nunca é considerado confiável: a fatura é relida na API da SnapEX Pay, e o usuário só é provisionado quando ela está paga.
  • Idempotente: entregas repetidas ou simultâneas do webhook provisionam uma fatura uma única vez.
  • Usuários novos recebem todos os protocolos que têm um inbound no seu painel; os existentes são renovados a partir do vencimento atual (ou a partir de agora, se ele já passou ou se o usuário não tinha vencimento) e, nos planos com tráfego, a cota do plano é somada ao limite atual ou ao tráfego já usado, o que for maior.
  • Os planos são definidos em uma única variável de ambiente; os pedidos ficam em SQLite. O modo de teste não movimenta dinheiro real.

Instalação

  1. Baixe e descompacte o arquivo e, na pasta dele, execute cp .env.example .env.
  2. No painel do comerciante da SnapEX Pay, crie uma chave de API com os escopos invoices.read e invoices.write e coloque-a em SNAPEX_API_KEY.
  3. Defina API_TOKEN (por exemplo, openssl rand -hex 32), MARZBAN_URL e as credenciais de administrador do Marzban (MARZBAN_USERNAME e MARZBAN_PASSWORD), além dos seus planos em PLANS (id:days:usd:traffic_bytes, 0 bytes = ilimitado).
  4. Inicie o serviço: docker compose up -d e depois verifique com curl http://127.0.0.1:8080/health. Coloque o serviço atrás de um proxy reverso com HTTPS.
  5. No painel → Desenvolvedores, defina a URL do webhook como https://<your service>/webhook, copie a chave secreta de assinatura whsec_… (exibida uma única vez, ao salvar a URL pela primeira vez) para SNAPEX_WEBHOOK_SECRET e reinicie o serviço.
  6. Na sua loja ou bot, chame POST /v1/checkout com Authorization: Bearer <API_TOKEN>, envie pay_url ao cliente e consulte GET /v1/orders/{invoice_id} até receber o link da assinatura. Para testar sem dinheiro real, defina SNAPEX_ENVIRONMENT=test.

Configurações

SNAPEX_API_KEYChave de API do comerciante (smk_…) com invoices.read e invoices.write.
SNAPEX_WEBHOOK_SECRETChave secreta de assinatura (whsec_…) do seu endpoint de webhook.
SNAPEX_ENVIRONMENTlive ou test. Faturas de teste não movimentam dinheiro real.
SNAPEX_FEE_ONQuem paga a taxa de serviço da SnapEX: merchant ou customer.
API_TOKENToken Bearer que seu bot ou loja envia para /v1/checkout e /v1/orders/*.
MARZBAN_URL, MARZBAN_USERNAME, MARZBAN_PASSWORDURL do painel e credenciais de administrador (ou um MARZBAN_TOKEN já gerado; tokens expiram, então para um serviço que roda por muito tempo é melhor usar usuário e senha).
PLANSid:days:usd:traffic_bytes separados por vírgula; padrão month:30:5.00:0,quarter:90:12.00:0.
SNAPEX_PARTNER_IDOpcional: o Partner ID do integrador que configurou o módulo (programa de indicações da SnapEX Pay). Deixe em branco se você mesmo fez a configuração.

Perguntas

Posso usar a partir de um bot do Telegram?

Sim. O bot chama POST /v1/checkout, envia pay_url ao usuário e consulta GET /v1/orders/{invoice_id} até receber o link da assinatura. Também existe um bot do Telegram completo para Marzban, 3x-ui e Remnawave.

O que acontece com um usuário existente que paga de novo?

A assinatura é renovada a partir do vencimento atual (ou a partir de agora, se ele já passou ou se o usuário não tinha vencimento); nos planos com tráfego, a cota do plano é somada ao limite atual ou ao tráfego já usado, o que for maior.

Um webhook pode provisionar um usuário duas vezes?

Não. Entregas repetidas ou simultâneas provisionam uma fatura uma única vez, e o serviço relê a fatura na API da SnapEX Pay antes de fazer qualquer coisa.

E se o painel Marzban estiver fora do ar quando o pagamento chegar?

O handler do webhook devolve 502, e a SnapEX Pay tenta entregar de novo mais tarde.

Por que preciso de HTTPS?

A SnapEX Pay só entrega webhooks para URLs https://, então coloque o serviço atrás do nginx, Caddy ou Traefik.

Pronto para receber em cripto?

Crie uma conta de comerciante, gere uma chave de API e conecte o módulo. 1% por pagamento, sem mensalidade.