Jump to content
cjulio

Utilizar Webservices da AT

Recommended Posts

Carlos Pais

Boas

Alguem já tem alguma aplicação ( código) para validar as facturas no e-facturas, no seu Âmbito da Actividade

Tenho alguns link's que deviam funcionar , mas não estou a conseguir

https://faturas.portaldasfinancas.gov.pt/resolverPendenciaAdquirente.action?idDocumento=xxxxxxxxx&ambitoActividadeProfPend=0

https://faturas.portaldasfinancas.gov.pt/detalheDocumentoAdquirente.action?idDocumento=xxxxxxx&dataEmissaoDocumento=01-01-2018&ambitoActividadeProfPend=1

Share this post


Link to post
Share on other sites
Carlos Pais

Share this post


Link to post
Share on other sites
grbabus

Boa tarde alguém  sabe se através do FACTEMICLI-<xxx>-cmdClient , pode se enviar Guias de transporte, se sim podem me deixar aqui um exemplo, Obrigado.

 

 

Share this post


Link to post
Share on other sites
americob
4 horas atrás, grbabus disse:

Boa tarde alguém  sabe se através do FACTEMICLI-<xxx>-cmdClient , pode se enviar Guias de transporte, se sim podem me deixar aqui um exemplo, Obrigado.

 

 

Acho que a primeira e a ultima versão que esteve disponível desse FACTEMICLI... foi quando o SAFT ainda estava na versão 1.02_01. Agora já vai na versão 1.04_01, pelo que o que existiu já não deve funcionar.

Na altura, a AT foi questionada (procura lá para trás nesta pagina) e a resposta foi que não se justificava manter essa opção. A desculpa baseou-se em que a generalidade dos programas permitiam a comunicação dos DT's por Webservice, e que, em 99% dos casos, os DT's são feitos para serem utilizados na hora e por isso fazia pouco sentido o envio de conjuntos de DT's por ficheiro que só depois de processado devolvia os códigos AT.

Na minha opinião, só não há mais programas a comunicar Faturas por Webservice porque ainda não está claro na Lei que todos os programas certificados o possam fazer. Uma leitura estrita da Lei dá a entender que só as Faturas Eletrónicas (cumprindo todos os requisitos de assinatura, integridade, etc.) podem ser comunicadas por esta via. As restantes Faturas continuam a ter de ser comunicadas por SAFT. Embora haja muitos programas no mercado a comunicar Faturas por Webservice sem que estas sejam Faturas Eletrónicas, programas a assinar as Faturas eletrónicas com assinaturas que nem sequer são da empresa emissora, etc..

A lei das Faturas Eletrónicas precisa de clarificação urgentemente. Aliás, pelo que tem saído nos jornais, estas mudanças devem estar para breve, com o QR code e a desmaterialização dos documentos.

 

  • Vote 1

Share this post


Link to post
Share on other sites
grbabus
31 minutos atrás, americob disse:

Acho que a primeira e a ultima versão que esteve disponível desse FACTEMICLI... foi quando o SAFT ainda estava na versão 1.02_01. Agora já vai na versão 1.04_01, pelo que o que existiu já não deve funcionar.

Na altura, a AT foi questionada (procura lá para trás nesta pagina) e a resposta foi que não se justificava manter essa opção. A desculpa baseou-se em que a generalidade dos programas permitiam a comunicação dos DT's por Webservice, e que, em 99% dos casos, os DT's são feitos para serem utilizados na hora e por isso fazia pouco sentido o envio de conjuntos de DT's por ficheiro que só depois de processado devolvia os códigos AT.

Na minha opinião, só não há mais programas a comunicar Faturas por Webservice porque ainda não está claro na Lei que todos os programas certificados o possam fazer. Uma leitura estrita da Lei dá a entender que só as Faturas Eletrónicas (cumprindo todos os requisitos de assinatura, integridade, etc.) podem ser comunicadas por esta via. As restantes Faturas continuam a ter de ser comunicadas por SAFT. Embora haja muitos programas no mercado a comunicar Faturas por Webservice sem que estas sejam Faturas Eletrónicas, programas a assinar as Faturas eletrónicas com assinaturas que nem sequer são da empresa emissora, etc..

A lei das Faturas Eletrónicas precisa de clarificação urgentemente. Aliás, pelo que tem saído nos jornais, estas mudanças devem estar para breve, com o QR code e a desmaterialização dos documentos.

 

Muito obrigado pela reposta @americob , realmente isso está uma confusão (esparguete puro), a ultima vez que mexi nisso foi em 2012/2013 quando as coisas estão a ser implementadas e eis que me surge esse desafio de novo , bom vou fazer aqui ó código do zero(vai ser uma noite com muitos cafés), obrigado novamente, até já

Share this post


Link to post
Share on other sites
PauloDuarte

Bom dia Pessoal,

Alguem por aqui que perceba de weblogic que esteja disponivel para me esclarecer algumas duvidas?

Estou a desesperar.

Muito Obrigado.

Share this post


Link to post
Share on other sites
hferreira

Boa tarde,

Compreendo que a maioria (para não dizer) de todas as necessidades seja a de submissão de faturas.

No entanto tenho a necessidade de obter os dados das faturas submetidas.

Existe WebService para isto ?

Algum exemplo ou documento (eu não encontrei) ?

Share this post


Link to post
Share on other sites
PauloDuarte

Boa Tarde Pessoal,

Estou a implementar a comunicação de guias AT num novo cliente e estou a usar o pfx que foi gerado para a minha empresa  , e que utilzo noutos clientes.

A questão é que a pessoa que tratava da emissão dos certificados foi se embora, e ainda tou a tentar que alguem responsavel me peça novos certificados.

Tive a rever uns emails e vi que em 2015 , quando pediram os certificados havia um ficheiro chamado PubliChainCA2.p7b . Alguem me sabe dizer para que serve este certificado?

Eu não tenho grande experiencia em comunicações SSL , mas foi me dito que o me deve faltar é o certificado da entidade emissora (um root certificate , ou algo do genero).

Eu para comunicar com a AT preciso de adicionar na demotrust.jks um certificado da entidade emissora? Pode ser este PubliChainCA2.p7b ?

Este certificado é igual para todos ? ou é unico por produtor de Software ? Tou farto de procurar este ficheiro nos servidores da empresa mas nao o consigo encontrar.

Se alguém me conseguisse dar uma ideia ficava eternamente agradecido.

 

Obrigado

PD

 

 

Edited by PauloDuarte

Share this post


Link to post
Share on other sites
Vitor Pereira
3 minutos atrás, PauloDuarte disse:

Boa Tarde Pessoal,

Estou a implementar a comunicação de guias AT num novo cliente e estou a usar o pfx que foi gerado para a minha empresa  , e que utilzo noutos clientes.

A questão é que a pessoa que tratava da emissão dos certificados foi se embora, e ainda tou a tentar que alguem responsavel me peça novos certificados.

Tive a rever uns emails e vi que em 2015 , quando pediram os certificados havia um ficheiro chamado PubliChainCA2.p7b . Alguem me sabe dizer para que serve este certificado?

Eu não tenho grande experiencia em comunicações SSL , mas foi me dito que o me deve faltar é o certificado da entidade emissora (um root certificate , ou algo do genero).

Eu para comunicar com a AT preciso de adicionar na demotrust.jks um certificado da entidade emissora? Pode ser este PubliChainCA2.p7b ?

Se alguém me conseguisse dar uma ideia ficava eternamente agradecido.

 

Obrigado

PD

 

 

 

É necessário pedir a cada 2 anos um novo Certificado a AT.

Abaixo seguem as instruções para se pedir, e o que fazer depois de receber:

 

 

 

Gerar o Certificado SSL:
  openssl req -new -subj "/C=PT/ST=Porto/L=Rua, Cidade/O=Nome/OU=Informatica/CN=999999990/emailAddress=mail@gmail.com" -newkey rsa:2048 -nodes -out 999999990.csr -keyout 999999990.key

Sao gerados os ficheiros 999999990.csr  e  999999990.key

Enviar o certificado (.csr) para a AT para ser assinado
https://faturas.portaldasfinancas.gov.pt//testarLigacaoWebService.action e ir a produtores de software

 


Recebido (da AT) assinado 999999990.cer (anexo e zipado)

Integrar certificado SSL com a chave privada:
   openssl pkcs12 -export -in 999999990.cer -inkey 999999990.key -out 999999990.pfx

Gerado o 999999990.pfx  (  password: 999999990   )


(*** Nota : para executar o "openssl" coloquei sempre os ficheiros na pasta onde o executavel openssl.exe esta instalado, ou seja "C:\OpenSSL-Win32\bin"  ****)

Trocar o 999999990 pelo NIF da Software-House ou Programador

Share this post


Link to post
Share on other sites
PauloDuarte

Victor , 

Obrigado pela resposta .

O meu .pfx ainda está válido e como tal antes de pedir um novo , queria perceber se o problema com o meu novo cliente pode ser a falta do do certificado PubliChainCA2.p7b.

Este publichainca2.p7b tambem e alterado a cada 2 anos? Ou mantem se inalterado ao longo do tempo? O meu problema é que nao estou a conseguir encontrar este publicchanca2.p7b em lado nenhum.

Tive a falar com um cliente que usa o nosso software a ja bastantes anos e disse-me que normalmente, quando o certificado expira , o que a minha empresa lhe envia é apenas o pfx , nao tendo que instalar mais nenhum certificado.

Não sei se este certificado é publicchain é instalado apenas na primeira vez que se faz a instalação dos servidores ou se tem que ser trocado , cada vez que criamos um novo pfx.

Edited by PauloDuarte
erro

Share this post


Link to post
Share on other sites
geral

Viva,

Estamos a implementar uma solução que utiliza um webservice da AT e estamos com algumas dificuldades.

Neste momento o cliente que crio não me deixa adicionar o certificado.

X509Certificate2 certificado = new X509Certificate2(certificate_path, "TESTEwebservice", X509KeyStorageFlags.DefaultKeySet);

client.ClientCredentials.ClientCertificate.Certificate = certificado;

 

Apresenta sempre uma exception indicando que o client é read-only.

Alguma sugestão?

 

Desde já, obrigado.

 

Share this post


Link to post
Share on other sites
chrispaul

Hello
My name is Chris Paul and This is a very nice post, Thanks for Sharing.

______________________________

For Best Assignment help in Australia for 24*7.
 

Share this post


Link to post
Share on other sites
Xendro
Em 09/01/2019 às 21:16, Xendro disse:

Boas.

Obtive o ultimo certificado mas estou com o erro (em testes):

"error: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake"

Para tentar desfazer algumas duvidas fiz download do codigo da applet disponibilizada pela AT (FACTEMIPFCLI-1.7.4-0036-src)  e executei no meu ambiente java, substituindo apenas os certificados e ....

"o erro e o mesmo," no entanto a applet da At no site funciona.

Os novos certificados de teste estão a funcionar con toda a gente?

Alguem ve uma explicação para o codigo "FACTEMIPFCLI" nao funcionar no meu ambiente (será diferente do que a AT esta a executar) ?

Obrigado

A quem desconheca:

Estou a utilizar saPubKey.jks o qual contem 2 aliases, "sapubkey.prod" e "sapubkey.testes".

Como seria obvio achei que em teste  deveria usar o "sapubkey.testes" ( dai o meu problema ).

Resolvi trocar para "sapubkey.prod", e funciona, utilizando o endereço de testes.

.... "coisas da AT" !!!

Share this post


Link to post
Share on other sites
Deckard

Viva Malta,

Estou com um projecto em .net core que requer a implementação do webserive dos pedidos de recuperação do IVA.

Estou com dificuldades em gerar o Digest certo na plataforma.

No passado, numa aplicação windows form utilizei uma dll do java:

 GenerateDigest DigestGt = new GenerateDigest();
 byte[] digestInput1 = GenerateDigest.cypherCredentialBuffer(rijn.Key, DigestGt.buildPasswordDigest(rijn.Key, DataCriacao, PassFinancas));
 var Digest = Convert.ToBase64String(digestInput1);

Contudo, esta ddl não é compatível com o .net core.

Após pesquisar encontrei várias soluções chegando a isto:

//NONCE
byte[] bytesNonce = rijn.Key;
byte[] bytesDataCriacao = Encoding.UTF8.GetBytes(DataCriacao);
byte[] bytesPassFinancas = Encoding.UTF8.GetBytes(PassFinancas);

//concatenação dos bits dos 3 campos 
byte[] digestInput = new byte[bytesNonce.Length + bytesDataCriacao.Length + bytesPassFinancas.Length];
Array.Copy(bytesNonce, 0, digestInput, 0, bytesNonce.Length);
Array.Copy(bytesDataCriacao, 0, digestInput, bytesNonce.Length, bytesDataCriacao.Length);
Array.Copy(bytesPassFinancas, 0, digestInput, bytesNonce.Length + bytesDataCriacao.Length, bytesPassFinancas.Length);


byte[] SHA1Bytes = HashAlgorithm.Create("SHA1").ComputeHash(digestInput);

sbyte[] Digest = Array.ConvertAll(SHA1Bytes, b => unchecked((sbyte)b));
byte[] unsignedByteArray = (byte[])(Array)Digest;

MemoryStream msDigest = new MemoryStream();
CryptoStream csDigest = new CryptoStream(msDigest, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write);
using (StreamWriter swDigest = new StreamWriter(csDigest))
{
swDigest.Write(unsignedByteArray);
}

String DigestPass = Convert.ToBase64String(msDigest.ToArray());

O problema surge na criação do Digest que não é igual à versão desktop. em comparação o digest criado pela biblioteca em java é de 32bytes e esta solução do .net core é de 20bytes.

Sendo que a resposta da AT é:

  <?xml version="1.0" encoding="UTF-8" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header /> 
- <SOAP-ENV:Body>
- <SOAP-ENV:Fault>
  <faultcode /> 
  <faultstring>Rejected: | Codigo: | Erro: | Tentativas Restantes:</faultstring> 
  <detail>credincws.iiivaqua</detail> 
  </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

Têm alguma sugestão para resolver o problema?

 

Confesso que já não sei onde procurar ou fazer.

Obrigado.

Share this post


Link to post
Share on other sites
Ipereira

Boa tarde a todos,

A nossa empresa está em Espanha e estamos a desenvolver o envio webservice à AT. No principio pensavamos que para certificar o software teriamos que fazer o modelo 24, no entanto, o modelo 24 corresponde ao envio do ficheiro SAF-T(PT) que se trata de outro desenvolvimento diferente.

A minha pergunta é, há que fazer também a exportação do ficheiro SAF-T(PT) e por tanto fazer o modelo 24 ou para pedir o certificado para enviar as faturas por webservice apenas há que realizar o pedido de adesão na página do portal das finanças? 

Fiz esta pergunta há mais de um mês no e-balcão mas ainda não me responderam.

Obrigada.

Share this post


Link to post
Share on other sites
Vitor Pereira
Em ‎05‎/‎03‎/‎2019 às 09:40, Ipereira disse:

Boa tarde a todos,

A nossa empresa está em Espanha e estamos a desenvolver o envio webservice à AT. No principio pensavamos que para certificar o software teriamos que fazer o modelo 24, no entanto, o modelo 24 corresponde ao envio do ficheiro SAF-T(PT) que se trata de outro desenvolvimento diferente.

A minha pergunta é, há que fazer também a exportação do ficheiro SAF-T(PT) e por tanto fazer o modelo 24 ou para pedir o certificado para enviar as faturas por webservice apenas há que realizar o pedido de adesão na página do portal das finanças? 

Fiz esta pergunta há mais de um mês no e-balcão mas ainda não me responderam.

Obrigada.

 

Em ‎05‎/‎03‎/‎2019 às 09:40, Ipereira disse:

Boa tarde a todos,

A nossa empresa está em Espanha e estamos a desenvolver o envio webservice à AT. No principio pensavamos que para certificar o software teriamos que fazer o modelo 24, no entanto, o modelo 24 corresponde ao envio do ficheiro SAF-T(PT) que se trata de outro desenvolvimento diferente.

A minha pergunta é, há que fazer também a exportação do ficheiro SAF-T(PT) e por tanto fazer o modelo 24 ou para pedir o certificado para enviar as faturas por webservice apenas há que realizar o pedido de adesão na página do portal das finanças? 

Fiz esta pergunta há mais de um mês no e-balcão mas ainda não me responderam.

Obrigada.

 

Existem 2 opções de enviar os Documentos de Faturação para a AT:

- Via SAFT

- Via Webservice ( não precisam de enviar via SAFT )

Share this post


Link to post
Share on other sites
Vitor Pereira
Em 06/03/2019 às 15:11, Jesus disse:

Boa Tarde Pessoal,

 

Alguém tem um exemplo de um SOAP:Body para a Comunicação dos Documentos de Transporte à AT, no manual só traz o exemplo do header

http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/Documents/Comunicacao_Dados_Documentos_Transporte.pdf

 

Muito obrigado!

 

<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>50550505/1</wss:Username>
        <wss:Password>r1j/IhEl93AxRTbF1ab5ag==</wss:Password>
        <wss:Nonce>emu0R/woZ7dEPJOhj4cx+lBfSn3VKCv9K4rjKp3MMi6Hh3gKFwMnBlrDL3vA5Vm5IV5B1uqLUF2QuzN23YK/OrqGzLibdNDIrVtAwG5lJX0NQIhQ2qRbzpoSqSsrjiF5C67+3f3CTCNoXCzpRIwyIULMFv8nvfJfIld3oB+IcIDxrCmmKKUNkd+KQNNYQ/SOBb77TVNTrbk/q4neleuxQw9raD816pgabnMYtJn9ICcMrJFQEO+TvSS/K4GTPQHZ4yia5nJsu4jK5FtlP73fGcgyYRlSAqlSdr4rMxp38+euIWLMvE+Y6APSHsngEKbsNtdr3e8KOzeY+ygQ0ghP9A==</wss:Nonce>
        <wss:Created>HH8z7QsX9sgDRiGx9itx5U3f8pYKY14IYZJ++b8pmMQ=</wss:Created>
      </wss:UsernameToken>
    </wss:Security>
  </soapenv:Header>
  <soapenv:Body>
    <doc:envioDocumentoTransporteRequestElem>
      <TaxRegistrationNumber>505505505</TaxRegistrationNumber>
      <CompanyName>Nome Empresa</CompanyName>
      <CompanyAddress>
        <Addressdetail>Rua Ribeiro de Castro</Addressdetail>
        <City>PORTO</City>
        <PostalCode>4000-045</PostalCode>
        <Country>PT</Country>
      </CompanyAddress>
      <DocumentNumber>005 C/353</DocumentNumber>
      <MovementStatus>N</MovementStatus>
      <MovementDate>2019-03-06</MovementDate>
      <MovementType>GT</MovementType>
      <CustomerTaxID>506506506</CustomerTaxID>
      <CustomerAddress>
        <Addressdetail>Rua Bernardino Jordao</Addressdetail>
        <City>PORTO</City>
        <PostalCode>4010-480</PostalCode>
        <Country>PT</Country>
      </CustomerAddress>
      <CustomerName>Nome Cliente.</CustomerName>  
      <AddressTo>
        <Addressdetail>Rua Bernardino Jordao</Addressdetail>
        <City>PORTO</City>
        <PostalCode>4010-480</PostalCode>
        <Country>PT</Country>
      </AddressTo>
      <AddressFrom>
        <Addressdetail>Rua Ribeiro de Castro</Addressdetail>
        <City>PORTO</City>
        <PostalCode>4000-045</PostalCode>
        <Country>PT</Country>
      </AddressFrom>
      <MovementStartTime>2019-03-06T14:45:00</MovementStartTime>
      <VehicleID>67-JP-81</VehicleID>
      <Line>
        <ProductDescription>COMPUTADOR</ProductDescription>  
        <Quantity>1.000</Quantity>
        <UnitOfMeasure>UN</UnitOfMeasure>
        <UnitPrice>0.0000</UnitPrice>
      </Line>  
    </doc:envioDocumentoTransporteRequestElem>
  </soapenv:Body>
</soapenv:Envelope>

 

  • Vote 1

Share this post


Link to post
Share on other sites
jncevcosta

Carissimos,

Estive fora algumas semanas e voltei agora ao desenvolvimento dos webservices.

Alguém está a conseguir comunicar as Faturas por WS no modo de teste? Em Fevereiro quando fiquei de licença estava a dar erro e testei agora e devolve o seguinte erro:

codigo:env:Client, mensagem: "Internal Error"

Alguém já passou pelo mesmo erro e que me pode ajudar a perceber se o problema está do meu lado ou do lado deles?

Share this post


Link to post
Share on other sites
marcolopes
8 hours ago, jncevcosta said:

Carissimos,

Estive fora algumas semanas e voltei agora ao desenvolvimento dos webservices.

Alguém está a conseguir comunicar as Faturas por WS no modo de teste? Em Fevereiro quando fiquei de licença estava a dar erro e testei agora e devolve o seguinte erro:

codigo:env:Client, mensagem: "Internal Error"

Alguém já passou pelo mesmo erro e que me pode ajudar a perceber se o problema está do meu lado ou do lado deles?

-99 Erro de sistema. Por favor volte a tentar mais tarde.

Mar 26, 2019 1:14:59 AM org.dma.services.at.SOAPMessageHandler interceptAndRecordSoapMessage
INFO: 
>>>SENT<<<
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>599999993/0037</wss:Username>
<wss:Password Digest="hmSQm/jknlYyXH2Fq0DHWOSsTxFNhsGmHLrYD8P5ols=">pwPy22v8PbYw1M8DSgQWdw==</wss:Password>
<wss:Nonce>OM8XCENeT0kDYBY0bSBB0VpPk6IBxGmgBnnTZv4jTxzc0GayQYUHIIXkL5L/WhA18y7/PRQ+exP7Mvdid+xH6VE7T9Yjm3KE+KhCFVM+70QscUlntvbcu9+3fTjWd9ApNfJM4U28M2TM1iKcQ3N6TBrKybmS56yFsctql6jDJBJEOqPt90yke2T5g48IYHebrkAmwIyBzFKRDY2UGuas7kM3ZnPIBGUi9elhddRgxV7epCwczzn4RTXAGUtd9Z4bJnf9DU1jqR470kKiUER9jlVheUNhvRpe9HhUjWXlJj91Zlo1DAucmAOJI8ZJFwpmDdGHJ2Lf4/MNYJlGl5FtDg==</wss:Nonce>
<wss:Created>2019-03-26T01:14:58.819Z</wss:Created>
</wss:UsernameToken>
</wss:Security>
</S:Header>
<S:Body>
<ns2:RegisterInvoiceElem xmlns:ns2="http://servicos.portaldasfinancas.gov.pt/faturas/">
<TaxRegistrationNumber>599999993</TaxRegistrationNumber>
<ns2:InvoiceNo>CFA 2018/173935</ns2:InvoiceNo>
<ns2:InvoiceDate>2018-12-18</ns2:InvoiceDate>
<ns2:InvoiceType>FT</ns2:InvoiceType>
<ns2:InvoiceStatus>N</ns2:InvoiceStatus>
<CustomerTaxID>999999990</CustomerTaxID>
<Line>
<ns2:DebitAmount>100</ns2:DebitAmount>
<ns2:Tax>
<ns2:TaxType>IVA</ns2:TaxType>
<ns2:TaxCountryRegion>PT</ns2:TaxCountryRegion>
<ns2:TaxPercentage>23</ns2:TaxPercentage>
</ns2:Tax>
</Line>
<DocumentTotals>
<ns2:TaxPayable>23</ns2:TaxPayable>
<ns2:NetTotal>100</ns2:NetTotal>
<ns2:GrossTotal>123</ns2:GrossTotal>
</DocumentTotals>
</ns2:RegisterInvoiceElem>
</S:Body>
</S:Envelope>

Mar 26, 2019 1:14:59 AM org.dma.services.at.SOAPMessageHandler interceptAndRecordSoapMessage
INFO: 
>>>RECEIVED<<<
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<ns0:RegisterInvoiceResponseElem xmlns:ns0="http://servicos.portaldasfinancas.gov.pt/faturas/">
<ReturnCode>-99</ReturnCode>
<ReturnMessage>Erro de sistema. Por favor volte a tentar mais tarde.</ReturnMessage>
</ns0:RegisterInvoiceResponseElem>
</env:Body>
</env:Envelope>

-99
Erro de sistema. Por favor volte a tentar mais tarde.

 

Edited by marcolopes

The simplest explanation is usually the correct one

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

Share this post


Link to post
Share on other sites
eandrade

Boas, sei que não é estritamente relacionado com os Webservices da AT, mas preciso de alguma ajuda.

Estou a tentar fazer scrape da página de Faturas de Consumidor, no site do e-fatura, mas estou a ter dificuldades em fazer o login através de request POST. Obviamente, este tipo de operação não é "oficial", e documentação nem ver. Os poucos comentários que encontrei aqui no fórum foram dando algumas luzes, mas já têm uns anos e estou a bater em paredes.

Comentários que encontrei sobre o assunto:

https://www.portugal-a-programar.pt/forums/topic/74808-e-fatura-login-e-obter-detalhes-dos-documentos-do-adquirente/

https://www.portugal-a-programar.pt/forums/topic/57734-utilizar-webservices-da-at/?page=255#comment-591157

Este último tem um Excel com macros que supostamente fariam o que pretende, mas o login também falha no Excel.

O que estou a fazer:

Segundo estes comentários, é necessário fazer 2 POST requests para obter o cookie denominado SINGLE_DOMAIN_SSO_COOKIE. A partir dai, desde que esse cookie esteja presente em requests futuros e não tenha expirado, é possível fazer qualquer tipo de request a partir do endereço. Até aqui tudo bem.

Os problemas começam quando tento fazer o primeiro request POST, ao URL https://www.acesso.gov.pt/jsp/loginRedirectForm.jsp (Nota: tudo isto é em C#). Ao preencher a propriedade ContentType do objecto HttpWebRequest com "application/x-www-form-urlencoded", qualquer tipo de request dá-me sempre error 500 (internal server error).

O formato deste primeiro POST é algo deste género: https://www.acesso.gov.pt/jsp/loginRedirectForm.jsp?path=painelAdquirente.action&partID=EFPF&username=XXXX&password=XXXX

Se retirar o parâmetro ContentType, a página devolve-me um HTML válido, que lá pelo meio diz:

"Por motivos de ordem técnica não nos é possível responder ao seu pedido. Por favor tente mais tarde."

Ou seja, muito possivelmente não está a aceitar o que lhe estou a enviar. Devolve-me um par de cookies, mas nada relevante e não o que preciso. O segundo pedido, se deixar o código chegar até lá e usando os cookies recebidos, devolve-me apenas um JSON a dizer "Sessão inválida", como seria de esperar.

Deixo aqui o código que pode ser relevante, se alguém quiser testar e consiga ajudar:

			string UrlLoginAT = @"https://www.acesso.gov.pt/jsp/loginRedirectForm.jsp?";
			string formParams = "path=painelAdquirente.action&partID=EFPF"
                + "&username=" + HttpUtility.UrlEncode(UserNif) 
                + "&password=" + HttpUtility.UrlEncode(PasswordAT);

            // Request Login
            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(UrlLoginAT);
                req.Method = "POST";
                //req.ContentType = "application/x-www-form-urlencoded";
                req.AllowAutoRedirect = false;
                req.CookieContainer = cookieContainer;
                req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0";
                
                byte[] bytes = Encoding.UTF8.GetBytes(formParams);
                req.ContentLength = bytes.Length;

                Stream reqStream = req.GetRequestStream();
                reqStream.Write(bytes, 0, bytes.Length);
                reqStream.Close();

                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

                // Guardar os cookies da resposta
                cookieHeader = resp.Headers["Set-cookie"];
                loginCookies = resp.Cookies;
                
				// Ler conteúdo
                using (Stream resStream = resp.GetResponseStream())
                {
                    Encoding encoding = Encoding.GetEncoding(resp.CharacterSet);
                    StreamReader sr = new StreamReader(resStream, encoding);
                    pageSource = sr.ReadToEnd();
                    sr.Close();
                }
            }
            catch (Exception ex)
            {
                return;
            }

Se alguém tiver uma ideia de como resolver este embrulhada, sou todo ouvidos. Não tenho experiência a fazer scrape de páginas web, e a pouquíssima informação disponível está a ajudar muito pouco.

Cumprimentos.

 

EDIT:

Consegui descobrir o porquê de não estar a passar daqui. Faltava-me adicionar alguns parâmetros ao POST. Neste código em cima, tirem o comentário do req.ContentType, e alterem a declaração do formParams para:

string formParams = "partID=EFPF"
                + "&username=" + HttpUtility.UrlEncode(UserNif)
                + "&password=" + HttpUtility.UrlEncode(PasswordAT)
                + "&authVersion=1"
                + "&selectedAuthMethod=N";

Assim já autentica com sucesso. Estou a ter mais uns problemas no próximo request, mas deve ser algo mínimo que me está a escapar. Boa sorte para quem precisar, espero que isto seja útil.

PS: O HttpUtility é uma extensão disponível no NuGet Packet Manager, não é nativo.

Edited by eandrade

Share this post


Link to post
Share on other sites
#sa

Sim, muitas falhas na comunicação: Servidor de Autenticação Indisponivel

 

Share this post


Link to post
Share on other sites
HRESENDE

O mesmo problema aqui, "Servidor de Autenticacao Indisponivel;". 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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