Jump to content

Utilizar Webservices da AT


cjulio
Go to solution Solved by thoga31,

Recommended Posts

Porque é que há tanta discussão à volta de qual a mensagem retornada pelos serviços AT no que toca às guias? 

A única coisa que precisa de ser validada é o campo ReturnCode, onde caso o valor seja 0 significa que a guia foi comunicada com sucesso.

preg_match('/<ReturnCode>(.*?)<\/ReturnCode>/s', $response, $statusCode);

O resto não interessa. Só quando deixar de devolver o valor 0, é que tem de se preocupar. 😅

  • Vote 1
Link to comment
Share on other sites

On 1/23/2023 at 7:45 PM, bioshock said:

Porque é que há tanta discussão à volta de qual a mensagem retornada pelos serviços AT no que toca às guias? 

A única coisa que precisa de ser validada é o campo ReturnCode, onde caso o valor seja 0 significa que a guia foi comunicada com sucesso.

preg_match('/<ReturnCode>(.*?)<\/ReturnCode>/s', $response, $statusCode);

O resto não interessa. Só quando deixar de devolver o valor 0, é que tem de se preocupar. 😅

Já disse isso diversas vezes...

De qualquer forma, se a AT está a colocar uma mensagem de SUCESSO com informação "relevante", a mesma deverá? ser apresentada ao utilizador... Resta saber se a mensagem actual não irá causar confusão... uma vez que, por exemplo, alerta para um ATCUD inválido, quando o mesmo é correctamente comunicado.

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Link to comment
Share on other sites

Estou a desenvolver a comunicação de séries de Auto Faturação mas surgiu-me um problema que não sei como resolver.

Não consigo comunicar séries em modo de teste. Devolve-me sempre a mensagem "Não foi possível registar a Série. Por favor corrija os erros nos campos assinalados. Não existe acordo prévio de autofaturação ativo associado ao Número de Identificação Fiscal introduzido.".

Acontece que o NIF está registado com acordo mas em ambiente "real". Em ambiente de teste, aparentemente não. Como consigo registar um acordo em ambiente de testes para poder testar a comunicação?

Link to comment
Share on other sites

Em 23/01/2023 às 19:45, bioshock disse:

Porque é que há tanta discussão à volta de qual a mensagem retornada pelos serviços AT no que toca às guias? 

A única coisa que precisa de ser validada é o campo ReturnCode, onde caso o valor seja 0 significa que a guia foi comunicada com sucesso.

preg_match('/<ReturnCode>(.*?)<\/ReturnCode>/s', $response, $statusCode);

O resto não interessa. Só quando deixar de devolver o valor 0, é que tem de se preocupar. 😅

Olá, eu comunico sem essa mensagem, quer em Produção, quer em Testes.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:doc="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/"><soapenv:Header><wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext"><wss:UsernameToken><wss:Username>501854371/2</wss:Username><wss:Password>vKAe6FPfRLVTzfgmpUBr6w==</wss:Password><wss:Nonce>KLQnHomwJ9xbFsiQbq0CvMgnu/MpIQCVGGPxgaVvHg/809YkMSGoCVsF+SBf9T0i4UYjx5erq7i++UM5k+BkgdPw9b3qEkWofIxp/YGn2ytdAxTEH35jDXSEZKqKb0xOzePbAgrF98P6YXru80Q7CM6Ix5hLelbTgacXm/qpN9o/vaTPRrzAw8HhTEf/Wr03wuGJY8yXDf9cMujrcmIVZEw1V3F4AArZPRt41hAe5WRh8qoSxy4uUOZvdVtP3ArJJG3n2FQKknJP/RTLqyW3vmczwscqHOideUH/KIB6cBNDP//eTw8LPAj+j3b3uU+bmSW6jO9sVVlYGJhlzfTdzg==</wss:Nonce><wss:Created>c8KGulA/dYRGXhvrUmUSQShumbsTuNbyvxE8+nAsSsY=</wss:Created></wss:UsernameToken></wss:Security></soapenv:Header><soapenv:Body><doc:envioDocumentoTransporteRequestElem><TaxRegistrationNumber>501854371</TaxRegistrationNumber><CompanyName>F3M SA</CompanyName><CompanyAddress><Addressdetail>Rua de Linhares</Addressdetail><City>Braga</City><PostalCode>4715-435</PostalCode><Country>PT</Country></CompanyAddress><DocumentNumber>GR 2019/8</DocumentNumber><ATCUD>AAJFFZ3X2S-8</ATCUD><MovementStatus>N</MovementStatus><MovementDate>2023-01-24</MovementDate><MovementType>GR</MovementType><CustomerTaxID>212367366</CustomerTaxID><CustomerName>Carlos</CustomerName><AddressTo><Addressdetail>qweq</Addressdetail><City>Matosinhos</City><PostalCode>4455-516</PostalCode><Country>PT</Country></AddressTo><AddressFrom><Addressdetail>aweq</Addressdetail><City>Leiria</City><PostalCode>2410-026</PostalCode><Country>PT</Country></AddressFrom><MovementStartTime>2023-01-24T13:02:00</MovementStartTime><Line><ProductDescription>Etiqueta de Tamanhos</ProductDescription><Quantity>1</Quantity><UnitOfMeasure>Unidade</UnitOfMeasure><UnitPrice>1</UnitPrice></Line></doc:envioDocumentoTransporteRequestElem></soapenv:Body></soapenv:Envelope>

xml resposta:

<?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><WorkContext xmlns="http://oracle.com/weblogic/soap/workarea/">rO0ABXdQABN3ZWJsb2dpYy5hcHAuc2dkdHdzAAAA1gAAACN3ZWJsb2dpYy53b3JrYXJlYS5TdHJpbmdXb3JrQ29udGV4dAAMMS4yMi4xLTQxMjA0AAA=</WorkContext></S:Header><S:Body><ns0:envioDocumentoTransporteResponseElem xmlns:ns0="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/"><ResponseStatus><ReturnCode>0</ReturnCode><ReturnMessage>OK</ReturnMessage></ResponseStatus><DocumentNumber>GR 2019/8</DocumentNumber><ATCUD>AAJFFZ3X2S-8</ATCUD><ATDocCodeID>1100612391</ATDocCodeID></ns0:envioDocumentoTransporteResponseElem></S:Body></S:Envelope>

 

Edited by nunopicado
Syntax Highlight
Link to comment
Share on other sites

Desde que renovamos o certificado de comunicação de guias de transporte nunca mais conseguimos comunicar com a AT, mais alguém com o mesmo problema?

Como o sistema de comunicação era uma versão de .net antiga, tentei criar um novo sistema em C# baseado em muitos dos posts aqui existentes mas estou sempre a obter erro de protocolo... alguma ideia??!?! (não estou neste momento se quer em pensar na validação do conteúdo ou devia? )

private static string Send(string oRequest, string PassPFX)
{
	// DadosTransporte
	//Testes
	//string EnderecoWebService = "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte";
	//Produção
	string EnderecoWebService = "https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte/";
	string SoapAction = "https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/";

	string CaminhoCertificado = @"C:\Saft\Guias\certificado.pfx";
	string SenhaCertificado = PassPFX;
	try
	{
		HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(EnderecoWebService);
		request.Headers.Add("SOAPAction", SoapAction);

		//X509Certificate2 cert = new X509Certificate2(CaminhoCertificado, SenhaCertificado);
		//cert.Import(CaminhoCertificado, SenhaCertificado, X509KeyStorageFlags.DefaultKeySet);
		//X509Certificate2 cert = new X509Certificate2(File.ReadAllBytes(CaminhoCertificado));

		X509Certificate2Collection certCollection = new X509Certificate2Collection();
		certCollection.Import(CaminhoCertificado, SenhaCertificado, X509KeyStorageFlags.DefaultKeySet);
		request.ClientCertificates = certCollection;
						
		//request.ClientCertificates.Add(cert);
		request.Method = "POST";
		request.ContentType = "text/xml; charset=utf-8";
		request.Accept = "text/xml";
		string postData = oRequest;
		byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(postData);
		request.ContentLength = byteArray.Length;

		Stream dataStream = request.GetRequestStream();

		dataStream.Write(byteArray, 0, byteArray.Length);
		dataStream.Close();
		HttpWebResponse response = (HttpWebResponse)request.GetResponse();   // <= O ERRO É OBTIDO AQUI

		dataStream = response.GetResponseStream();

		StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.GetEncoding("windows-1252"));
		string responseFromServer = reader.ReadToEnd();

		reader.Close();
		dataStream.Close();
		response.Close();
		return responseFromServer;
	}
	catch (WebException ex)
	{
		if (ex.Status == WebExceptionStatus.ProtocolError)
		{
			WebResponse resp = ex.Response;
			StreamReader sr = new StreamReader(resp.GetResponseStream());
			return sr.ReadToEnd();
		}
		else
		{
			return ex.Message;
		}
	}
}

 

Edited by nogueiraf
Link to comment
Share on other sites

Em 24/01/2023 às 16:17, nogueiraf disse:

Desde que renovamos o certificado de comunicação de guias de transporte nunca mais conseguimos comunicar com a AT, mais alguém com o mesmo problema?

Como o sistema de comunicação era uma versão de .net antiga, tentei criar um novo sistema em C# baseado em muitos dos posts aqui existentes mas estou sempre a obter erro de protocolo... alguma ideia??!?! (não estou neste momento se quer em pensar na validação do conteúdo ou devia? )

private static string Send(string oRequest, string PassPFX)
{
	// DadosTransporte
	//Testes
	//string EnderecoWebService = "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte";
	//Produção
	string EnderecoWebService = "https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte/";
	string SoapAction = "https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/";

	string CaminhoCertificado = @"C:\Saft\Guias\certificado.pfx";
	string SenhaCertificado = PassPFX;
	try
	{
		HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(EnderecoWebService);
		request.Headers.Add("SOAPAction", SoapAction);

		//X509Certificate2 cert = new X509Certificate2(CaminhoCertificado, SenhaCertificado);
		//cert.Import(CaminhoCertificado, SenhaCertificado, X509KeyStorageFlags.DefaultKeySet);
		//X509Certificate2 cert = new X509Certificate2(File.ReadAllBytes(CaminhoCertificado));

		X509Certificate2Collection certCollection = new X509Certificate2Collection();
		certCollection.Import(CaminhoCertificado, SenhaCertificado, X509KeyStorageFlags.DefaultKeySet);
		request.ClientCertificates = certCollection;
						
		//request.ClientCertificates.Add(cert);
		request.Method = "POST";
		request.ContentType = "text/xml; charset=utf-8";
		request.Accept = "text/xml";
		string postData = oRequest;
		byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(postData);
		request.ContentLength = byteArray.Length;

		Stream dataStream = request.GetRequestStream();

		dataStream.Write(byteArray, 0, byteArray.Length);
		dataStream.Close();
		HttpWebResponse response = (HttpWebResponse)request.GetResponse();   // <= O ERRO É OBTIDO AQUI

		dataStream = response.GetResponseStream();

		StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.GetEncoding("windows-1252"));
		string responseFromServer = reader.ReadToEnd();

		reader.Close();
		dataStream.Close();
		response.Close();
		return responseFromServer;
	}
	catch (WebException ex)
	{
		if (ex.Status == WebExceptionStatus.ProtocolError)
		{
			WebResponse resp = ex.Response;
			StreamReader sr = new StreamReader(resp.GetResponseStream());
			return sr.ReadToEnd();
		}
		else
		{
			return ex.Message;
		}
	}
}

 

https://easyupload.io/hhsr19

Tens aí um projeto de testes de comunicação das séries em C#. A comunicação das guias é semelhante, por isso deve dar para perceber onde está o erro.

O certificado de testes da AT usa o certCollection mas o que eu gero com o OpenSSL não necessita, o mecanismo de certificado simples (comentado) deveria funcionar.

Atenção à versão do OpenSLL usado, não pode ser a 3.0, tem de ser uma 1.1.[qq coisa]

 

Link to comment
Share on other sites

Em 24/01/2023 às 12:06, desconfiado disse:

Estou a desenvolver a comunicação de séries de Auto Faturação mas surgiu-me um problema que não sei como resolver.

Não consigo comunicar séries em modo de teste. Devolve-me sempre a mensagem "Não foi possível registar a Série. Por favor corrija os erros nos campos assinalados. Não existe acordo prévio de autofaturação ativo associado ao Número de Identificação Fiscal introduzido.".

Acontece que o NIF está registado com acordo mas em ambiente "real". Em ambiente de teste, aparentemente não.

Como consigo registar um acordo em ambiente de testes para poder testar a comunicação?

Alguém me consegue ajudar nesta questão?

Link to comment
Share on other sites

Alguém me pode explicar o mecanismo da auto-facturação?

--- o cliente emite a factura e comunica o documento no seu SAFT.

E o que faz o fornecedor? Recebe a factura e comunica-a também no seu SAFT?

O fornecedor tem de comunicar o acordo de auto-facturação? Como?

É a primeira situção que me surge e tenho agora de a contemplar.

Obrigado pela ajuda.

 

Link to comment
Share on other sites

Em 25/01/2023 às 17:28, xanisca disse:

Alguém me pode explicar o mecanismo da auto-facturação?

--- o cliente emite a factura e comunica o documento no seu SAFT.

E o que faz o fornecedor? Recebe a factura e comunica-a também no seu SAFT?

O fornecedor tem de comunicar o acordo de auto-facturação? Como?

É a primeira situção que me surge e tenho agora de a contemplar.

Obrigado pela ajuda.

 

A auto-facturação é mais uma daquelas situações em que ligaram o complicador!


O cliente emite a auto-factura mas esse documento não é enviado no proprio SAF.
Os documentos de auto-facturação devem exportados num ficheiro SAF separado (um ficheiro por fornecedor) com os dados invertidos, como o se o documento tivesse sido feito pelo fornecedor, ou seja:  O cabecalho do SAF leva os dados do fornecedor  e a auto-factura leva os dados do cliente.
De seguida esse ficheiro deve ser enviado ao respectivo fornecedor que depois o comunica à AT.
O acordo pode ser comunicado no portal da AT ou por um WebService disponibilizado à pouco tempo.

Atenção: Se for auto-facturação sem acordo basta uma série para todos os documentos. Se for Auto-facturação com acordo tem que ser criada uma série de documentos por cada fornecedor.

Edited by pjmvc
Link to comment
Share on other sites

Pessoal, alguém com o erro 33 - falha de comunicação com o servidor de autenticação - a comunicar guias nesta bela manhã de inverno?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Em 26/01/2023 às 10:02, Elio_Mota disse:

o portal das finanças esta em baixo???

Sim.
Portal das Finanças, E-Fatura, Webservice...
No meu caso concreto nem por telefone está a dar, diz que o meu código é inválido (ainda que nunca tenha usado, é o que tenho aqui registado, pelo que não sei se mesmo o serviço telefónico não está a passar-se).

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Também estou com problemas. O sistema está down.
 

{
    "data": null,
    "meta": {
        "message": "Client received SOAP Fault from server: Falha comunicacao com Servidor de Autenticacao (500) Please see the server log to find more detail regarding exact cause of the failure.",
        "code": "K_HTTP_CODE_BAD_REQUEST",
        "technicalCode": null,
        "technicalMessage": null
    }
}

 

Edited by nunopicado
Syntax Highlight
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.