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á 1338 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

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

  • Moderadores
Postado

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.

  • Membros Pro
Postado
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.

  • Membros Pro
Postado

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

 

 

 

  • Membros Pro
Postado
3 horas atrás, José M. S. Junior disse:

Favor testar com essa versão: 

 

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.

  • Membros Pro
Postado
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

  • Membros Pro
Postado

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 ?

 

 

 

 

  • Moderadores
Postado

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.

  • 2 semanas depois ...
  • Moderadores
Postado

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.

  • 2 semanas depois ...
  • Membros Pro
Postado
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.

  • Moderadores
Postado

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.

  • Membros Pro
Postado

Jose boa noite!

Ok, sem problemas, eu apenas sugeri análise, sei que não seria algo fácil de resolver.

Mas vou analisar o link enviado, para ver como faço para utilizar o método síncrono.

 

De qualquer forma, agradeço a ajuda de todos.

  • Curtir 1
  • 2 semanas depois ...
  • Moderadores
Postado

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.

×
×
  • 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.