Pular para o conteúdo principal

SDK para Delphi

Comece a usar rapidamente a Nuvem Fiscal com o nosso SDK para Delphi! O SDK é uma biblioteca open source cujo código-fonte completo está disponível no GitHub:

IDEs e plataformas suportadas

O SDK é suportado no Delphi XE8 e posterior e no Lazarus/FreePascal. Funciona em todas plataformas suportadas por essas IDEs.

Instalação

Para utilizar a biblioteca, clone o repositório do SDK para Delphi e adicione o caminho completo da pasta Source do repositório ao Library Path da IDE do Delphi (ou ao Search Path do seu projeto) ou do Lazarus.

Utilização

Para uso do client, você precisa adicionar as units NuvemFiscalClient e NuvemFiscalDTOs à clausula uses da sua unit. Caso queira usar a interface de geração de token, você também precisa adicionar a unit OpenApiRest:

uses 
NuvemFiscalClient, NuvemFiscalDTOs, OpenApiRest;

Obtendo o token de acesso

O processo de autenticação da Nuvem Fiscal envolve dois passos:

O primeiro passo deve ser feito no console da Nuvem Fiscal, enquanto o segundo você deve fazer manualmente. O SDK do Delphi oferece uma forma fácil de obter esse token a partir das credenciais, da seguinte forma:

var
TokenProvider: IClientCredencialsTokenProvider;
TokenData: ITokenData;
AccessToken: string;
DataExpiracao: TDateTime;
begin
TokenProvider := TClientCredentialsTokenProvider.Create;
TokenProvider.TokenEndpoint := 'https://auth.nuvemfiscal.com.br/oauth/token';
TokenProvider.ClientId := '<seu client id>';
TokenProvider.ClientSecret := '<seu client secret>';
TokenProvider.Scope := 'empresa cep cnpj nfe nfse nfce cte mdfe';
TokenData := TokenProvider.RetrieveToken;
AccessToken := TokenData.AccessToken;
DataExpiracao := TokenData.ExpirationTime;
...

Criando o client

Com um token de acesso em mãos, você pode instanciar e configurar o client:

var
Client: INuvemFiscalClient;
{...}
Client := TNuvemFiscalClient.Create;
Client.Config.AccessToken := '<seu access token>';

Executando os métodos

Todos os endpoints da API da Nuvem Fiscal estão disponíveis no client, agrupadas por interfaces de acordo com o serviço. Por exemplo, o client disponibiliza interfaces nas propriedades Nfse (métodos para emissão de Nfse e outras operações relacionadas), Nfe (operações relacionados a NFe), Cep (operações para consulta de CEP), e assim por diante.

O exemplo a seguir faz uma consulta de dados de um CNPJ:

var
Empresa: TCnpjEmpresa;
Endereco: TCnpjEndereco;
begin
Empresa := Client.Cnpj.ConsultarCnpj('08421842000190');
try
// Dados do CNPJ estão disponíveis na variável Empresa, por exemplo:
// Empresa.RazaoSocial
// Empresa.Endereco.Logradouro
// Empresa.Endereco.Municipio
// Empresa.Endereco.Uf
finally
Empresa.Free;
end;
end;

Todos os objetos criados e passados como parâmetros, bem como os objetos recebidos como retorno de função, precisam ser destruídos pelo usuário, caso contrário isso gerará um vazamento de memória.

Você pode usar o code completion do Delphi para verificar os serviços, métodos, propriedades e classes disponíveis.

Usar Indy como alternativa

Internamente, o SDK para Delphi utiliza a classe THTTPClient para executar as requisições à API. É a opção recomendada, mais moderna e segura. Porém, essa opção está disponível apenas a partir do Delphi XE8. Ainda, justamente por utilizar recursos mais modernos dos sistemas operacioais, em alguns casos pode não funcionar adequadamente em versões antigas do Windows.

Nesses casos (versões antigas do Delphi ou do Windows), pode ser necessário alterar o SDK para utilizar a biblioteca Indy para fazer as requisições. Para isso, basta utilizar o código abaixo para alterar as configurações do SDK. O exemplo abaixo é executado em um data module qualquer TDMPrincipal, mas você pode utilizar em qualquer form ou data module de sua aplicação que seja criado no início da aplicação.

uses
OpenApiRest, OpenApiIndy, IdSSLOpenSSL;

procedure TDMPrincipal.DataModuleCreate(Sender: TObject);
var
Factory: TIndyRestRequestFactory;
begin
Factory := TIndyRestRequestFactory.Create;
Factory.OnClientCreated := IndyClientCreated;
DefaultRequestFactory := Factory;
end;

procedure TDMPrincipal.IndyClientCreated(Client: TIdHTTP);
var
Handler : TIdSSLIOHandlerSocketOpenSSL;
begin
Handler := TIdSSLIOHandlerSocketOpenSSL.Create;
Handler.SSLOptions.SSLVersions := [sslvTLSv1_2];
Client.IOHandler := Handler;
Client.ManagedIOHandler := True;
end;

Ainda, é preciso usar as DLLs do OpenSSL. É recomendado usar as versões que são oficialmente suportadas pelo Indy, você pode baixar as DLLs diretamente a partir do repositório do Indy, aqui: https://github.com/IndySockets/OpenSSL-Binaries/blob/master/openssl-1.0.2u-i386-win32.zip