Integração HTTP tipada da Sufficit com a API Asaas.
AsaasGateway é a fachada geral do provedor. As capacidades atuais são
Checkout hospedado (IAsaasCheckoutGateway), boletos (IBankSlipGateway e
IBankSlipProviderDiagnosticsGateway) e NFS-e (IAsaasInvoiceGateway), sempre
usando o provider persistido asaas.
- compartilhar autenticação, cliente HTTP, configuração e credenciais entre todas as capacidades Asaas;
- criar sessões hospedadas para PIX/cartão e interpretar seu ciclo de webhooks;
- consultar a identidade comercial da conta para validar o beneficiário antes de aceitar pagamentos;
- emitir, consultar e cancelar boletos;
- localizar clientes por CPF/CNPJ antes de criá-los;
- reconciliar cobranças pela referência externa antes de repetir uma emissão;
- agendar, consultar, listar, atualizar, autorizar e cancelar NFS-e;
- autenticar e interpretar webhooks de NFS-e por
asaas-access-token; - consultar o cliente da nota e baixar XML/PDF somente de hosts permitidos;
- normalizar estados e erros próprios do Asaas;
- limitar a concorrência de
GET, manter uma reserva local da cota e observar os cabeçalhos dinâmicosRateLimit-*; - oferecer consultas tipadas e somente leitura para a console de diagnóstico.
O BankSlipId é enviado como externalReference e consultado antes de uma
criação, reduzindo o risco de cobrança duplicada. Não há failover automático.
O ambiente e a habilitação do provider são definidos pelas preferências do tenant. A autorização excepcional de uma emissão em produção pertence ao host e à interface administrativa, não ao gateway.
O host registra o gateway e a infraestrutura neutra separadamente:
services.AddSufficitGatewayInfrastructure(configuration);
services.AddSufficitBankSlipInfrastructure(configuration);
services.AddSufficitGatewayAsaas(configuration);As opções e credenciais gerais ficam em Sufficit:Gateway:Asaas:
{
"Sufficit": {
"Gateway": {
"Asaas": {
"SandboxBaseAddress": "https://api-sandbox.asaas.com/v3/",
"ProductionBaseAddress": "https://api.asaas.com/v3/",
"UserAgent": "Sufficit-Gateway-Asaas/2.0 (.NET)",
"Timeout": "00:00:30",
"MaxConcurrentGetRequests": 40,
"QuotaLimit": 25000,
"QuotaReserve": 5000,
"EnforceLocalQuotaLimit": true,
"Credentials": {}
}
}
}
}A API key não pertence a este repositório nem ao payload das filas. O host
resolve uma referência opaca por IGatewayCredentialResolver a partir da
configuração protegida.
O pipeline HTTP central conta cada chamada realmente admitida e impede que uma
instância ultrapasse 40 consultas GET simultâneas. A janela local permite
20.000 chamadas por credencial a cada 12 horas com a configuração padrão,
reservando 5.000 das 25.000 documentadas pelo Asaas para outros consumidores.
Após cada resposta, RateLimit-Limit, RateLimit-Remaining,
RateLimit-Reset e Retry-After atualizam um bloqueio preventivo. Respostas
429, ou 403 acompanhadas de reset, suspendem novas chamadas antes de chegar
ao provedor. IAsaasRateLimitMonitor expõe o estado observado, o consumo local
e o tempo de nova tentativa.
A cota local é deliberadamente identificada como estimativa: ela não enxerga outros processos, o n8n ou chamadas manuais da mesma conta e reinicia junto com o processo. Coordenação exata entre instâncias exige um armazenamento atômico compartilhado (por exemplo, Redis) implementado no host/worker.
Referência: limites oficiais da API Asaas.
IAsaasInvoiceGateway cobre os endpoints /v3/invoices de listagem,
consulta, agendamento, atualização, autorização e cancelamento. Os modelos
mantêm propriedades adicionais do provedor por JsonExtensionData, evitando
perda de dados quando a API evoluir. O objeto tributário permanece tipado como
JSON porque sua composição depende do regime e do município, inclusive regras
da NT-007.
IAsaasInvoiceWebhookGateway valida o segredo protegido e interpreta eventos
sem acoplar o host HTTP ao vocabulário do provedor. O conjunto mínimo usado na
importação é INVOICE_AUTHORIZED e INVOICE_CANCELED. O download de documentos
recusa HTTP, loopback, credenciais na URL e hosts fora de
InvoiceDocumentHosts; a API key não é enviada ao Nota Gateway.
IAsaasCheckoutGateway cria cobranças avulsas em /v3/checkouts, aceita
somente callbacks HTTPS, valida que o link retornado pertence a asaas.com e
mantém o externalReference do pedido. O parser aceita apenas
CHECKOUT_CREATED, CHECKOUT_CANCELED, CHECKOUT_EXPIRED e CHECKOUT_PAID,
ignorando atributos novos do payload. A autenticação de entrada compara o
segredo protegido do header asaas-access-token em tempo constante.
GetAccountAsync consulta /v3/myAccount/commercialInfo/ para que o host
confira o CPF/CNPJ associado à credencial antes de habilitar a cobrança.
dotnet test tests/Sufficit.Gateway.Asaas.Tests.csprojOs testes usam um HttpMessageHandler controlado e não acessam contas reais.