Depois que publiquei o artigo “30 dias com o WebService” no final de 2012, recebi muitos e-mails sobre dúvidas e dificuldades de configuração e acesso ao WebService da GINFES pelo Delphi. Procurei respondê-los na medida do possível, mas observei a oportunidade de elaborar um artigo complementar sobre este assunto com as dúvidas mais comuns.
1) Por onde devo começar o desenvolvimento da aplicação que irá consumir o WebService?
A primeira instrução que recebi foi ler o Manual de Integração da GINFES, disponível no próprio site do WebService. Lá tem a maioria da regra de negócio necessária, desde a tecnologia utilizada na comunicação do WebService até os tipos de dados e tamanhos dos campos que devem compor o XML. É um passo inicial para começar a arquitetar a funcionalidade da aplicação. Mesmo lendo o material, devo confessar que ainda fiquei com algumas dúvidas, mas que foram sanadas posteriormente. Aos poucos, comecei a montar o esqueleto do aplicativo e fazer alguns testes para concatenar os valores com as tags do arquivo XML, mais ou menos nesse sentido:
1 2 3 |
XML := XML + '<tipos:RazaoSocial>' + Trim(Dataset.FieldByName('RazaoSocial').AsString) + '</tipos:RazaoSocial>'; |
Em seguida, procurei manter contato com o setor financeiro da empresa, principalmente para compreender os valores de impostos e alíquotas que eram exigidos na composição XML. Além disso, fui concebido de criar uma tabela com os códigos dos municípios fornecidos pelo IBGE, já que no XML este código deve ser informado ao invés do nome da cidade.
2) Quando tento utilizar o WSDL Importer, recebo a mensagem “Empty Document”.
Essa mensagem significa que o conteúdo está vazio, ou seja, o retorno foi nulo. Faça um teste: tente abrir o link do WSDL no navegador. Se você receber a mensagem “A página não foi encontrada” ou “A página não pode ser exibida”, provavelmente há alguma restrição na sua conexão com a Internet que está bloqueando o acesso ao WSDL.
Isso normalmente acontece em ambientes corporativos, onde há uma política de controle de acesso a Internet. Eu cheguei à essa conclusão depois que levei o Certificado Digital pra casa e funcionou normalmente no meu computador particular. No outro dia, pedi para o setor de Infraestrutura me conceder acesso total à Internet temporariamente. Na primeira tentativa, a importação funcionou.
3) Já verifiquei minha conexão com a Internet, mas ainda recebo a mensagem “Empty Document”.
Verifique a instalação da hierarquia das cadeias de certificados disponíveis no site do Certificado Digital (como Serasa ou Certisign). Aqui vale frisar uma observação importante: procure instalar essas cadeias de certificados no repositório de “Autoridades de Certificação Raiz Confiáveis” durante a importação. Outra solução é checar se o Certificado Digital está válido e ativo. No site da Serasa, por exemplo, há um link para testar a assinatura e validade do Certificado Digital.
Além das sugestões acima, pode ser necessário verificar as configurações de segurança e avançadas do Internet Explorer, em especial os ajustes relacionados à verificação e revogação de certificados.
4) Ao enviar o arquivo XML, recebo a mensagem “E160 – Arquivo fora da estrutura”.
Passei alguns dias trabalhando pra montar a estrutura correta do XML. Eis que aqui lhe deixo algumas dicas:
- Não deixe nenhuma tag do XML em branco (nulo);
- Confira se o tamanho dos valores não está passando o limite informado no Manual de Integração. Por exemplo, suponha que no Manual é informado que a Razão Social deve ter no máximo 60 caracteres. Se você concatenar um valor com 61 caracteres, o XML será rejeitado pelo WebService;
- As tags do XML são Case Insensitive, ou seja, diferenciam maiúsculas de minúsculas. Eu me lembro que o WebService rejeitava meu arquivo porque eu estava concatenando “<UF>” ao invés de “<Uf>”;
- Todas as tags devem ser fechadas com uma barra, assim como acontece na linguagem HTML.
- Os valores monetários devem ser informados com pontos (.) ao invés de vírgulas (,). Por exemplo: 1498.15;
- Retire os espaços em branco à esquerda e à direita dos valores antes de concatená-los no arquivo XML. No Delphi isso pode ser feito com o comando Trim.
- Utilize o site W3C Markup Validation Service para validar a estrutura do arquivo XML e identificar possíveis falhas nas tags
5) Como devo proceder para chamar a função de envio do RPS?
Considerando que você adicionou um componente do tipo THTTPRIO
no seu formulário, a função deve ser chamada da seguinte forma:
1 2 3 4 5 6 |
var WebService: ServiceGinfesImpl; begin WebService := GetServiceGinfesImpl(True, '', HTTPRIO); Resposta := WebService.RecepcionarLoteRpsV3(Cabecalho, XML); end; |
Observe que além do arquivo XML, você também precisa atribuir um cabeçalho pré-definido pela GINFES. Na aplicação que desenvolvi, utilizei o cabeçalho abaixo:
1 2 3 |
<ns2:cabecalho versao="3" xmlns:ns2="http://www.ginfes.com.br/cabecalho_v03.xsd"> <versaoDados>3</versaoDados> </ns2:cabecalho> |
No entanto, eventualmente esse cabeçalho pode ser diferente.
A “Resposta” que citei no código-fonte acima pode ser um componente do tipo TMemo
.
6) Como posso obter o número da NFS-e gerada?
Infelizmente a resposta do envio do XML não traz o número da NFS-e. Isso ocorre porque quando o arquivo é enviado ao WebService, ele entra em uma fila de processamento para ser “transformado” em NFS-e. Portanto, é necessário fazer o envio e logo em seguida realizar uma consulta do lote para obter o número da NFS-e. Inclusive, na época, entramos em contato com a GINFES e sugerimos a possibilidade de enviar e processar o arquivo XML e obter o número em uma mesma solicitação ao WebService, mas nosso pedido foi desconsiderado.
O suporte da GINFES informou que o intervalo entre o envio e processamento do arquivo XML é de aproximadamente 20 segundos. Esse tempo pode variar de acordo com o número de arquivos que estão na fila de processamento. Algumas vezes, principalmente em horários de pico, esse intervalo pode demorar de 5 a 10 minutos.
7) Ao consultar o lote, recebo a mensagem “E4 – Esse RPS não foi enviado para a nossa base de dados”.
Este erro ocorre justamente pelo motivo do tópico anterior. Se você tentar realizar a consulta de um lote que ainda não foi processado pelo WebService, receberá essa mensagem. Mas atenção: isso não significa que o XML não foi enviado, ok? Ele foi enviado sim, mas permanece em uma fila de processamento para gerar a NFS-e.
Pessoal, essas são as dúvidas que normalmente recebo por e-mail sobre este assunto. Espero que os tópicos acima possam ajudar desenvolvedores que estejam iniciando o desenvolvimento de uma aplicação para essa finalidade. Mesmo assim, fui notificado de que a comunidade do AcBR já está desenvolvendo um componente exclusivo para envios de NFS-e. Quando este componente estiver disponível, com certeza vai facilitar bastante.
Em caso de mais dúvidas, erros ou dificuldades, deixe um comentário abaixo ou entre em contato por e-mail, ok?
Abraço, pessoal! Até mais!
Olá André.
Estou arrancando os cabelos com essa função do Ginfes.
Quando executo:
Resposta := WebService.RecepcionarLoteRpsV3(Cabecalho, XML);
ele me pede para selecionar o certificado. Até aí tudo ok. Em seguida dá o seguinte erro: —————————
Debugger Exception Notification
—————————
Project Project1.exe raised exception class Exception with message ‘Empty document’. Process stopped. Use Step or Run to continue.
—————————
OK Help
—————————
Quando tento o link pelo IE ele acessa ok. Aliás eu só consegui importar o webservice salvando-o num .xml no IE e em seguida importando no Delphi. Pois se eu for tentar importar direto do Delphi, ele dá o mesmo erro de Empty Document.
Por favor, me dê uma dica para resolver isso.
Obrigado.
Rogério Monteiro.
Olá, Rogério! Obrigado pela visita no blog. Pra ficar mais fácil, vou entrar em contato com você por e-mail, ok?
Olá André, parabéns pelo artigo. Estou começando do zero a desenvolver um programa para gerar e enviar o xml da NFS-e, mas não estou achando qual o WSDL de consumo para teste e produção, para que eu possa utilizar aqui em maceió – AL, você pode me ajudar e se possível mandar alguns exemplos em delphi.
Se possível, me ajuda.
Abraços,
Márcio Antônio.
Olá, Márcio! Obrigado pelo feedback sobre o artigo.
Márcio, na época, eu desenvolvi o consumidor do WebService enquanto trabalhava em Ribeirão Preto (SP), então não tenho conhecimento dos endereços WSDL de outras cidades. De qualquer forma, vou pesquisar e entro em contato com você caso encontre algo!
Abraço!
Olá, no momento que chamo a função RecepcionarLoteRpsV3 recebo um erro de o documento xml deve conter um elemento de nível superior.
Porém estou validando o xml com o xsd, e valida certinho.
Você poderia me ajudar? e/ou enviar um xml de envio de lote de RPS de exemplo.
Obrigado.
Olá, Élcio. Infelizmente não consigo apontar o motivo do erro sem uma análise minuciosa do código, mas posso lhe enviar um arquivo XML de exemplo, ok? Talvez com o exemplo seja possível identificar o problema! Abraço!
ola pode me ajudar estou usando webservice de enviar ja ta ok so que retorno e tipo dataset como ler retorno dataset do webservice? esta links do web service funcion StatusSMSNaoLido http://webservices.twwwireless.com.br/reluzcap/
StatusSMSNaoLido
Olá, Marcos! É a primeira vez que ouço falar neste WebService que você mencionou, portanto, não tenho conhecimentos aprofundados sobre ele.
Pelo que li no site do WebService, o método “StatusSMSNaoLido” retorna um objeto da classe “StatusSMSNaoLidoResult”. Talvez será necessário instanciar um objeto dessa classe para receber o retorno e, após isso, ler a propriedade “schema” do tipo TXMLData para acessar os dados.
Abraço!
André,
Boa noite !
Ja desenvolvi a rotina de comunicação com outra empresa que presta com a Prefeitura de Belem. Uso java pra comunicação. Agora comecei a fazer a integração com a Prefeitura de Ananindeua. A Empresa é a Ginfes. Você sabe qual o link de teste do web services. Por que o que esta no manual diz “Servidor temporariamente indisponivel, em manutenção, favor aguarda”.
https://ananindeua.ginfes.com.br/ServiceGinfesImpl?wsdl
Agradeço qualquer ajuda
Olá, Carlos!
Eu li seus comentários posteriores e notei que você já conseguiu resolver o problema. Que bom!
Já faz algum tempo que trabalhei com a GINFES, mas, caso eu encontre um exemplo do arquivo de lotes, lhe envio por e-mail, ok?
Abraço!
Boa tarde André, sei que já faz um tempo que trabalhou com a NFS-e, mas estamos desenvolvendo um sistema para gerar e transmitir RPS/Lotes em Ribeirão Preto também… Porém estamos com problemas na questão da estrutura do XML.
Não estamos conseguindo fazer o serviço aceitar nosso xml de forma alguma, apesar de que nenhuma ferramenta de validação schema reclama do xml. O webservice sempre retorna “E160 Arquivo enviado fora da estrutura…”
Se você puder nos dar uma força seria de grande valia!
Obrigado!
Olá, Giovani! Talvez eu possa ajudá-lo, sim!
Vou enviar um arquivo modelo por e-mail, ok?
Abraço!
Boa tarde André, estou tendo o mesmo problema E160 de arquivo enviado fora da estrutura, mesmo ja tendo enviado diversos lotes sem erro algum. Poderia me disponibilizar o arquivo modelo para que possa comparar? Desde já agradeço.
Olá, Ricardo, tudo certo?
O erro E160 é clássico, rsrs. Vou lhe enviar o arquivo por e-mail para que você possa fazer as devidas comparações, ok?
Abraço!
Bom dia André!
Estou recebendo a mensagem E160. Poderia disponibilizar o arquivo modelo para que eu possa comparar?
Desde já agradeço.
Olá, Lucas!
Claro que sim! Vou enviar o arquivo para você por e-mail.
Abraço!
André, boa tarde, estou iniciando com a NFSe e não tenho E-CNPJ e sim E-CPF, será que consigo comunicar com o webservice ginfes ?
Voce teria uma unit(DELPHI 7) em que eu possa espelhar para fazer o teste de comunicação, porque se eu não conseguir com o E-CPF; vou até um cliente e vou instalar o DELPHI 7 numa máquina com o E-CNPJ para ver se consigo alguma coisa.
grato
Stainle
Olá, Stainle!
Notei que você também me enviou um e-mail. Vou conversar com você por lá, ok?
Abraço!
Boa tarde André.
Cara, estou com problema na hora de importar a webservice do ginfes no projeto do C#, sempre traz a mesma mensagem:
There was an error downloading ‘https://homologacao.ginfes.com.br/ServiceGinfesImpl?wsdl/$metadata’.
The request was aborted: Could not create SSL/TLS secure channel.
Eu estou precisando desenvolver uma ferramenta que faça o envio de NFs diretamente no Ginfes de Manaus, porém não sei por onde começar, naquele manual deles, nada fica claro, e tentei utilizar XMLs de exemplo para enviar diretamente para o site, porém sem sucesso.
Pode entrar em contato comigo por email se for melhor para você.
Só para você entender melhor, eu vou pegar as informações da NF de um sistema e então a partir desses valores, eu pretendo gerar os XMLs das NFs para então fazer o envio em lote para o Ginfes.
Obrigado desde já.
Att,
Jairo
Boa tarde, Jairo, tudo bem?
Vou entrar em contato por e-mail para identificar se consigo ajudá-lo.
Abraço!
Olá André.
Me tire uma dúvida… ao enviar o XML pela solução online, ou seja, no próprio site do ginfes (ao invés de utilizar o webservice), eu preciso assinar o XML?
Testei diversos XML enviando no site do GINFES e todos me retornaram o erro: “Arquivo enviado fora da estrutura do arquivo XML de entrada.”.
Estou tentando no ginfes da prefeitura de Ribeirão Preto – SP.
Pode me ajudar?
Olá, Leonardo!
Sim, talvez eu possa ajudá-lo! Vou entrar em contato com você por e-mail.
Abraço!
Bom dia André
Consegui gerar o XML (no meu ver sem erro), assinalar o XML (alterando um pouco a rotina que eu já tinha da NFSe de São Paulo) e inserindo o certificado na conexão com o ws, mas sempre recebo o erro “E160-Arquivo enviado fora da estrutura do arquivo XML de entrada”. Gostaria de tirar algumas dúvidas, pois há a possibilidade do problema não ser exatamente programação.
1. Estou fazendo a requisição para o endereço https://producao.ginfes.com.br/ServiceGinfesImpl (a empresa que estou testando é de São Caetano do Sul / SP)
2. Não fiz qualquer requisição formal à prefeitura ou terceiros para utilizar o webservice. É necessário pedir a habilitação do serviço a alguém?
3. Codigo executado (C#)
ServiceGinfesImplService lobjGinfesService;
lobjGinfesService = new ServiceGinfesImplService(); //url = https://producao.ginfes.com.br//ServiceGinfesImpl
lobjGinfesService.Proxy = WebRequest.GetSystemWebProxy();
lobjGinfesService.ClientCertificates.Add(clsCertificado.getCertificado(mobjEmpFaturamento.Codigo));
lstrXmlReturn = lobjGinfesService.RecepcionarLoteRps(lobjXmlDoc.InnerXml); // lobjXmlDoc.InnerXml = todo o conteúdo (inclusive o do arquivo http://customizit.com.br/files/Envio_18112017114243.XML)
XML de requisição: http://customizit.com.br/files/Envio_18112017114243.XML
XML de resposta: http://customizit.com.br/files/Retorno_18112017114344.XML
Por favor me ajudem! To até pagando pra quem puder me ajudar!
abraços
Olá, Dimas!
Vou entrar em contato com você por e-mail!
Abraço!
1. Estou fazendo a requisição para o endereço https://producao.ginfes.com.br/ServiceGinfesImpl (a empresa que estou testando é de São Caetano do Sul / SP)
2. Não fiz qualquer requisição formal à prefeitura ou terceiros para utilizar o webservice. É necessário pedir a habilitação do serviço a alguém?
Olá, Francisco, como vai?
Não me lembro muito bem, mas acredito que não é necessário solicitar permissão para utilização, já que os RPS enviados ao WebService já terão os dados do emissor. A única condição obrigatória é a assinatura do XML.
Abraço!
André,
Estou consultando o WS da ginfes para poder buscar as notas de meus clientes, porém o WS precisa de um número de lote ou da nota. Existe alguma possibilidade de eu colocar apenas o CNPJ, data de início e fim para ele consultar e me retornar as notas?
Olá, Rafael, boa noite.
Se o número do lote ou da nota forem obrigatórios para a consulta, então devem ser informados.
Para o seu caso, eu sugiro que verifique na documentação do WebService se há algum método que possibilita a consulta das notas pelos parâmetros que você mencionou.
Abraço!
Olá André
Estou gerando o XML e quando tento transmitir recebo o seguinte erro:
“E185 – Arquivo de cabeçalho enviado fora da estrutura do arquivo XML de entrada.”
O cabeçalho que estou enviando é esse: “3”
Gostaria que você me ajudasse pois não estou conseguindo solucionar esse erro
Estou tentando no ginfes da prefeitura de Caruaru – PE.
Pode me ajudar?
Olá, Deophanes, como vai?
Já fazem aproximadamente 6 anos que não trabalho mais com a GINFES, e certamente muita coisa mudou desde então.
De qualquer forma, eu também tive este mesmo problema. Passei horas tentando identificar o problema, mas sem sucesso. No meu caso, consegui entrar em contato com o suporte da GINFES e enviei o meu arquivo para eles analisarem. Em alguns minutos, eles identificaram que a falha estava na tag de unidade federal (era “Uf”, com a segunda letra em minúscula, ao invés de “UF”, tudo em maiúscula).
Procure investigar estes detalhes, ou peça um arquivo de exemplo para a GINFES para que você possa usar como comparação. Isso me ajudou bastante na época.
Abraço!
Boa tarde!
Estou implementando a emissão de NFSE e ao tentar enviar a RPS recebo a mensagem:
“SoapFault: Cannot find child element: arg0 ”
Creio que tenha relação com parameterOrder porém não faço ideia no que enviar nele, alguma sugestão?
Olá, Helidalto!
Não trabalho mais com a GINFES há aproximadamente 7 anos, e muitas regras provavelmente mudaram neste tempo.
Eu recomendo que você use a documentação do WebService. Isso me ajudou bastante na época. Em outras ocasiões, eu conseguia entrar em contato com o suporte da GINFES e enviar o meu arquivo para análise. Em pouco tempo, eles identificavam a falha no arquivo, que muitas vezes eram pequenas, como letras em maiúsculas, campos obrigatórios não preenchidos e dados fora dos formatos esperados.
Procure investigar estes detalhes, ou peça um arquivo de exemplo para a GINFES para que você possa usar como comparação.
Espero ter ajudado.
Abraço!
Olá André tudo bem? Sou Caroline e estamos estamos desenvolvendo um aplicativo para consultar NFSE (“servico_consultar_nfse_envio_v03.xsd”) de um cliente nosso de Ribeirao Preto, mas estou com o erro E160. Por gentileza, você não teria um XML de exemplo para nos ajudar? Muito Obrigada!!!
Vou entrar em contato com você, Caroline!