Painel de líderes
Conteúdo popular
Showing content with the highest reputation on 27-11-2025 em todas as áreas
-
Olá comunidade ! É com grande alegria que informamos que os novos eventos relacionados a Reforma Tributária foram implementados no ACBrNFe! Ao todo, foram adicionados 15 novos eventos que cujo autor pode ser o emitente, o destinatário ou a empresa sucessora. Um agradecimento a todos os membros da comunidade que enviaram contribuições de implementação. Os programas de exemplo nativos tanto para Delphi quanto para Lazarus foram atualizados para exemplificar cada um dos exemplos. Eles podem ser encontrados: ..\trunk2\Exemplos\ACBrDFe\ACBrNFe\Delphi ..\trunk2\Exemplos\ACBrDFe\ACBrNFe\Lazarus Se você utiliza ACBrMonitorPLUS ou ACBrLib, não se preocupe! A documentação de ambos também foi atualizada adicionando exemplos de INI para cada um dos novos eventos: Exemplos de INI dos eventos da Reforma Tributária para ACBrLib Exemplos de INI dos eventos da Reforma Tributária para ACBrMonitorPLUS Vale reforçar que tanto o ACBrMonitorPLUS quanto a ACBrLib deverão ser de compilações posteriores a 24/11/2025 para englobar os eventos, portanto, é importante que você mantenha seu Monitor ou Lib atualizados!5 pontos
-
Olá comunidade ! Foi publicado o Decreto Nº 49.127 de 14 Novembro de 2025 no estado de Minas Gerais determinando a obrigatoriedade do credenciamento das empresas desenvolvedoras do software de emissão de NFe e NFCe junto a Secretaria Estadual da Fazenda (SEF). O decreto também menciona que a obrigatoriedade da informação do Responsável Técnico na emissão de NFe e NFCe será definida em portaria posterior. É importante ressaltar que apesar dessa publicação, ainda não foi disponibilizado link para que as software houses possam realizar o cadastro. Até o momento foi publicado apenas a portaria determinando a obrigatoriedade, mas é esperado que uma normativa detalhando o processo e os prazos seja publicada posteriormente. Vale relembrar que os membros de nossa comunidade que são ACBr PRO e ACBr Corporativo tem acesso ao curso: Responsável Técnico na NFe. Onde o conceito de responsável técnico é explicado e a forma de preencher essa informação nas soluções ACBr é demonstrada na prática.3 pontos
-
Por favor atualize seus fontes, pelo SVN do ACBr... Já subimos para o nosso repositório de fontes, modificações que podem corrigir algum dos itens referentes a esse tópico... Por favor atualize seus fontes, faça testes, e se possível comente em uma nova resposta, se o problema foi resolvido... Dúvidas, sobre o uso do SVN ? Clique aqui e veja um vídeo2 pontos
-
Cidade/UF: Franca/SP Previsão de Mudança: 1º de janeiro de 2026 Tipo de Mudança: API própria (manterá provedor SIL Tecnologia) Fonte/Documentação: https://interface.siltecnologia.com.br/apidocs/franca/#tag/Nota-Fiscal-Nacional O município em questão optou por Emissor Próprio e assim, o fluxo de emissão será: 1. Contribuinte envia a nota para a sistema da prefeitura (link disponibilizado abaixo). 2. Prefeitura recepciona a nota e valida as condições municipais - exemplo: atividade pertence a empresa, dedução permitida para a atividade, questões de isenção e imunidade. Se tiver algo inconsistente, retorna com a rejeição municipal para o Contribuinte e a nota não é emitida. 3. Caso não haja rejeição municipal (atividade não permita, dedução indevida e etc - por exemplo), a prefeitura compartilha a nota com o Emissor Nacional. Se o Nacional rejeitar alguma informação, retorna a rejeição para o Contribuinte e a nota não é emitida. 4. Se a prefeitura e o Emissor Nacional aceitaram o XML enviado, a nota é gerada com sucesso e será retornado a chave de acesso gerada pela receita (código numérico de 50 posições). Em resumo, o XML a ser enviado no padrão nacional precisa ser aceito tanto pelo municipio emissor, quanto pela receita ou a nota não será gerada. Não será aceito envio via arquivo TXT, sendo disponível apenas via WebService. Não será aceito envio assíncrono, sendo aceito apenas envio síncrono - envia uma nota e aguarda a resposta, não pode enviar e consultar a situação depois. Não será aceito envio em lote, sendo aceito envio de nota a nota - envia uma nota, aguarda a resposta, envia a proxima. A documentação e orientações do novo modelo NF Nacional estão disponíveis no link: https://interface.siltecnologia.com.br/apidocs/franca/#tag/Nota-Fiscal-Nacional1 ponto
-
Eu já enviei 2 e-mails para a prefeitura e ainda não responderam nenhum. Caso queira enviar... [email protected]1 ponto
-
Olá, Comunidade ACBr ! Com o objetivo de facilitar a integração da ACBrLibExtratoAPI para desenvolvedores que utilizam a linguagem Python , gostaríamos de anunciar a disponibilização de um programa de exemplo. Este demo ilustra a forma de realizar a comunicação com a DLL/SO da ACBrLib utilizando o módulo nativo do Python para chamadas de função em bibliotecas dinâmicas. Utilize a biblioteca versão 64 Bits MT (Multithread) ! Lembrando que estas credenciais q esta no exemplo e no print são exemplos, não são validas. Você precisa criar suas credenciais o portal do desenvolvedor. O exemplo pode ser baixado diretamente pelo repositório SVN do projeto, no caminho de Demos da ACBrLib: https://svn.code.sf.net/p/acbr/code/trunk2/Projetos/ACBrLib/Demos/Python/ExtratoAPI/ Este exemplo é fundamental para quem deseja consumir os serviços de extratos bancários via API utilizando a biblioteca ExtratoAPI, e serve como base para implementação em projetos mais complexos. Aqui esta o link do manual ACBrLibExtrato API: https://acbr.sourceforge.io/ACBrLib/ACBrLibExtratoAPI.html1 ponto
-
Bom dia @marcelo.hgv, Já esta no SVN. Favor atualizar todos os fontes de todas as pastas, reinstale o ACBr e faça novos testes. Os seus fontes estão desatualizados.1 ponto
-
Bom dia @Denis (JJW), Já esta no SVN. Para testar, atualize todos os fontes de todas as pastas, reinstale o ACBr. Faça uma cópia do arquivo ACBrNFSeXServicos.ini para dentro da pasta que esta o EXE da aplicação. Faça a alteração abaixo nele: [4202404] Nome=Blumenau UF=SC Provedor=SimplISS Versao=2.03 ; URLs atuais ;Params=Aliquota4Casas: ;ProRecepcionar=https://wsblumenau1.simplissweb.com.br/nfseservice.svc ;HomRecepcionar=https://wshomologacaoabrasf1.simplissweb.com.br/nfseservice.svc ;ProSoapAction=http://www.sistema.com.br/Sistema.Ws.Nfse ;HomSoapAction=http://nfse.abrasf.org.br ;ProLinkURL=https://blumenau.simplissweb.com.br/contrib/app/nfse/relatorio?cnpj=%Cnpj%&ser=E&inum=%NumeroNFSe%&icod=%CodVerif% ; URLs da API própria que atende o Padrão Nacional Params=APIPropria:|PN: ProRecepcionar=1 ponto
-
que falhas? por naõ ter terminado é algo relativo a empresa e não ao sefaz. mas essa pergunta seria bom no canal do sefaz mesmo lá eles podem informar mas acredito que não1 ponto
-
Cidade : São José do Rio Preto Provedor : Mundança no Layout e mantém o GISS Documentação técnica https://sjrp.giss.com.br/giss-ajuda/desenvolvedores.html schemas_modificados_gissv2(3).zip Já foi feito alterações no componente visando as alterações realizadas pelo provedor no layout em uso.1 ponto
-
Cidade : Maringá - PR Provedor : "Manutenção do emissor municipal" .. Atualmente é o Fintel mas layout -> ISSE Documentação Técnica: O Manual de WebService, atualizado para apresentar os novos campos na versão ABRASF 2.01, e o arquivo XSD estão disponíveis em: https://nfse.ecity.maringa.pr.gov.br/Arquivos/xml_xsd_reforma.zip xml_xsd_reforma(6).zip Já foi feito alterações no componente visando atender as alterações realizadas no layout do provedor.1 ponto
-
Cidade/UF: Belo Horizonte / MG Previsão de Mudança: 1º de outubro de 2025 Tipo de Mudança: Padrão Nacional Fonte/Documentação: https://prefeitura.pbh.gov.br/noticias/belo-horizonte-adere-ao-emissor-nacional-de-nota-fiscal-de-servico-eletronica Alteração realizada no arquivo ACBrNFSeXServicosRTC.ini1 ponto
-
Cidade/UF: Criciúma/SC Previsão de Mudança: 1º de Dezembro de 2025 - Empresas optantes do Simples Nacional (ME e EPP) e Sociedades Uniprofissionais enquadradas no ISS Fixo. 1º de janeiro de 2026 - Demais contribuintes Pessoas Jurídicas e Pessoas Físicas regularmente inscritas como Profissionais Autônomos Tipo de Mudança: Padrão Nacional Fonte/Documentação: https://tributos.criciuma.sc.gov.br/notanacional Alteração realizada no arquivo ACBrNFSeXServicosRTC.ini1 ponto
-
Em Mineiros-GO a gissOnline esta com essa mensagem na pagina inicial, passei e-mail para o pessoal porém retornaram que ainda não tem ambiente de teste mas ja tem o link para baixar. https://mineiros.giss.com.br/giss-ajuda/desenvolvedores.html "Integração com a nota fiscal de serviços eletronica - padrão nacional já esta disponível. Telefone: 11 2175-1145 Email: [email protected] Atualmente fiz um ajuste no ini para funcionar com 4casas, segue em anexo... esse já funcionando. ACBrNFSeXConversao.pas ACBrNFSeXServicos.ini Foi feita alterações no componente visando atender as alterações no layout usado pelo provedor.1 ponto
-
Cidade/UF: Curitiba - PR Previsão: 1. A partir de 1º de outubro: sociedades uniprofissionais, como médicos, advogados, engenheiros, arquitetos e contadores. 2. A partir de 1º de novembro: empresas optantes pelo Simples Nacional. 3. A partir de 1º de janeiro de 2026: demais contribuintes, como empresas de lucro real, presumido e outros regimes. Tipo de mudança: Emissor Nacional Fonte: https://www.curitiba.pr.gov.br/noticias/curitiba-migra-emissao-da-nota-fiscal-eletronica-para-o-emissor-nacional-a-partir-de-outubro/79358 Alteração realizada no arquivo ACBrNFSeXServicosRTC.ini1 ponto
-
Boa noite @marcelo.hgv, Muito obrigado pela colaboração, já foi criado a tarefa ACBR-8492 para analise.1 ponto
-
Cidade/UF: Barueri / SP Previsão de Mudança: 01/01/26 Tipo de Mudança: (API Própria) Fonte/Documentação: https://portal.barueri.sp.gov.br/secretarias/secretaria-de-financas/alteracoes-emissao-nfe Já foi criado a tarefa 8554 para fazer as devidas alterações para atender o provedor da cidade.1 ponto
-
@Italo Giurizzato Junior - Poise.. No caso de Boituva-SP foi o contrário, pode ser que seja algo relacionado ao código da lista do serviço prestado.. Mas tudo bem.. Da pra utilizar aquela parâmetro lá da ocorrência da alíquota acredito... Obrigado pela atenção;1 ponto
-
1 ponto
-
Problema resolvido! Comprei um antivírus e instalei. Pegou três vírus e limpou algumas referências incorretas no registro do windows. Acabou o problema de lentidão ao abrir programas.1 ponto
-
1 ponto
-
Conteúdo atualizado: Adicionadas novas edições do Papo PRO. Atualizado link da NT para NFSe.1 ponto
-
Opa Juliomar acabei puxando o arquivo xml que foi salvo automaticamente na minha maquina1 ponto
-
produção restrita realmente está com problema (404), mas em produção, se usar uma chave emitida no mesmo ambiente, irá funcionar.1 ponto
-
Possuo experiência na integração de várias API's utilizando componentes REST: Tray Commerce Climba Commerce Plugnotas Tecnospeed RD Station CRM Pipedrive CRM Woo Commerce Itaú (Bolecode) Mercado Livre Outras Fiquem à vontade para entrarem em contato se precisarem de consultoria para o desenvolvimento de projetos envolvendo esse tipo de integração. Fábio Lopes 19 99263-35491 ponto
-
Olá Pessoal, Com a Reforma Tributária temos novas opções de emissão de NF-e, vamos tentar entender como funciona essa tal de nota de Débito ou Crédito. Na Nota Técnica 2025/002 versão 1.20 no final da página 7 temos o item 4 que traz: 4. Finalidade Débito e Finalidade Crédito da NF-e Notas de Débito e Crédito são nomes de instrumentos utilizados mundialmente para documentar situações contábeis onde é necessário corrigir informações comerciais que foram registradas em um documento, que no Brasil é a Nota Fiscal. Esta Nota Técnica cria na NF-e modelo 55 as finalidades de emissões correspondentes. O sentido das palavras “débito” e “crédito” sempre se referem ao ponto de vista do emissor: • Uma nota de débito documenta uma situação na qual o emitente registra um aumento no imposto devido (consequentemente, uma redução no imposto devido pelo adquirente, que é o destinatário); • Uma nota de crédito documenta uma situação na qual o emitente registra uma redução no imposto devido (consequentemente, um aumento no imposto devido pelo adquirente, que é o destinatário); As finalidades de emissão “Nota de Ajuste” e “Nota Complementar”, já existentes, são casos especiais de Nota de Débito; uma nota de entrada emitida para documentar, por exemplo, a devolução de mercadoria que havia sido vendida a um consumidor final, é um caso especial de Nota de Crédito. A regulamentação do IBS disporá sobre a utilização de notas de crédito e notas de débito para lançamentos de ajuste, com a finalidade de instrumentalizar a preparação da declaração assistida a ser oferecida para os contribuintes, de maneira automatizada, a partir de documentos fiscais eletrônicos, em cumprimento ao que preconiza a LC 214/2025. A menos que ocorra alteração na regulamentação do ICMS e do IPI, notas de crédito e notas de débito não poderão ser utilizadas para ajustes relativos a estes tributos. O campo finNFe agora passa a ter as opções: 5=Nota de crédito; 6=Nota de débito; Portanto se a minha intenção é emitir uma NF-e de Crédito o valor de finNFe tem que ser 5, por outro lado se a intenção é emitir uma NF-e de Débito o valor de finNFe tem que ser 6. Temos agora que especificar o tipo da nota de Débito ou de Crédito através dos novos campos tpNFDebito e tpNFCredito. Devemos ter em mente que uma nota só pode ser de Débito ou de Crédito jamais vai ser de Débito e Crédito. Valores aceitos pelo campo tpNFDebito: 01=Transferência de créditos para Cooperativas; 02=Anulação de Crédito por Saídas Imunes/Isentas; 03=Débitos de notas fiscais não processadas na apuração; 04=Multa e juros; 05=Transferência de crédito de sucessão; 06 = Pagamento antecipado 07 = Perda em estoque Valores aceitos pelo campo tpNFCredito: 01 = Multa e juros 02 = Apropriação de crédito presumido de IBS sobre o saldo devedor na ZFM (art. 450, § 1º, LC 214/25) 03 = Retorno (regra de validação: B25-80) Uma nota de Débito ou Crédito não podem conter informações de: ICMS (tag: ICMS), ISSQN (tag: ISSQN), IPI (tag: IPI), II (tag: II), PIS (tag: PIS), PIS ST (tag: PISST), COFINS (tag: COFINS), COFINS ST (tag: COFINSST), ICMS UF Destino (tag: ICMSUFDest) ou Imposto Devolvido (tag: impostoDevol). Uma NFC-e (modelo 65) não permite nota de Débito ou Crédito, esses dois tipos de notas estão restritas ao modelo 55 ou seja NF-e. (regra de validação: UB106-31) Temos um novo gruo chamado gTransfCred que só deve ser gerado se a de nota de Débito tiver o tpNFDebito for 01 ou 05. O grupo gTransfCred só deve ser gerado se o CST / cClassTrib informado o permitir. (regra de validação: VC02-10) Se tpNFDebito for 03 ou 04 devemos gerar o novo grupo DFeReferenciado. (regra de validação: 3BA02-70) Uma nota de crédito de multa/juros, tpNFCredito igual a 01 ou 03 tem que referenciar uma NF-e autorizada e não pode estar cancelada. (regra de validação: B25-30) Se tpNFCredito for 01 ou 03 devemos gerar o novo grupo DFeReferenciado. A nota de Débito ou Crédito não é simples, possui muitas regras de validação, vai ser natural levarmos uma rejeição logo na primeira nota, mas de posse da NT em mãos para buscar um entendimento sobre a rejeição e sanar o problema vai ser o caminho. Tudo é muito novo para nós desenvolvedores e para os contadores, o jeito vai ser dar as mãos e tentarmos buscar a melhor implementação. Não sou contador, sou desenvolver, mas busco sempre as respostas nos Manuais, Notas Técnicas e longas conversas com os contadores. Espero que esse texto possa ajudar um pouco com esses dois tipos de notas.1 ponto
-
Consegui muitas informações no ChatGPT. Inclusive a Inteligência Artificial me deu comandos prontos em Delphi já para rodar e conectar com a CERC/B3 abaixo está um módulo Delphi pronto que implementa OAuth2 (client_credentials e refresh_token) com exemplos de uso, tratamento de erros, thread-safety e dicas de segurança. Pressuposições que fiz (comuns para registradoras como CERC/B3): você usará client_credentials (mais comum para sistemas server-to-server); o token_endpoint retorna JSON com access_token, expires_in e possivelmente refresh_token. Cole este unit no seu projeto e adapte TokenURL, ClientID, ClientSecret e Scope conforme a registradora. unit OAuth2Client; interface uses System.SysUtils, System.Classes, System.SyncObjs, System.DateUtils, System.Generics.Collections, System.JSON, System.Net.HttpClient, System.Net.URLClient; type EOAuth2Error = class(Exception); TOAuth2Token = record AccessToken: string; RefreshToken: string; ExpiresAt: TDateTime; // UTC Scope: string; TokenType: string; function IsValid: Boolean; end; TOAuth2Client = class private FTokenURL: string; FClientID: string; FClientSecret: string; FScope: string; FHTTP: TNetHTTPClient; FToken: TOAuth2Token; FLock: TObject; FLastError: string; procedure ParseTokenResponse(const JSONText: string); function RequestToken_ClientCredentials: TOAuth2Token; function RequestToken_WithRefresh(const ARefreshToken: string): TOAuth2Token; procedure SecureEraseClientSecret; public constructor Create(const ATokenURL, AClientID, AClientSecret, AScope: string; AHTTP: TNetHTTPClient = nil); destructor Destroy; override; { Retorna authorization header, garantindo que o token está válido. Exemplo: 'Bearer <token>' } function GetAuthorizationHeader: string; { Força obtenção de token (útil para testes) } procedure AcquireToken; { Se houver refresh_token, tenta renovar; caso contrário, pede novo token via client_credentials } procedure EnsureTokenValid; property LastError: string read FLastError; end; implementation { TOAuth2Token } function TOAuth2Token.IsValid: Boolean; begin // considera válido com 60s de margem Result := (AccessToken <> '') and (MinutesBetween(NowToUTC, ExpiresAt) > 0); end; { TOAuth2Client } constructor TOAuth2Client.Create(const ATokenURL, AClientID, AClientSecret, AScope: string; AHTTP: TNetHTTPClient); begin inherited Create; FTokenURL := ATokenURL; FClientID := AClientID; FClientSecret := AClientSecret; FScope := AScope; if AHTTP = nil then begin FHTTP := TNetHTTPClient.Create(nil); // ajustar timeouts se desejar: FHTTP.ConnectionTimeout := 30000; FHTTP.ResponseTimeout := 30000; end else FHTTP := AHTTP; FLock := TObject.Create; FToken := Default(TOAuth2Token); end; destructor TOAuth2Client.Destroy; begin SecureEraseClientSecret; FHTTP.Free; FreeAndNil(FLock); inherited; end; procedure TOAuth2Client.SecureEraseClientSecret; begin // Limpa a string do client secret (melhor do que deixar em memória) FClientSecret := StringOfChar(#0, Length(FClientSecret)); FClientSecret := ''; end; procedure TOAuth2Client.ParseTokenResponse(const JSONText: string); var J: TJSONValue; jobj: TJSONObject; expires_in: Integer; s: string; begin J := TJSONObject.ParseJSONValue(JSONText); if not Assigned(J) then raise EOAuth2Error.Create('Resposta do token não é JSON válido'); try if not (J is TJSONObject) then raise EOAuth2Error.Create('Resposta do token inesperada'); jobj := J as TJSONObject; if jobj.GetValue('error') <> nil then begin s := jobj.GetValue<string>('error_description', jobj.GetValue<string>('error', 'erro desconhecido')); raise EOAuth2Error.CreateFmt('OAuth2 error: %s', [s]); end; FToken.AccessToken := jobj.GetValue<string>('access_token', ''); FToken.TokenType := jobj.GetValue<string>('token_type', 'Bearer'); FToken.Scope := jobj.GetValue<string>('scope', FScope); FToken.RefreshToken := jobj.GetValue<string>('refresh_token', ''); expires_in := jobj.GetValue<Integer>('expires_in', 0); // ExpiresAt em UTC: NowToUTC + expires_in segundos if expires_in > 0 then FToken.ExpiresAt := IncSecond(NowToUTC, expires_in) else // default para 5 minutos se não informado (evitar ficar inválido) FToken.ExpiresAt := IncMinute(NowToUTC, 5); finally J.Free; end; end; function TOAuth2Client.RequestToken_ClientCredentials: TOAuth2Token; var Resp: IHTTPResponse; Body: TStringStream; Params: TStringList; Headers: TNetHeaders; Encoded: string; sBody: string; begin Params := TStringList.Create; try // Form-encoded body (application/x-www-form-urlencoded) Params.Add('grant_type=client_credentials'); if FScope <> '' then Params.Add('scope=' + TNetEncoding.URL.Encode(FScope)); Body := TStringStream.Create(Params.DelimitedText.Replace(#13#10,'&',[rfReplaceAll]), TEncoding.UTF8); try Headers := [ TNameValuePair.Create('Content-Type', 'application/x-www-form-urlencoded') ]; // credencial via Authorization basic (recomendado) Encoded := TNetEncoding.Base64.Encode(FClientID + ':' + FClientSecret); Headers := Headers + [TNameValuePair.Create('Authorization', 'Basic ' + Encoded)]; Resp := FHTTP.Post(FTokenURL, Body, nil, Headers); sBody := Resp.ContentAsString(TEncoding.UTF8); if not (Resp.StatusCode in [200,201]) then raise EOAuth2Error.CreateFmt('Token endpoint retornou %d: %s', [Resp.StatusCode, sBody]); // parseia e popula FToken ParseTokenResponse(sBody); Result := FToken; finally Body.Free; end; finally Params.Free; end; end; function TOAuth2Client.RequestToken_WithRefresh(const ARefreshToken: string): TOAuth2Token; var Body: TStringStream; Params: TStringList; Headers: TNetHeaders; Resp: IHTTPResponse; sBody: string; Encoded: string; begin Params := TStringList.Create; try Params.Add('grant_type=refresh_token'); Params.Add('refresh_token=' + TNetEncoding.URL.Encode(ARefreshToken)); Body := TStringStream.Create(Params.DelimitedText.Replace(#13#10,'&',[rfReplaceAll]), TEncoding.UTF8); try Headers := [ TNameValuePair.Create('Content-Type','application/x-www-form-urlencoded') ]; Encoded := TNetEncoding.Base64.Encode(FClientID + ':' + FClientSecret); Headers := Headers + [TNameValuePair.Create('Authorization', 'Basic ' + Encoded)]; Resp := FHTTP.Post(FTokenURL, Body, nil, Headers); sBody := Resp.ContentAsString(TEncoding.UTF8); if not (Resp.StatusCode in [200,201]) then raise EOAuth2Error.CreateFmt('Refresh token endpoint retornou %d: %s', [Resp.StatusCode, sBody]); ParseTokenResponse(sBody); Result := FToken; finally Body.Free; end; finally Params.Free; end; end; procedure TOAuth2Client.AcquireToken; var TokenLocal: TOAuth2Token; begin TMonitor.Enter(FLock); try FLastError := ''; try // tenta via client_credentials TokenLocal := RequestToken_ClientCredentials; FToken := TokenLocal; except on E: Exception do begin FLastError := E.Message; raise; end; end; finally TMonitor.Exit(FLock); end; end; procedure TOAuth2Client.EnsureTokenValid; var tokenCopy: TOAuth2Token; begin TMonitor.Enter(FLock); try // se token válido, nada a fazer if FToken.IsValid then Exit; // se temos refresh token, tente renovar if FToken.RefreshToken <> '' then begin try RequestToken_WithRefresh(FToken.RefreshToken); Exit; except // se falhar, limpa e tenta client_credentials FToken := Default(TOAuth2Token); end; end; // pede novo token via client_credentials RequestToken_ClientCredentials; finally TMonitor.Exit(FLock); end; end; function TOAuth2Client.GetAuthorizationHeader: string; begin EnsureTokenValid; if FToken.AccessToken = '' then raise EOAuth2Error.Create('Nenhum access_token disponível'); Result := FToken.TokenType + ' ' + FToken.AccessToken; end; end. Como usar (exemplo simples) var OAuth: TOAuth2Client; AuthHeader: string; Client: TNetHTTPClient; Resp: IHTTPResponse; begin Client := TNetHTTPClient.Create(nil); try OAuth := TOAuth2Client.Create( 'https://registradora.exemplo/oauth2/token', 'seu_client_id', 'seu_client_secret', 'scope-necessario', Client); try // pode chamar EnsureTokenValid antes de cada requisição AuthHeader := OAuth.GetAuthorizationHeader; // 'Bearer <token>' // Exemplo de chamada à API de consulta usando o token Resp := Client.Get('https://registradora.exemplo/api/duplicata/consultar', nil, [TNameValuePair.Create('Authorization', AuthHeader)]); // tratar Resp.ContentAsString... finally OAuth.Free; end; finally Client.Free; end; end; Dicas e pontos importantes Fluxo mais comum: client_credentials (server-to-server). Alguns provedores podem exigir MTLS (client certificate) — nesse caso a autenticação muda e você precisa configurar certificado no HTTP client. Armazenamento seguro do client_secret: não guarde em texto claro. Use DPAPI (Windows CryptoAPI), arquivo criptografado, ou HSM/KeyVault. Timeouts e retry: implemente re-tries exponenciais para chamadas de token e trate códigos 5xx. Logs e compliance: armazene respostas cruas (somente em ambiente seguro) para auditoria — mas não registre client_secret. Rate limits: confira limites da registradora e implemente backoff. Testes: rode em homologação da registradora e simule expiração de tokens. MTLS: se a registradora exigir certificado do cliente, o TNetHTTPClient precisa ser configurado com o certificado PFX (TLS client cert). Eu posso te mostrar o snippet se precisar. Quer que eu: adapte este módulo para MTLS (client cert) em vez de Basic auth? gere uma classe pronta que também faça a chamada da API /duplicata/consultar e parseie o retorno em registros Delphi? Escolhe uma opção e eu já preparo.0 pontos
