Jump to content

Utilizar Webservices da AT


Recommended Posts

Em 14/12/2020 às 18:39, Psousa disse:

Obrigado pela resposta Jmsimoes.

Mas o erro persiste mesmo repetindo as declarações de namespaces ... 

Request:


<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Header>
    <wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:at="http://at.pt/wsp/auth" S:actor="http://at.pt/actor/SPA" at:Version="2">
      <wss:UsernameToken>
        <wss:Username>555555555</wss:Username>
        <wss:Password>QfCePvaW2YJuW3d523IgcA==</wss:Password>
        <wss:Nonce>CCf62VxmmaIeQJT2mPh6zlo0fMwIiyGTANp1b9ZTCtM2wnGz4iVglsaB5j0XmKyCpWPIxrpAotX12Y1QF2mjleWoBvxDL6eojygPM6yRZLuUuhg+YSKC1ymmHheUwUm7pJpfEoCP6dlVvrtpjynzufxIwqmj6hBe/8MdL1Q8nrjSPT+EZPV7fUEpQYoBtK23XyrVvL2GwnlEPxIE1pPDYd0A1k5WfAQym6CRHqPMgL+/kD2meS3incs37z8y0rO2vD3zNPDqXGaWKwZasE2WV8GVVAAPLdHyppz0fIJNLucWRy+YvPb1bDpXRtDvBVV9aD/o0JdGhnrzkPG0KJDnSw==</wss:Nonce>
        <wss:Created>uNgtgq94rB2dDh06MmeammPfxqFXX871ZBTfeq2LgMM=</wss:Created>
      </wss:UsernameToken>
    </wss:Security>
    <wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:at="http://at.pt/wsp/auth" S:actor="http://at.pt/actor/TOC" at:Version="2">
      <wss:UsernameToken>
        <wss:Username>111111111</wss:Username>
        <wss:Password>/41oLgZPCG5hqrHoLJTOjA==</wss:Password>
        <wss:Nonce>JFADd5UXURfCWBzDXDX2OHbzbpTVhsBqFxMndQWb9RR8eDZ70KBYGeop8e+hs+FHzwnGbwsQ/hCeMjLpLF8gDq5B8e6Xl55PhW1t2u6NaTZZGTl2lqYEyrcy7kxe2/XQSeOj37LNgkzSSMIY7IeYwQtQQ9QgZV6ygoh0LEW0qLiVTZhDZxuYK15NpsOdJ5ZEjPxrJ/i0NY49vlF9b+t5Kcb81FOVI/uy+0tXpa8BEOumbrxI3pgilRSvkbl/TuRxURE7pg/IkO/bcZ9NsCLHUajRj+OPoCHWh5I9z/Y9WJ51exJ2iq/UGqb2IJlrOcDisse5zVLz2yAUESW9e7ecxA==</wss:Nonce>
        <wss:Created>QlZts0xkBrrWBYCDZ11Ah5+XK2ftYwYKSO76G/B57eg=</wss:Created>
      </wss:UsernameToken>
    </wss:Security>
  </S:Header>
  <S:Body>
    <ns2:validarDeclaracaoPeriodicaIVARequest xmlns:ns2="https://servicos.portaldasfinancas.gov.pt/dpivaws/DeclaracaoPeriodicaIVAWebService">
      <versaoDeclaracao>2016</versaoDeclaracao>
      <declaracao>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</declaracao>
    </ns2:validarDeclaracaoPeriodicaIVARequest>
  </S:Body>
</S:Envelope>

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Resposta:


<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

<SOAP-ENV:Header/>

<SOAP-ENV:Body>

<ns3:validarDeclaracaoPeriodicaIVAResponse xmlns:ns3="https://servicos.portaldasfinancas.gov.pt/dpivaws/DeclaracaoPeriodicaIVAWebService">

<codigo>51</codigo>

<mensagem>Actor não é único no Header.</mensagem>

</ns3:validarDeclaracaoPeriodicaIVAResponse>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

Encontrei o problema. Tenho ativo no envio um traceListener que acrescentava uma tag no header. A validação da AT considera como mais um "actor"...

<s:Header>
<Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
<UsernameToken>
<Username>
<!-- Removed-->
</Username>
<Password>
<!-- Removed-->
</Password>
<Nonce>
<!-- Removed-->
</Nonce>
<Created>RPzt9pt8md3+EP2WpcBxvBFoalOT1YU4OJAQKmP0nCA=</Created>
</UsernameToken>
</Security>
<ActivityId CorrelationId="6a40bdf0-2468-4875-85ee-3b8e8cb2aea0" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">00000000-0000-0000-0000-000000000000</ActivityId>
</s:Header>


 

Edited by nunopicado
Syntax Highlight
  • Vote 2
Link to post
Share on other sites
  • Replies 9k
  • Created
  • Last Reply

Top Posters In This Topic

  • nunopicado

    942

  • marcolopes

    408

  • brunotoira

    405

  • americob

    165

Top Posters In This Topic

Popular Posts

Eles estão-se nas tintas para nós e para o que nós achamos lamentável... Quero que eles se f... Cosam! Amanhã vou de férias, coisa que não faço há anos... São só 4 dias, mas acho que o escravo mere

Uma LUZINHA? Queres dizer... NÓS... os beta-testers e escravos do sistema! Foram muitas dezenas de emails de recomendações enviados, problemas reportados, sugestões... Não era dificil de prever que a

Sim, temos que esperar. Já da última vez foi à última da hora!  Submeti um pedido no e-Balcão e a resposta foi esta: Bom dia Uma vez que se aproxima a data de expiração do certificado "Cha

albertosilva

Á semelhança de tantos de vocês que usam C#, temos a comunicação dos documentos de transporte dentro de um try/catch, do género

try 
{
  	...
}
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;
	}
}

A semana passada começámos a ter um erro, e percebemos que sendo um "ProtocolError" o objeto ex.Response está a null e como tal ao tentar abrir um StreamReader sobre o mesmo como no exemplo, rebentava com uma NullReferenceException. Em muitos anos foi a primeira vez que aconteceu, pelo menos de forma consistente que chamasse a nossa atenção.

As circunstâncias em que o erro ocorre é em comunicação a partir de um modelo específico de equipamento Android (aplicação Xamarin) quando é utilizada a ligação de dados móveis do próprio equipamento. Partindo de dois equipamentos idênticos A e B, em que nenhum consegue comunicar docuemntos de transporte utilizando a sua própria ligação de dados móveis, se o equipamento A se ligar através do equipamento B a servir de hotspot ou de uma rede wifi, a comunicação é feita sem problemas. Se o mesmo equipamento A partilhar a sua ligação de dados via hotspot com o equipamento B, este já passa a conseguir comunicar com o wifi do primeiro.

Das V/ experiências, em algum momento tiveram alguma situação em que o ProtocolError não devolvesse resposta, para tentar perceber o que pode estar a provocar esse erro quando o equipamento usa a própria ligação de dados?

Link to post
Share on other sites
Nuno Bagulho Marques

Bom dia a todos.

Na comunicação dos documentos à AT, como preenchem o campo 1.18.2 Product Description? Eu preenchi com o código do produto, que me parece o mais lógico.

Link to post
Share on other sites
americob
2 horas atrás, Nuno Bagulho Marques disse:

Bom dia a todos.

Na comunicação dos documentos à AT, como preenchem o campo 1.18.2 Product Description? Eu preenchi com o código do produto, que me parece o mais lógico.

Eu estou a usar a decrição da linha que está no documento, ou seja, ignoro a decrição que está na tabela de produtos, mesmo que a descrição do campo possa levantar duvidas de interpretação: "Descrição da linha da fatura, ligada à tabela de produtos e serviços."

A não ser assim, a impressão do Documento de Transporte pelo programa poderia ser diferente da impressão obtida no Portal eFatura, o que não faria qualquer qualquer sentido.

  • Vote 2
Link to post
Share on other sites
Nuno Bagulho Marques

bom dia @americob

vou adotar essa prática, uma vez que foi precisamente o que conta no EFatura que levantou esta questão.

Obrigado

Link to post
Share on other sites
Hugo Esteves

Boa tarde caros!

O Covid também está a causar chatices nas submissões IVA... 

Como o IVA foi prorrogado, em dezembro, todas as submissões que eram entregues no período de prorrogação devolviam o seguinte erro: "Indicou declaração dentro do prazo mas a declaração está fora do prazo ou vice-versa". Ou seja o WS erradamente achava que a declaração estava fora do prazo.

O mais incrível foi que ao serem submetidas pelo site normal eram aceites. Dá a sensação que a AT se esqueceu de actualizar as políticas  nos WS da mesma forma que fizeram com o Portal AT.

(Nem sei como é possível existirem "políticas internas" diferentes para o Portal e os WS.)

Esta situação aconteceu a mais alguém? 

Abraços!

  • Vote 1
Link to post
Share on other sites
americob
Em 11/01/2021 às 15:41, Hugo Esteves disse:

Boa tarde caros!

O Covid também está a causar chatices nas submissões IVA... 

Como o IVA foi prorrogado, em dezembro, todas as submissões que eram entregues no período de prorrogação devolviam o seguinte erro: "Indicou declaração dentro do prazo mas a declaração está fora do prazo ou vice-versa". Ou seja o WS erradamente achava que a declaração estava fora do prazo.

O mais incrível foi que ao serem submetidas pelo site normal eram aceites. Dá a sensação que a AT se esqueceu de actualizar as políticas  nos WS da mesma forma que fizeram com o Portal AT.

(Nem sei como é possível existirem "políticas internas" diferentes para o Portal e os WS.)

Esta situação aconteceu a mais alguém? 

Abraços!

Sim, também temos clientes a queixarem-se. Não faz sentido nenhum!

Também ainda não conseguimos pedir Comprovativos nem Documentos de Pagamento. Como nos testes em https://faturas.portaldasfinancas.gov.pt/testarLigacaoWebService.action ainda não existem esses serviços, diria que ainda não estão disponíveis. Alguem os consegue usar?

Link to post
Share on other sites
Cláudio Moreira

Bom dia Caros,

Estou a implementar, em c# o webservice da AT, para comunicar o Importo Selo https://servicos.portaldasfinancas.gov.pt:721/DmisServiceImplService, já ultrapassei (penso eu) todos os problemas de autenticação, mas agora estou-me a deparar com o seguinte problema:

Ao invocar o método DmisSubmission, um dos campos é o AlreadyPaidTaxAmount, um campo decimal que está na assinatura do método, ilustrando:

DmisSubmission(short TaxableEntityTaxOfficeCode, 
int TaxableEntityTaxID, 
string TaxPeriod, 
bool SubstitutionDeclaration, 
int TaxRepresentativeTaxID, 
int CertifiedAccountantTaxID, 
int DeclarationLinesQuantity, 
int DeclarationLinesBlocksQuantity, 
DeclarationLinesBlockType DeclarationLinesBlock, 
decimal AlreadyPaidTaxAmount, 
out DmisRegistrationDataType DmisRegistrationData)

A questão é que a AT me obriga a enviar null no campo AlreadyPaidTaxAmount se o campo SubstitutionDeclaration="false".

Passando qualquer coisa neste campo, quando o SubstitutionDeclaration="false", obtenho o seguinte erro:

System.ServiceModel.FaultException: simple-type 1: element {http://servicos.portaldasfinancas.gov.pt/dmis/dmisService}AlreadyPaidTaxAmount value '0.0' is not a valid instance of type {http://servicos.portaldasfinancas.gov.pt/dmis/dmisService}PositiveMonetaryType

 

Alguém já teve este problema e o consegui ultrapassar? 

Link to post
Share on other sites
albertosilva

Caros colegas,

Falaram-me hoje que há alguns software que conseguem importar do e-fatura os documentos (faturas) comunicados por empresas terceiras, como fornecedores, como este.

Procurei no site da AT e não encontro essa funcionalidade documentada em termos de webservice, o que me leva a questionar se usarão "web scrapping".

Alguém sabe mais alguma coisa sobre o assunto?

Link to post
Share on other sites
americob
15 minutos atrás, albertosilva disse:

Caros colegas,

Falaram-me hoje que há alguns software que conseguem importar do e-fatura os documentos (faturas) comunicados por empresas terceiras, como fornecedores, como este.

Procurei no site da AT e não encontro essa funcionalidade documentada em termos de webservice, o que me leva a questionar se usarão "web scrapping".

Alguém sabe mais alguma coisa sobre o assunto?

Sim, a unica forma conhecida de obter a informação é mesmo essa. Isso tem sido discutido por aqui diversas vezes.

Diria que não é muito legal, mas a própria AT ao disponibilizar o download de um ficheiro "json" com o conteúdo básico dos documentos fomenta a utilização.

Já agora, se o "json" tivesse a informação toda, era escusado, de seguida, os programas irem ler a página de cada fatura para obter a restante informação de cada uma, não pesando tanto na utilização do sistema.

Claro que o ideal era que a AT colocasse à disposição um WebService que devolvesse os elementos solicitados.

Link to post
Share on other sites
albertosilva
10 minutos atrás, americob disse:

Sim, a unica forma conhecida de obter a informação é mesmo essa. Isso tem sido discutido por aqui diversas vezes.

Diria que não é muito legal, mas a própria AT ao disponibilizar o download de um ficheiro "json" com o conteúdo básico dos documentos fomenta a utilização.

Já agora, se o "json" tivesse a informação toda, era escusado, de seguida, os programas irem ler a página de cada fatura para obter a restante informação de cada uma, não pesando tanto na utilização do sistema.

Claro que o ideal era que a AT colocasse à disposição um WebService que devolvesse os elementos solicitados.

Obrigado Américo, entretanto encontrei esta discussão aqui no P@P para quem tiver interesse no tema. E concordo com as tuas observações, deveria ser algo documentado e não pela porta do cavalo :)

Link to post
Share on other sites
Vitor Pereira
Em 26/01/2021 às 12:29, albertosilva disse:

Caros colegas,

Falaram-me hoje que há alguns software que conseguem importar do e-fatura os documentos (faturas) comunicados por empresas terceiras, como fornecedores, como este.

Procurei no site da AT e não encontro essa funcionalidade documentada em termos de webservice, o que me leva a questionar se usarão "web scrapping".

Alguém sabe mais alguma coisa sobre o assunto?

Boa tarde

Todos os Softwares de Contabilidade que tenho encontrado até hoje já fazem isso ( Sage, Phc, Primavera, Eticadata, Enigma, etc, etc ).

Neste momento os TOC'S importam automaticamente todas as Compras e depois só fazem conferencia com os documentos que lhe chegam ( podem existir compras com o NIF da empresa mas que por qualquer razão não interesse fazer lançamento/importação ).

Não sei é qual a ferramenta/webservice/etc que a AT disponibiliza para esta importação automática.

Link to post
Share on other sites
Carlos Pais
17 horas atrás, Vitor Pereira disse:

 

Boa tarde

Todos os Softwares de Contabilidade que tenho encontrado até hoje já fazem isso ( Sage, Phc, Primavera, Eticadata, Enigma, etc, etc ).

Neste momento os TOC'S importam automaticamente todas as Compras e depois só fazem conferencia com os documentos que lhe chegam ( podem existir compras com o NIF da empresa mas que por qualquer razão não interesse fazer lançamento/importação ).

Não sei é qual a ferramenta/webservice/etc que a AT disponibiliza para esta importação automática.

 

 

é simples a importação, podes fazer assim

https://faturas.portaldasfinancas.gov.pt/json/obterDocumentosAdquirente.action?dataInicioFilter=DATAINICIO&dataFimFilter=DATAFIM&ambitoAquisicaoFilter=TODOS         

( ATENÇÃO: esta linha de comando, só funciona com o login feito )

e vais obter um ficheiro de texto, tipo .json

a partir de ai, há vários dll, que lêem este ficheiro ... vê este tópico  https://www.portugal-a-programar.pt/forums/topic/74862-importação-automática-dos-documentos-existentes-no-portal-do-e-fatura/page/2/?tab=comments#comment-620907

Edited by Carlos Pais
  •  😵😴🥵🥴  No Desenvolvimento as Possibilidades são Infinitas  😵😴🥵🥴 , podemos é ficar doidos ...
Link to post
Share on other sites
americob
Em 27/01/2021 às 10:26, Carlos Pais disse:

é simples a importação, podes fazer assim

https://faturas.portaldasfinancas.gov.pt/json/obterDocumentosAdquirente.action?dataInicioFilter=DATAINICIO&dataFimFilter=DATAFIM&ambitoAquisicaoFilter=TODOS         

( ATENÇÃO: esta linha de comando, só funciona com o login feito )

e vais obter um ficheiro de texto, tipo .json

a partir de ai, há vários dll, que lêem este ficheiro ... vê este tópico  https://www.portugal-a-programar.pt/forums/topic/74862-importação-automática-dos-documentos-existentes-no-portal-do-e-fatura/page/2/?tab=comments#comment-620907

Exacto.

Só é pena esse .json não trazer a informação toda, falta a repartição dos valores por taxa de iva. Por isso é que os programas acabam por ter de ler o html de cada um dos documentos para conseguir retirar dele essa repartição.

Claro que, se uma empresa obtiver 300 documentos num json, de seguida o programa irá aceder ao Portal 300 vezes para retirar a restante informação. Depois o pessoal queixa-se que o Portal está lento ou indisponível.

Link to post
Share on other sites
Carlos Pais
1 hora atrás, americob disse:

Exacto.

Só é pena esse .json não trazer a informação toda, falta a repartição dos valores por taxa de iva. Por isso é que os programas acabam por ter de ler o html de cada um dos documentos para conseguir retirar dele essa repartição.

Claro que, se uma empresa obtiver 300 documentos num json, de seguida o programa irá aceder ao Portal 300 vezes para retirar a restante informação. Depois o pessoal queixa-se que o Portal está lento ou indisponível.

isso é verdade, mas enquanto o computador está a ir ler e carregar os documentos, faço outra coisa ... em media demora uns 5 seg. cada ... mas eu tenho 500mb de velocidade de internet

  •  😵😴🥵🥴  No Desenvolvimento as Possibilidades são Infinitas  😵😴🥵🥴 , podemos é ficar doidos ...
Link to post
Share on other sites
Em 20/01/2021 às 10:23, americob disse:

Sim, também temos clientes a queixarem-se. Não faz sentido nenhum!

Também ainda não conseguimos pedir Comprovativos nem Documentos de Pagamento. Como nos testes em https://faturas.portaldasfinancas.gov.pt/testarLigacaoWebService.action ainda não existem esses serviços, diria que ainda não estão disponíveis. Alguem os consegue usar?

Estou a desenvolver em C# e no ambiente de testes consigo fazê-lo. Ainda não testei em produção.

Se quiseres posso colocar aqui o xml do pedido.

O que não estou a conseguir fazer é gerar o digest da password. Já tentei de 1001 maneiras, mas dá sempre erro. 

Edited by alfcup
Link to post
Share on other sites
Em 29/01/2021 às 01:50, alfcup disse:

Estou a desenvolver em C# e no ambiente de testes consigo fazê-lo. Ainda não testei em produção.

Se quiseres posso colocar aqui o xml do pedido.

O que não estou a conseguir fazer é gerar o digest da password. Já tentei de 1001 maneiras, mas dá sempre erro. 

private void WriteHeader(XmlDictionaryWriter writer)
{
  dynamic random = new Random();
  byte[] nounce = new byte[16];
  random.NextBytes(nounce);

  // RijndaelManaged
  SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
  rijn.Key = nounce;
  rijn.IV = nounce;
  rijn.Mode = CipherMode.ECB;
  dynamic encryptor = rijn.CreateEncryptor(rijn.Key, rijn.IV);

  dynamic encryptedPassword = EncryptString(Password, encryptor);

  // date in ISO 8601 compatible format
  dynamic createdDate = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
  dynamic encryptedCreatedDate = EncryptString(createdDate, encryptor);

  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  string AtPublicKey = Certificate.PublicKey.Key.ToXmlString(false);
  rsa.FromXmlString(AtPublicKey);
  string encryptedNounce = Convert.ToBase64String(rsa.Encrypt(nounce, false));

  writer.WriteRaw(string.Format("<UsernameToken><Username>{0}</Username><Nonce>{1}</Nonce><Password>{2}</Password><Created>{3}</Created></UsernameToken>", UserName, encryptedNounce, encryptedPassword, encryptedCreatedDate));
}

é assim que estou a fazer

  • Vote 1
Link to post
Share on other sites
Em 29/01/2021 às 16:44, kalin disse:

private void WriteHeader(XmlDictionaryWriter writer)
{
  dynamic random = new Random();
  byte[] nounce = new byte[16];
  random.NextBytes(nounce);

  // RijndaelManaged
  SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
  rijn.Key = nounce;
  rijn.IV = nounce;
  rijn.Mode = CipherMode.ECB;
  dynamic encryptor = rijn.CreateEncryptor(rijn.Key, rijn.IV);

  dynamic encryptedPassword = EncryptString(Password, encryptor);

  // date in ISO 8601 compatible format
  dynamic createdDate = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
  dynamic encryptedCreatedDate = EncryptString(createdDate, encryptor);

  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  string AtPublicKey = Certificate.PublicKey.Key.ToXmlString(false);
  rsa.FromXmlString(AtPublicKey);
  string encryptedNounce = Convert.ToBase64String(rsa.Encrypt(nounce, false));

  writer.WriteRaw(string.Format("<UsernameToken><Username>{0}</Username><Nonce>{1}</Nonce><Password>{2}</Password><Created>{3}</Created></UsernameToken>", UserName, encryptedNounce, encryptedPassword, encryptedCreatedDate));
}

é assim que estou a fazer

Boas Kalin,

Esse método do header funciona, mas há outro método sem a data encriptada e com um digest da password. Eu não estou é a conseguir fazer o digest.

Tenho quase a certeza que o problema está na geração do SHA-1. Já tentei várias formas para o gerar, mas retorna sempre a informação que o digest está errado.

Já testei até com sbyte para ser equivalente ao digest do Java, mas mesmo assim não funcionou.

Link to post
Share on other sites
21 horas atrás, alfcup disse:

Boas Kalin,

Esse método do header funciona, mas há outro método sem a data encriptada e com um digest da password. Eu não estou é a conseguir fazer o digest.

Tenho quase a certeza que o problema está na geração do SHA-1. Já tentei várias formas para o gerar, mas retorna sempre a informação que o digest está errado.

Já testei até com sbyte para ser equivalente ao digest do Java, mas mesmo assim não funcionou.

Outro método?

Link to post
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.