Ir para conteúdo
  • Cadastre-se

dev botao

NFe.CriarEnviarNFe - Retorno JSON


Ver Solução Respondido por José M. S. Junior,
  • Este tópico foi criado há 1094 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Pessoal boa tarde!

Estou tentando ainda integração do PHP com NFCe, e notei, o que acho que pode ser um problema no retorno da função NFe.CriarEnviarNFe (pois é um retorno diferente da SAT.CriarEnviarCFe)

O retorno não é um JSON válido como no JSON da SAT.CriarEnviarCFe, pois vem algumas informações no meio que deixa a "string" malformada, se for fazer o parser direto do retorno (no meu caso usando a json_decode)

Existe alguma configuração a ser feita no ACBr ou você poderiam dar alguma idéia de como eu trabalharia com esse retorno para facilitar sua leitura ?
Lembrando que trabalho com o JSON por achar mais fácil a integração por TCP/IP que atualmente já funciona no meu projeto com o SAT, ok ?
 

Estou encaminhando em anexo os 2 retornos para comparação, e melhor entendimento do que tentei descrever.

 

Obs: uso como base também a classe de exemplo ClientSocket, que tem a função trataretorno que ajudou muito em todo o processo.

 

Desde já agradeço a todos.

 

SAT_CriarEnviarCFe_retorno.txt NFE_CriarEnviarNFe_retorno.txt

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Boa tarde,

Lendo o Json utilizando o NotePad++ o mesmo parece valido... O que precisa fazer nesse caso é realizar parser apenas o conteúdo do Json ( entre chaves {} ). Diversos métodos do Monitor pode retornar mensagens informativas como por exemplo o Path onde o Monitor Gravou o XML, isso é mantido devido a compatibilidade para quem já utiliza essas informações, mas não entra no Scopo do Json pois não faz parte da Resposta com as tags do WebService em si...

Talvez possamos tratar isso no Monitor quando estiver trabalhando com retorno JSon, mas teria que ser revisado todos os métodos...

image.png

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
32 minutos atrás, José M. S. Junior disse:

Boa tarde,

Lendo o Json utilizando o NotePad++ o mesmo parece valido... O que precisa fazer nesse caso é realizar parser apenas o conteúdo do Json ( entre chaves {} ). Diversos métodos do Monitor pode retornar mensagens informativas como por exemplo o Path onde o Monitor Gravou o XML, isso é mantido devido a compatibilidade para quem já utiliza essas informações, mas não entra no Scopo do Json pois não faz parte da Resposta com as tags do WebService em si...

Talvez possamos tratar isso no Monitor quando estiver trabalhando com retorno JSon, mas teria que ser revisado todos os métodos...

image.png

José boa tarde!

Primeiramente obrigado pelo rápido retorno.

Eu imaginei mesmo que não seria algo fácil de se resolver, mas acho que seria algo válido a ser analisado, talvez em futuras versões, quando se tratar de JSON, dos retornos serem apenas json validos, sem necessidade de algum tratamento por parte da aplicação que estiver consumindo.

De qualquer forma vou tentar verificar como fazer um tratamento por aqui na minha aplicação, e qualquer coisa posto para ajudar quem precisar ou passar pelo mesmo problema.

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Sim, elimino sim.

Na verdade a função trataretorno da ClienteSocket, ela "transforma" o OK e ERRO em chaves do array, em tese eu só precisaria fazer um json_decode no $retorno['OK']. Algo como:

$sc = new Acbr\ClientSocket();

$sc->open($host, $porta);

$resposta = $sc->recv();

$resposta = $sc->send("NFe.CriarEnviarNFe(\"".$ini_string.",1,1,,,0\")".$crlf);

$info = $sc->trataRetorno($resposta); 



if($info['OK'] != ''){
	$json = json_decode($info['OK']); // aqui é que dá erro pois não é um json válido

}else{

}

 

Já com o retorno que o SAT.CriarEnviarCFe funciona perfeitamente.

$sc = new Acbr\ClientSocket();
$sc->open($host, $porta);
$resposta = $sc->recv();

$sc->send('SAT.Inicializar()'.$crlf);
$resposta = $sc->recv();
$resposta = $sc->send("SAT.CriarEnviarCFe(\"".$ini_string."\")".$crlf);

$info = $sc->trataRetorno($resposta);	

if($info['OK'] != ''){
	$json = json_decode($info['OK']);
}else{
	//pode ser erro
}
// aqui já tenho um "objeto" como:
$json->ENVIO->NumeroSessao
$json->ENVIO->Resultado
$json->ENVIO->Arquivo
$json->ENVIO->XML

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
15 horas atrás, Eder J. Silva disse:

Pelo teste que fiz não mudou o retorno.

De qualquer forma vou reinstalar a outra versão e fazer a comparação e retorno novamente, assim que retornar de um cliente.

@José M. S. Junior

Bom dia!

Realizei os testes conforme combinado, e realmente não notei mudanças no retorno.

Em anexo o LOG para análise da equipe.

Qualquer dúvida me avise.

log_testes_ACBR.txt

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Sim, exatamente isso.

Creio que se conseguíssemos que a mensagem ficasse algo como:
 

OK: {
	"Arquivo": "D:\\ACBrMonitorPLUS32\\Logs\\31210238418823000104650010000000011886376580-nfe.xml",
	"Informacoes": {
		"Envio": [{
				"CStat": 103,
				"CUF": 31,
				"DhRecbto": "2021-02-19T08:02:58.000Z",
				"Msg": "Lote recebido com sucesso",
				"NProt": "",
				"NRec": "310000034744221",
				"TMed": 1,
				"VerAplic": "J-1.4.45",
				"Versao": "4.00",
				"XMotivo": "Lote recebido com sucesso",
				"tpAmb": "2"
			},
			{
				"Retorno": {
					"CStat": 104,
					"CUF": 31,
					"ChaveDFe": "31210238418823000104650010000000011886376580",
					"DhRecbto": "1899-12-30T00:00:00.000Z",
					"Items001": {
						"Id": "",
						"XML": "<protNFe versao=\\\"4.00\\\"><infProt><tpAmb>2</tpAmb><verAplic>J-1.4.45</verAplic><chNFe>31210238418823000104650010000000011886376580</chNFe><dhRecbto>2021-02-19T08:02:58-03:00</dhRecbto><cStat>479</cStat><xMotivo>Rejeicao: Data de Emissao anterior a data de credenciamento ou anterior a Data de Abertura do estabelecimento</xMotivo></infProt></protNFe>",
						"cStat": 479,
						"chDFe": "31210238418823000104650010000000011886376580",
						"dhRecbto": "2021-02-19T08:02:58.000Z",
						"digVal": "",
						"nProt": "",
						"tpAmb": "2",
						"verAplic": "J-1.4.45",
						"xMotivo": "Rejeicao: Data de Emissao anterior a data de credenciamento ou anterior a Data de Abertura do estabelecimento"
					},
					"Msg": "Nota(s) nao confirmadas:\\r\\n1->479-Rejeicao: Data de Emissao anterior a data de credenciamento ou anterior a Data de Abertura do estabelecimento",
					"Protocolo": "",
					"VerAplic": "W-1.4.45",
					"Versao": "4.00",
					"XMotivo": "Lote processado",
					"cMsg": 0,
					"nRec": "310000034744221",
					"tpAmb": "2",
					"xMsg": ""
				}
			}
		],
		"NFe_Arq1": {
			"Arquivo": "D:\\ACBrMonitorPLUS32\\Logs\\31210238418823000104650010000000011886376580-nfe.xml"
		}
	}
}

Já daria para trabalhar sem problemas.

 

Apenas uma sugestão, ok ?

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Como eu disse a ultima chave e as mensagens iniciais não fazem parte da Classe de retornos do WebService, é algo específico do Monitor acrescentado na Resposta para manter a compatibilidade e não alterar as tags que já existiam. Mas vamos verificar para retornar apenas o Json válido...

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Moderadores

Bom dia, para solucionar a questão especifica do método de Envio da NFe foi realizado uma validação para considerar apenas as classes que geram o Json na resposta, favor realizar um teste com a versão abaixo e reportar aqui...

 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Membros Pro
Em 03/03/2021 at 08:50, José M. S. Junior disse:

Bom dia, para solucionar a questão especifica do método de Envio da NFe foi realizado uma validação para considerar apenas as classes que geram o Json na resposta, favor realizar um teste com a versão abaixo e reportar aqui...

 

José bom dia!


Desculpe a demora no retorno, estava em processo de renovação da assinatura.

Realizei um teste e acho que "quase chegamos lá", só acho que:

1 - faltou retornar no JSON o local do arquivo quando a NFCe/NFe é autorizada.

{ "Envio" : { "CStat" : 103, "CUF" : 31, "DhRecbto" : "2021-03-13T06:35:17.000Z", "Msg" : "Lote recebido com sucesso", "NProt" : "", "NRec" : "310000035705936", "TMed" : 1, "VerAplic" : "J-1.4.49", "Versao" : "4.00", "XMotivo" : "Lote recebido com sucesso", "tpAmb" : "2" } }
{ "Retorno" : { "CStat" : 104, "CUF" : 31, "ChaveDFe" : "31210311111111111111650010000000061496647830", "DhRecbto" : 0.0000000000000000E+000, "Items001" : { "Id" : "ID131210023107911", "XML" : "<protNFe versao=\\\"4.00\\\"><infProt Id=\\\"ID131210023107911\\\"><tpAmb>2</tpAmb><verAplic>J-1.4.49</verAplic><chNFe>31210311111111111111650010000000061496647830</chNFe><dhRecbto>2021-03-13T06:35:17-03:00</dhRecbto><nProt>131210023107911</nProt><digVal>ZWGmDl1BLd1t83+IHv40Bv4RWR4=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe>", "cStat" : 100, "chDFe" : "31210311111111111111650010000000061496647830", "dhRecbto" : "2021-03-13T06:35:17.000Z", "digVal" : "ZWGmDl1BLd1t83+IHv40Bv4RWR4=", "nProt" : "131210023107911", "tpAmb" : "2", "verAplic" : "J-1.4.49", "xMotivo" : "Autorizado o uso da NF-e" }, "Msg" : "Autorizado o uso da NF-e", "Protocolo" : "131210023107911", "VerAplic" : "W-1.4.49", "Versao" : "4.00", "XMotivo" : "Lote processado", "cMsg" : 0, "nRec" : "310000035705936", "tpAmb" : "2", "xMsg" : "","Arquivo": "D:\\ACBrMonitorPLUS32\\Arqs\\11111111111111\\NFCe\\202103\\NFCe\\31210311111111111111650010000000091273114590-nfe.xml" } }

Note que no final do JSON equivalente ao Retorno da consulta do protocolo adicionei a propriedade "Arquivo" com o caminho retornado antigamente no [NFe_Arq9] Arquivo=[caminho_do_arquivo_salvo]

2 - Ainda acho que se conseguisse devolver o JSON, como um array, facilitaria a aplicação tratar o retorno sem precisar "reformatar":

Retorno atual:

{ "Envio" : { "CStat" : 103, "CUF" : 31, "DhRecbto" : "2021-03-13T06:35:17.000Z", "Msg" : "Lote recebido com sucesso", "NProt" : "", "NRec" : "310000035705936", "TMed" : 1, "VerAplic" : "J-1.4.49", "Versao" : "4.00", "XMotivo" : "Lote recebido com sucesso", "tpAmb" : "2" } }
{ "Retorno" : { "CStat" : 104, "CUF" : 31, "ChaveDFe" : "31210311111111111111650010000000061496647830", "DhRecbto" : 0.0000000000000000E+000, "Items001" : { "Id" : "ID131210023107911", "XML" : "<protNFe versao=\\\"4.00\\\"><infProt Id=\\\"ID131210023107911\\\"><tpAmb>2</tpAmb><verAplic>J-1.4.49</verAplic><chNFe>31210311111111111111650010000000061496647830</chNFe><dhRecbto>2021-03-13T06:35:17-03:00</dhRecbto><nProt>131210023107911</nProt><digVal>ZWGmDl1BLd1t83+IHv40Bv4RWR4=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe>", "cStat" : 100, "chDFe" : "31210311111111111111650010000000061496647830", "dhRecbto" : "2021-03-13T06:35:17.000Z", "digVal" : "ZWGmDl1BLd1t83+IHv40Bv4RWR4=", "nProt" : "131210023107911", "tpAmb" : "2", "verAplic" : "J-1.4.49", "xMotivo" : "Autorizado o uso da NF-e" }, "Msg" : "Autorizado o uso da NF-e", "Protocolo" : "131210023107911", "VerAplic" : "W-1.4.49", "Versao" : "4.00", "XMotivo" : "Lote processado", "cMsg" : 0, "nRec" : "310000035705936", "tpAmb" : "2", "xMsg" : "" } }

Retorno como array:

[{ "Envio" : { "CStat" : 103, "CUF" : 31, "DhRecbto" : "2021-03-13T06:35:17.000Z", "Msg" : "Lote recebido com sucesso", "NProt" : "", "NRec" : "310000035705936", "TMed" : 1, "VerAplic" : "J-1.4.49", "Versao" : "4.00", "XMotivo" : "Lote recebido com sucesso", "tpAmb" : "2" } },{ "Retorno" : { "CStat" : 104, "CUF" : 31, "ChaveDFe" : "31210311111111111111650010000000061496647830", "DhRecbto" : 0.0000000000000000E+000, "Items001" : { "Id" : "ID131210023107911", "XML" : "<protNFe versao=\\\"4.00\\\"><infProt Id=\\\"ID131210023107911\\\"><tpAmb>2</tpAmb><verAplic>J-1.4.49</verAplic><chNFe>31210311111111111111650010000000061496647830</chNFe><dhRecbto>2021-03-13T06:35:17-03:00</dhRecbto><nProt>131210023107911</nProt><digVal>ZWGmDl1BLd1t83+IHv40Bv4RWR4=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe>", "cStat" : 100, "chDFe" : "31210311111111111111650010000000061496647830", "dhRecbto" : "2021-03-13T06:35:17.000Z", "digVal" : "ZWGmDl1BLd1t83+IHv40Bv4RWR4=", "nProt" : "131210023107911", "tpAmb" : "2", "verAplic" : "J-1.4.49", "xMotivo" : "Autorizado o uso da NF-e" }, "Msg" : "Autorizado o uso da NF-e", "Protocolo" : "131210023107911", "VerAplic" : "W-1.4.49", "Versao" : "4.00", "XMotivo" : "Lote processado", "cMsg" : 0, "nRec" : "310000035705936", "tpAmb" : "2", "xMsg" : "" } }]

note que apenas adicionei um " [ " no início da "string" , adicionei ","(virgula) entre o JSON de Envio  e o JSON de "Retorno" e um " ] " no final, assim o JSON passa a ser valido.

Pode utilizar esse site: https://jsonlint.com/ utilizando os 2 códigos citados que você devem entender melhor o que estou tentando dizer.

Desde já agradeço a ajuda de todos envolvidos.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Bom dia Eder,

Como havia dito inicialmente, foi realizado um ajuste apenas do lado do ACBrMonitor removendo as tags que não fazem parte da classe que gera o Json... Para estas alterações sugeridas envolve mudanças na classe base que gera as respostas para todos os métodos, inclusive da Lib. Então vamos precisar avaliar e testar com calma. 

Desta forma que você está Enviando (Assíncrono) são executados dois métodos distintos Internamente, um de Envio e outro de Consulta dessa chave. Por isso são duas respostas. Isso teria que ser alterado para padronizar em uma única resposta...

Para solucionar para você neste caso, bastaria utilizar o Envio passando como parâmetro o EnvioSincrono, já que se trata de NFCe... Assim vai obter o XML de autorização em apenas um Json.  https://acbr.sourceforge.io/ACBrMonitor/NFECriarEnviarNFe.html

 

Quanto ao path onde o arquivo XML está gravado, pode utilizar o método https://acbr.sourceforge.io/ACBrMonitor/NFEGetPathNFe.html

Essa tag "Arquivo" é utilizada no envio Assíncrono justamente pelo fato de poder existir N notas (Envio em Lote), por isso é realizado uma validação entre a NFe e o respectivo retorno par obter o path, no caso de envio Síncrono, pode ser facilmente localizado utilizando o método NFe.GetPathNFe.

  • Curtir 2
Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Moderadores

Bom dia, favor atualizar a versão para realizar novos testes. Foi reestruturada a classe resposta de forma a gerar o JSON em um objeto principal: "Resposta", não é exatamente como sugeriu acima utilizando Array. Mas creio que não terá mais problemas na leitura do mesmo.

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Moderadores
1 hora atrás, Eder J. Silva disse:

José bom dia!

Já está disponível para download essa nova versão ?

Sim . olha na sessão downloads daqui do forum

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.