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.
Grátis. Versão 1.1.0.
O que faz
- Sem carteira nem node de blockchain para manter.
POST /v1/checkoutcria uma fatura da SnapEX Pay para um plano e devolvepay_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
- Baixe e descompacte o arquivo e, na pasta dele, execute
cp .env.example .env. - No painel do comerciante da SnapEX Pay, crie uma chave de API com os escopos
invoices.readeinvoices.writee coloque-a emSNAPEX_API_KEY. - Defina
API_TOKEN(por exemplo,openssl rand -hex 32),MARZBAN_URLe as credenciais de administrador do Marzban (MARZBAN_USERNAMEeMARZBAN_PASSWORD), além dos seus planos emPLANS(id:days:usd:traffic_bytes,0bytes = ilimitado). - Inicie o serviço:
docker compose up -de depois verifique comcurl http://127.0.0.1:8080/health. Coloque o serviço atrás de um proxy reverso com HTTPS. - No painel → Desenvolvedores, defina a URL do webhook como
https://<your service>/webhook, copie a chave secreta de assinaturawhsec_…(exibida uma única vez, ao salvar a URL pela primeira vez) paraSNAPEX_WEBHOOK_SECRETe reinicie o serviço. - Na sua loja ou bot, chame
POST /v1/checkoutcomAuthorization: Bearer <API_TOKEN>, enviepay_urlao cliente e consulteGET /v1/orders/{invoice_id}até receber o link da assinatura. Para testar sem dinheiro real, definaSNAPEX_ENVIRONMENT=test.
Configurações
| SNAPEX_API_KEY | Chave de API do comerciante (smk_…) com invoices.read e invoices.write. |
|---|---|
| SNAPEX_WEBHOOK_SECRET | Chave secreta de assinatura (whsec_…) do seu endpoint de webhook. |
| SNAPEX_ENVIRONMENT | live ou test. Faturas de teste não movimentam dinheiro real. |
| SNAPEX_FEE_ON | Quem paga a taxa de serviço da SnapEX: merchant ou customer. |
| API_TOKEN | Token Bearer que seu bot ou loja envia para /v1/checkout e /v1/orders/*. |
| MARZBAN_URL, MARZBAN_USERNAME, MARZBAN_PASSWORD | URL 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). |
| PLANS | id:days:usd:traffic_bytes separados por vírgula; padrão month:30:5.00:0,quarter:90:12.00:0. |
| SNAPEX_PARTNER_ID | Opcional: 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.
Outras integrações
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.