NFSe - Brasilia PHP

Boa tarde Luiz, li bastante suas respostas em outros questionamentos, estou utilizando um código que você postou aqui no forum e estou recebendo o erro: E160, Cabecalho deve obedecer a um schema válido.

Onde posso estar errando?

<?php
                             
$arquivo            = 'xml/consulta.xml';
$xml				= htmlentities(file_get_contents($arquivo));
$cabecalho			= htmlentities('<cabecalho versao="2.04" xmlns="http://www.abrasf.org.br/nfse.xsd"><versaoDados>2.04</versaoDados></cabecalho>');

 
$envelope = 
'<?xml version="1.0" encoding="UTF-8"?>
 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br">
 <soapenv:Header/>
 <soapenv:Body>
 <ConsultarNfseServicoPrestado>
    <nfseCabecMsg>'.$cabecalho.'</nfseCabecMsg>
    <nfseDadosMsg>'.$xml.'</nfseDadosMsg>
 </ConsultarNfseServicoPrestado>
 </soapenv:Body>
 </soapenv:Envelope>';
 

$url = 'https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx';
  
$headers = array(
    "Content-type: text/xml; charset=utf-8",
    "SOAPAction: http://nfse.abrasf.org.br/ConsultarNfseServicoPrestado", 
    "Content-length: ".strlen($envelope),
);

//echo $envelope;
//exit;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $envelope); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  
//echo $envelope;exit;   
    
// converting
$html = utf8_decode(curl_exec($ch));

file_put_contents("$arquivo.ret", $html);
curl_close($ch);

preg_match_all('/<outputXML>(.*?)<\/outputXML>/s', $html, $matches);

$response = html_entity_decode(count($matches)&&count($matches[1])?$matches[1][0]:$html);
    
echo "<pre>$response</pre>";  

?>

Aqui é o arquivo que estou enviando!

<?xml version="1.0" encoding="UTF-8"?>
<ConsultarNfseServicoPrestadoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"> 
    <Prestador>
      <CpfCnpj>
        <Cnpj>08378676000125</Cnpj>
      </CpfCnpj>
      <InscricaoMunicipal>0748143200193</InscricaoMunicipal>
    </Prestador>
    <PeriodoEmissao>
      <DataInicial>2022-10-01</DataInicial>
      <DataFinal>2022-10-06</DataFinal>
    </PeriodoEmissao>
    <Pagina>1</Pagina>  
</ConsultarNfseServicoPrestadoEnvio>
1 curtida

Vocês está enviando realmente para Brasília?

Se for, acho que não é esse modelo.

Até onde eu me lembre é o mesmo modelo da Receita Federal para envio de Notas de Produtos.

Bom dia Luiz, obrigado pelo seu retorno, tivemos uma informação da prefeitura que usaria a versão Abrasf 2.04 http://www.abrasf.org.br/pagina_publica.php , peguei os arquivos exemplos, esse arquivo que postei é de busca de notas emitidas…

Esse é o webservice que enviaram pra gente!
https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx

Agora que e entendi o que você quis dizer, então, a partir de 01/11/2022 Brasília vai começar a usar a NFS-e da NOTA CONTROL.

Ah bom!

Eu tenho esse código em C#:


        public string SendRequest(string data, string action)
        {
            try
            {
                WebRequestHandler handler = new WebRequestHandler();
                if (this.Certificado != null)
                    handler.ClientCertificates.Add(this.Certificado);
                HttpClient client = new HttpClient(handler);
                client.DefaultRequestHeaders.ExpectContinue = false;
                client.DefaultRequestHeaders.Add("Accept", "*/*");
                //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/soap+xml"));
                //client.DefaultRequestHeaders.Add("SOAPAction", action);
                client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.8806)");
                client.DefaultRequestHeaders.TransferEncodingChunked = null;

                StringContent queryString = new StringContent(data, Encoding.UTF8, "text/xml");
                HttpResponseMessage response = client.PostAsync(new Uri(this.Url), queryString).Result;
                String responseValue = string.Empty;
                Stream responseStream = null;


                /*
                if (response != null)
                {
                    //response.EnsureSuccessStatusCode();
                    this.cLastCode = response.StatusCode;

                    Task task = response.Content.ReadAsStringAsync().ContinueWith(t =>
                    {
                        responseValue = t.Result;
                    });

                    task.Wait();
                };
                */

                if (response != null)
                {
                    Task task = response.Content.ReadAsStreamAsync().ContinueWith(t =>
                    {
                        responseStream = t.Result;
                    });
                    task.Wait();

                    string encoding = String.Join(",", response.Content.Headers.ContentEncoding);

                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                        responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                        responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);

                    using (StreamReader streamReader = new StreamReader(responseStream))
                    {
                        responseValue = streamReader.ReadToEnd();
                    }

                }

                return responseValue;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string ConsultarLoteRps(string CNPJ, string IM, string Protocolo)
        {
            String NfseDados = String.Format(
                "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;" +
                "&lt;ConsultarLoteRpsEnvio xmlns=\"http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_consultar_lote_rps_envio.xsd\" " +
                                         " xmlns:tc=\"http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd\"&gt;" +
                "&lt;Prestador&gt;" +
                "&lt;tc:CpfCnpj&gt;" +
                "&lt;tc:Cnpj&gt;{0}&lt;/tc:Cnpj&gt;" +
                "&lt;/tc:CpfCnpj&gt;" +
                "&lt;tc:InscricaoMunicipal&gt;{1}&lt;/tc:InscricaoMunicipal&gt;" +
                "&lt;/Prestador&gt;" +
                "&lt;Protocolo&gt;{2}&lt;/Protocolo&gt;" +
                "&lt;/ConsultarLoteRpsEnvio&gt;", CNPJ, IM, Protocolo);

            String s = String.Format(
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
                "<S:Body>" +
                "<ConsultarLoteRps xmlns=\"http://www.issnetonline.com.br/webservice/nfd\">" +
                "<xml>{0}</xml>" +
                "</ConsultarLoteRps>" +
                "</S:Body></S:Envelope>",
                NfseDados);


            File.WriteAllText(cFileName.Replace(".xml", ".soap.xml"), s);

            return this.SendRequest(s, "http://www.issnetonline.com.br/webservice/nfd/ConsultarLoteRps");
        }

        public String ConsultarNfsePorRps(String CNPJ, String IM, String RPS, String SERIE)
        {
            String NfseDados = String.Format(
                "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;" +
                "&lt;ConsultarNfseRpsEnvio xmlns=\"http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_consultar_nfse_rps_envio.xsd\" " +
                                         " xmlns:tc=\"http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd\"&gt;" +
                "&lt;IdentificacaoRps&gt;" +
                "&lt;tc:Numero&gt;{0}&lt;/tc:Numero&gt;" +
                "&lt;tc:Serie&gt;{1}&lt;/tc:Serie&gt;" +
                "&lt;tc:Tipo&gt;1&lt;/tc:Tipo&gt;" +
                "&lt;/IdentificacaoRps&gt;" +
                "&lt;Prestador&gt;" +
                "&lt;tc:CpfCnpj&gt;&lt;tc:Cnpj&gt;{2}&lt;/tc:Cnpj&gt;&lt;/tc:CpfCnpj&gt;" +
                "&lt;tc:InscricaoMunicipal&gt;{3}&lt;/tc:InscricaoMunicipal&gt;" +
                "&lt;/Prestador&gt;" +
                "&lt;/ConsultarNfseRpsEnvio&gt;", RPS, SERIE, CNPJ, IM);


            String s = String.Format(
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
                "<soap:Body>" +
                "<ConsultarNFSePorRPS xmlns =\"http://www.issnetonline.com.br/webservice/nfd\">" +
                "<xml>{0}</xml>" +
                "</ConsultarNFSePorRPS>" +
                "</soap:Body>" +
                "</soap:Envelope>",
                NfseDados);

            File.WriteAllText(cFileName.Replace(".xml", ".soap.xml"), s);

            return this.SendRequest(s, "http://www.issnetonline.com.br/webservice/nfd/ConsultarNFSePorRPS");
        }

Pelos schemas que eles passaram parece ser outra versão/padrão, relataram no e-mail ser Abrasf 2.04, que seria esse xml que coloquei no primeiro post. Eu valido a estrutura no XSD e envio ao wsdl e mesmo assim retorna E160, Cabecalho deve obedecer a um schema válido…

De todo modo, vou tentar enviar essa versão que tu mostrou aqui, se tiver sucesso eu retorno. Abraços, e obrigado pela atenção!

Dê uma olhada nesse tópico abaixo.
Também é no padrão 2.04:

Alguém conseguiu resolver esse problema? Estou fazendo a integração de Brasília com ABRASF 2.04, e estou no mesmo erro do colega que criou o tópico.

Endpoint: https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx

Envelope:

<soapenv:Envelope
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
	xmlns:nfse="http://nfse.abrasf.org.br">
	<soapenv:Header/>
	<soapenv:Body>
		<nfse:ConsultarNfseServicoPrestado>
			<nfseCabecMsg>
				<cabecalho versao="2.04">
					<versaoDados>2.04</versaoDados>
				</cabecalho>
			</nfseCabecMsg>
			<nfseDadosMsg>
				<ConsultarNfseServicoPrestadoEnvio
					xmlns="http://www.abrasf.org.br/nfse.xsd">
					<Prestador>
						<CpfCnpj>
							<Cnpj>11111111111111</Cnpj>
						</CpfCnpj>
						<InscricaoMunicipal>1111111</InscricaoMunicipal>
					</Prestador>
					<NumeroNfse>1</NumeroNfse>
					<PeriodoCompetencia>
						<DataInicial>2006-08-19-03:00</DataInicial>
						<DataFinal>2009-05-16</DataFinal>
					</PeriodoCompetencia>
					<Pagina>1</Pagina>
				</ConsultarNfseServicoPrestadoEnvio>
			</nfseDadosMsg>
		</nfse:ConsultarNfseServicoPrestado>
	</soapenv:Body>
</soapenv:Envelope>

O nfseCabecMsg está sendo validado certinho, o nfseDadosMsg não. A mensagem retornada aqui é:

ConsultarNfseServicoPrestado deve obedecer a um schema válido.

Qualquer ajuda, agradeço imensamente :stuck_out_tongue_winking_eye:

(estou usando CNPJ e Inscrição municipal de verdade, substituí por 1111111111 só para postar aqui no tópico.)

Você não pode mandar assim não.
Tem que converter para TEXTO.
O conteúdo do nfseCabecMsg e nfseDadosMsg.

A saber, consegui resolver. O problema é que esse webservice não está seguindo o padrão 2.04 à risca que está descrito no XSD.

Esse webservice em questão tem 2 tags a mais, Pedido e Signature. Segue exemplo:

Endpoint: https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx
Método: ConsultarNfseServicoPrestado
Body (sem o envelope):

<ConsultarNfseServicoPrestadoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">
	<Pedido>
		<Prestador>
			<CpfCnpj>
				<!--Obrigatório CPF ou CNPJ. Não enviar ambas as tags. -->
				<Cnpj>?</Cnpj>
				<Cpf>?</Cpf>
			</CpfCnpj>
			<!-- Obrigatório -->
			<InscricaoMunicipal>?</InscricaoMunicipal>
		</Prestador>
		<!-- Obrigatória uma das três opções. Informar NumeroNfse OU  PeriodoEmissao OU PeriodoCompetencia. Não enviar mais de 1.-->
		<NumeroNfse>?</NumeroNfse>
		<PeriodoEmissao>
			<DataInicial>?</DataInicial>
			<DataFinal>?</DataFinal>
		</PeriodoEmissao>
		<PeriodoCompetencia>
			<DataInicial>?</DataInicial>
			<DataFinal>?</DataFinal>
		</PeriodoCompetencia>
		<!-- Opcional -->
		<Tomador>
			<CpfCnpj>
				<!-- CPF ou CNPJ. Não enviar ambas as tags. -->
				<Cnpj>?</Cnpj>
				<Cpf>?</Cpf>
			</CpfCnpj>
			<InscricaoMunicipal>?</InscricaoMunicipal>
		</Tomador>
		<!-- Opcional -->
		<Intermediario>
			<CpfCnpj>
				<!-- CPF ou CNPJ. Não enviar ambas as tags. -->
				<Cnpj>?</Cnpj>
				<Cpf>?</Cpf>
			</CpfCnpj>
			<InscricaoMunicipal>?</InscricaoMunicipal>
		</Intermediario>
		<!-- Obrigatório -->
		<Pagina>?</Pagina>
	</Pedido>
	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
	    	<!-- Assinatura nos moldes que conhecemos -->
	</Signature>
</ConsultarNfseServicoPrestadoEnvio>

Bom dia.

Amigo você conseguiu fazer a chamada com sucesso ao webservice
https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx

Eu não consigo de jeito nenhum, sempre dá erro E160, Cabecalho deve obedecer a um schema válido. O erro inicial lá do nosso amigo Douglas.

Poderia me passar como está o seu cabeçalho?

Desde já, obrigado.

Fiz um curl de exemplo que funciona:

curl --request POST \
  --url https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx \
  --header 'Content-Type: text/xml' \
  --header 'SOAPAction: http://nfse.abrasf.org.br/ConsultarNfseServicoPrestado' \
  --data '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nfse="http://nfse.abrasf.org.br">
	<SOAP-ENV:Body>
		<nfse:ConsultarNfseServicoPrestado>
			<nfseCabecMsg><cabecalho versao="1.00" xmlns="http://www.abrasf.org.br/nfse.xsd"><versaoDados>2.04</versaoDados></cabecalho></nfseCabecMsg>
			<nfseDadosMsg>
				<ConsultarNfseServicoPrestadoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">
	<Pedido>
		<Prestador>
			<CpfCnpj>
				<Cnpj>11111111111111</Cnpj>
			</CpfCnpj>
			<InscricaoMunicipal>1111111111</InscricaoMunicipal>
		</Prestador>
		<NumeroNfse>123</NumeroNfse>
		<Pagina>1</Pagina>
	</Pedido>
	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
		<SignedInfo>
			<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
			<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
			<Reference URI="">
				<Transforms>
					<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
				</Transforms>
				<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
				<DigestValue>3232</DigestValue>
			</Reference>
		</SignedInfo>
		<SignatureValue>werwerew</SignatureValue>
		<KeyInfo>
			<X509Data>
				<X509Certificate>rwerewrwerwe</X509Certificate>
			</X509Data>
		</KeyInfo>
	</Signature>
</ConsultarNfseServicoPrestadoEnvio>

			</nfseDadosMsg>
		</nfse:ConsultarNfseServicoPrestado>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>'
1 curtida

Segue em anexo o arquivo .INI do ACBR

ISSNet.txt (6,4,KB)

O Cabeçalho pode ser enviado dessa forma:

<cabecalho versao="1.00" xmlns="http://www.issnetonline.com.br/webservice/nfd">
<versaoDados>1.00</versaoDados>
</cabecalho>

Não esqueça de converter para texto usando htmlentities no caso de PHP.

1 curtida

Obrigado Luiz.

Com esse cabeçalho mudando a versaoDados para 2.04 eu consegui…

Obrigado!!!

Bom dia Pessoal, estou correndo contra o tempo para adaptar meu sistema já que não será mais permitido nota conjugada no DF.

Usando os exemplos postados acima ainda não consegui, me retorna a seguinte mensagem: s:Client ConsultarNfseServicoPrestado deve obedecer a um schema válido.

Vou postar o meu aqui para identificar o erro:


$arquivo            = 'xml/consulta.xml';
$xml				= htmlentities(file_get_contents($arquivo));
$cabecalho			= htmlentities('<cabecalho versao="1.00" xmlns="http://www.issnetonline.com.br/webservice/nfd"><versaoDados>2.04</versaoDados></cabecalho>');

 
$envelope = 
'<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nfse="http://nfse.abrasf.org.br">
	<SOAP-ENV:Body>
		<nfse:ConsultarNfseServicoPrestado>
			<nfseCabecMsg>'.$cabecalho.'</nfseCabecMsg>
            <nfseDadosMsg>'.$xml.'</nfseDadosMsg>
		</nfse:ConsultarNfseServicoPrestado>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>';
 

$url = 'https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx';
  
$headers = array(
    "Content-type: text/xml; charset=utf-8",
    "SOAPAction: http://nfse.abrasf.org.br/ConsultarNfseServicoPrestado", 
    "Content-length: ".strlen($envelope),
);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $envelope); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

print_r(curl_exec($ch));

curl_close($ch);

XML:

<ConsultarNfseServicoPrestadoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">
	<Pedido>
		<Prestador>
			<CpfCnpj>
				<Cnpj>*****</Cnpj>
			</CpfCnpj>
			<InscricaoMunicipal>*****</InscricaoMunicipal>
		</Prestador>
		<PeriodoEmissao>
			<DataInicial>2022-10-01</DataInicial>
			<DataFinal>2022-10-20</DataFinal>
		</PeriodoEmissao>
		<Pagina>1</Pagina>
	</Pedido>
	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
		<SignedInfo>
			<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
			<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
			<Reference URI="">
				<Transforms>
					<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
				</Transforms>
				<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
				<DigestValue>...</DigestValue>
			</Reference>
		</SignedInfo>
		<SignatureValue>...</SignatureValue>
		<KeyInfo>
			<X509Data>
				<X509Certificate>...</X509Certificate>
			</X509Data>
		</KeyInfo>
	</Signature>
</ConsultarNfseServicoPrestadoEnvio>

Foi prorrogado para 01/01/2023 !!

https://www.receita.fazenda.df.gov.br/aplicacoes/CartaServicos/servico.cfm?codTipoPessoa=7&codServico=1202&codSubCategoria=346

Aqui em Brasília, de certa forma já estavam esperando que iria ser prorrogado

Amigos, aonde consigo as urls de homologacao e producao para o DF. Já entrei em contato com a empresa e com a sefaz e ninguem responde. Se alguem tiver a relacao dos webservices ei ficarei muito grato.

Homologação:
Url: https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx
Wsdl: https://www.issnetonline.com.br/homologaabrasf/webservicenfse204/nfse.asmx?WSDL

Porque você está tentando usar esse método?
Normalmente as empresas não implementam todos.
Acaba que consta na documentação, mas não funciona.

Tente integrar com os métodos padrões primeiro:

  • ConsultarNfsePorFaixa
  • ConsultarNfsePorRps

Olha o exemplo de consulta nfse que fiz em python para Anápolis/GO: