Jump to content
cjulio

Utilizar Webservices da AT

Recommended Posts

Rui Carlos
3 horas atrás, desconfiado disse:

Temos um cliente com windows XP que até há alguns dias comunicava documentos de transporte sem problemas e hoje começou a receber a seguinte mensagem:

"could not establish trust relationship for the ssl/tls secure channel on servico.portaldasfinancas.pt:401"

 

Estive a verificar os serviços no portal do efactura e parecem estar a funcionar correctamente. Também ninguém mais se queixou.

Verifiquei o nosso certificado e está registado na store correctamente e com validade até 2022.

A chave publica da AT termina em Julho mas para já ainda está válida.

Alguém sabe o que poderá ter acontecido? 

Também parece o problema do certificado root expirado discutido neste tópico recentemente (vê as mensagens do início do mês).

Share this post


Link to post
Share on other sites
m_s_f_@hotmail.com
12 hours ago, Rui Carlos said:

Parece o problema com o certificado root expirado discutido na página anterior.

Vê, por exemplo, esta mensagem: https://www.portugal-a-programar.pt/forums/topic/57734-utilizar-webservices-da-at/?do=findComment&comment=618370

Obrigado Rui!! Não tinha visto o post! Eu bem que procurei por aqui mas não procurei o suficiente. Instalei os 2 certs no dispositivo e fez a comunicação. Já me safei, obrigadíssimo!!

Share this post


Link to post
Share on other sites
Mr Rick

Boa tarde,

 

EDIT: Resolvido

Já consegui alguma evolução face ao meu último post e finalmente obtive resposta do lado de lá 😀

No entanto ainda continuo com problemas:

   <faultcode>Client.Authentication</faultcode>            
   <faultstring>Ocorreu um erro na autenticação dos contribuintes.</faultstring>
   <faultcode>Client.Authentication</faultcode>         
   <faultstring>Ocorreu um erro na autenticação dos contribuintes.</faultstring>

 

<AuthenticationFailed>
  <Code>8</Code>
  <Message>Nonce: Cifra da chave pública inválida</Message>
  <NumberOfTriesRemaining>-1</NumberOfTriesRemaining>
</AuthenticationFailed>

As credenciais que estou a usar são as de teste (supostamente) 599999993/37 com a password teste1234.

 

PS: Código que pode ser relevante (estou a fazer load da sapubkey.testes que está dentro da saPubKey.jks e a assinar o nonce com ela)

public static Key getPublicKeyFromKeystore(String keystorePath, String keystorePwd, String keyAlias) throws
            KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
        
        KeyStore ks = KeyStore.getInstance(KSConfiguration.KEYSTORE_TYPE.getValue());

        Resource resource = new ClassPathResource(keystorePath);
        InputStream fis = resource.getInputStream();
        ks.load(fis, keystorePwd.toCharArray());
        Key key = ks.getCertificate(keyAlias).getPublicKey();
        fis.close();
        return key;
}

Cumprimentos,

Mr. Rick

Edited by Mr Rick
SOLVED

Share this post


Link to post
Share on other sites
virgilio baldaia

Bom dia,

A chave publica da AT. tem validade ate 23 de Julho de 2020  

( Chave Cifra Publica AT (Produção).cer ).

 

temos de esperar que envia outra ?

ou temos de pedir um novo certificado ?

 

Obrigado,

Virgilio Ribeiro.

Share this post


Link to post
Share on other sites
virgilio baldaia
4 horas atrás, md mad disse:

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 "Chave Publica da AT" (23/07/2020), gostaria de saber se existe alguma previsão de disponibilização da mesma aos produtores de software, que têm que a disponibilizar aos seus clientes.
Com os melhores cumprimentos
    17-06-2020 10:29:51
 

AT

A Autoridade Tributária e Aduaneira (AT) agradece o seu contacto.
Bom dia,
O processo de renovação do certificado de chave pública encontra-se em execução.
Os produtores de softwre serão informados da disponibilização do Certificado no Portal das Fimanças e/ou por envio de mensagem de correio eletrónico.
Com os melhores cumprimentos
AT- Autoridade Tributária e Aduaneira

Obrigado,

bem,  termos de aguardar...

 

Share this post


Link to post
Share on other sites
Mr Rick

Boa tarde,

 

Estou basicamente a enviar um pedido semelhante ao que está no exemplo e estou a ter a resposta abaixo. Alguém me pode ajudar?

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<env:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Header/>
    <env:Body xmlns:ns0="http://servicos.portaldasfinancas.gov.pt/faturas/">
        <ns0:RegisterInvoiceResponseElem>
            <ReturnCode>-99</ReturnCode>
            <ReturnMessage>Erro de sistema. Por favor volte a tentar mais tarde.</ReturnMessage>
        </ns0:RegisterInvoiceResponseElem>
    </env:Body>
</env:Envelope>

O código para fazer build do request:

JIA5vSZ.png

 

Request xml:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header>
        <wss:Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
            <wss:UsernameToken>
                <wss:Username>599999993/37</wss:Username>
                <wss:Password>FKB1JMr+7QDg4jG1lbCsxQ==</wss:Password>
                <wss:Nonce>KvldnTFtXGMb1j7sJjY1XTY57kbS6AxIU750pR4FQrig9CgeXwkkPHEQtErjRzuP2IcZYvV4Rp+4&#13;
NT6s5OpNSGrFPg2w08r+jJBPIvWGvFqUK2huJF1KLQzkAQHbctZFjiG29GN3tvYcdCTQylIkdAtp&#13;
QV/o4PHgU1VYFg0472MkJ1oeHnR99VJA7/mcbLsG/giRp48DnsVKrkVnmxXOdOfXJWSoGX3N3N3S&#13;
r8igeUZ6ijp5YflU2lHHojCurOFwUY67IvZ4BKn8knnqHtVR1SH+JXdBA2VQqeinNwgU7PmibHEN&#13;
DWWLUUWZHVQ3M6NDKcO7ifOv8wkTT2b0ZHrptg==</wss:Nonce>
                <wss:Created>qb0mB47WzmHs9PZZ1JMlNuK3SF7FXLVQ+JA/UFjxkRg=</wss:Created>
            </wss:UsernameToken>
        </wss:Security>
    </SOAP-ENV:Header>
    <S:Body xmlns:ns2="http://servicos.portaldasfinancas.gov.pt/faturas/">
        <ns2:RegisterInvoiceElem>
            <TaxRegistrationNumber>599999993</TaxRegistrationNumber>
            <ns2:InvoiceNo>- /1</ns2:InvoiceNo>
            <ns2:InvoiceDate>2012-05-05</ns2:InvoiceDate>
            <ns2:InvoiceType>FT</ns2:InvoiceType>
            <ns2:InvoiceStatus>N</ns2:InvoiceStatus>
            <CustomerTaxID>299999998</CustomerTaxID>
            <Line>
                <ns2:CreditAmount>100</ns2:CreditAmount>
                <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>

 

 

Obrigado.

Cumprimentos,

Mr. Rick

Edited by Mr Rick

Share this post


Link to post
Share on other sites
jmta_92

Boa tarde pessoal, estou com um problema que já tinha sido reportado antes, desde há uns tempos para cá que o pedido de comunicação de guias está a retornar "Could not connect to host" aconteceu de uma momento para o outro sem razão aparente. alguém sabe se alguma coisa foi alterada ?

url de produção

https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte

url de desenvolvimento

https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte

não funciona em nenhuma das situações

Linguagem: PHP

Edited by jmta_92

Share this post


Link to post
Share on other sites
laboss

Boas pessoal, estou aqui com um dilema 😂😂

Tenho um cliente que tem um cliente que têm a sede em UK, e um armazém em PT para onde vai a mercadoria, ora ele diz que a guia de transporte deve ser comunicada a AT pois o local de descarga é em PT, até aqui tudo bem, mas se enviar o XML para o WebService da este erro:

Citação

33 element 5.2.2.2: element Country has value GB, not fixed value PT sgdtws.gdgt

O meu XML esta assim:

 


<ns2:envioDocumentoTransporteRequestElem xmlns:ns2="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
	<TaxRegistrationNumber>123456789</TaxRegistrationNumber>
	<CompanyName>Teste 2</CompanyName>
	<CompanyAddress>
		<Addressdetail>Rua Teste, n.º 00 1</Addressdetail>
		<City>55</City>
		<PostalCode>4000-000</PostalCode>
		<Country>PT</Country>
	</CompanyAddress>
	<DocumentNumber>GT X/1</DocumentNumber>
	<MovementStatus>N</MovementStatus>
	<MovementDate>2020-06-29</MovementDate>
	<MovementType>GT</MovementType>
	<CustomerTaxID>GB156185302</CustomerTaxID>

	<CustomerAddress>
		<Addressdetail>MAGIC MOUNTAIN RD, n.º 24</Addressdetail>
		<City>UK</City>
		<PostalCode>9542-000</PostalCode>
		<Country>GB</Country>
	</CustomerAddress>
	<CustomerName>Paypal</CustomerName>

	<AddressTo>
		<Addressdetail>Rua X 4000-022, Porto</Addressdetail>
		<City>Porto</City>
		<PostalCode>4000-022</PostalCode>
		<Country>PT</Country>
	</AddressTo>

	<AddressFrom>
		<Addressdetail>Rua Teste, n.º 00 1</Addressdetail>
		<City>Porto</City>
		<PostalCode>4000-000</PostalCode>
		<Country>PT</Country>
	</AddressFrom>

	<MovementEndTime>2020-06-29T10:43:00.00</MovementEndTime>
	<MovementStartTime>2020-06-29T10:43:00.00</MovementStartTime>
	<Line>
		<ProductDescription>Simples 11</ProductDescription>
		<Quantity>1</Quantity>
		<UnitOfMeasure>m2</UnitOfMeasure>
		<UnitPrice>112</UnitPrice>
	</Line>
</ns2:envioDocumentoTransporteRequestElem>

 

O XSD das finanças esta fixo o PT na validação do campo Contry! Alguém têm este caso o que fazem? Mandam o Country PT a mesma? Metem o local de descarga na morada do cliente? Não enviam os documentos (nós não enviávamos) 

Share this post


Link to post
Share on other sites
RicPe
6 minutes ago, laboss said:

Boas pessoal, estou aqui com um dilema 😂😂

Tenho um cliente que tem um cliente que têm a sede em UK, e um armazém em PT para onde vai a mercadoria, ora ele diz que a guia de transporte deve ser comunicada a AT pois o local de descarga é em PT, até aqui tudo bem, mas se enviar o XML para o WebService da este erro:

O meu XML esta assim:

 



<ns2:envioDocumentoTransporteRequestElem xmlns:ns2="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
	<TaxRegistrationNumber>123456789</TaxRegistrationNumber>
	<CompanyName>Teste 2</CompanyName>
	<CompanyAddress>
		<Addressdetail>Rua Teste, n.º 00 1</Addressdetail>
		<City>55</City>
		<PostalCode>4000-000</PostalCode>
		<Country>PT</Country>
	</CompanyAddress>
	<DocumentNumber>GT X/1</DocumentNumber>
	<MovementStatus>N</MovementStatus>
	<MovementDate>2020-06-29</MovementDate>
	<MovementType>GT</MovementType>
	<CustomerTaxID>GB156185302</CustomerTaxID>

	<CustomerAddress>
		<Addressdetail>MAGIC MOUNTAIN RD, n.º 24</Addressdetail>
		<City>UK</City>
		<PostalCode>9542-000</PostalCode>
		<Country>GB</Country>
	</CustomerAddress>
	<CustomerName>Paypal</CustomerName>

	<AddressTo>
		<Addressdetail>Rua X 4000-022, Porto</Addressdetail>
		<City>Porto</City>
		<PostalCode>4000-022</PostalCode>
		<Country>PT</Country>
	</AddressTo>

	<AddressFrom>
		<Addressdetail>Rua Teste, n.º 00 1</Addressdetail>
		<City>Porto</City>
		<PostalCode>4000-000</PostalCode>
		<Country>PT</Country>
	</AddressFrom>

	<MovementEndTime>2020-06-29T10:43:00.00</MovementEndTime>
	<MovementStartTime>2020-06-29T10:43:00.00</MovementStartTime>
	<Line>
		<ProductDescription>Simples 11</ProductDescription>
		<Quantity>1</Quantity>
		<UnitOfMeasure>m2</UnitOfMeasure>
		<UnitPrice>112</UnitPrice>
	</Line>
</ns2:envioDocumentoTransporteRequestElem>

 

O XSD das finanças esta fixo o PT na validação do campo Contry! Alguém têm este caso o que fazem? Mandam o Country PT a mesma? Metem o local de descarga na morada do cliente? Não enviam os documentos (nós não enviávamos) 

 

Isso será um caso de negócio, de qualquer forma as mercadorias para localizações não nacionais, deverão ter declarações de exportação, seja de transito comunitário ou não e creio que neste caso especifico já não se aplica o comunitário.

Existindo uma declaração de exportação ela já contém a descrição dos bens e identificação dos transportes, até a fronteira e de saída do país.

Share this post


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

Boas pessoal, estou aqui com um dilema 😂😂

Tenho um cliente que tem um cliente que têm a sede em UK, e um armazém em PT para onde vai a mercadoria, ora ele diz que a guia de transporte deve ser comunicada a AT pois o local de descarga é em PT, até aqui tudo bem, mas se enviar o XML para o WebService da este erro:

O meu XML esta assim:

 



<ns2:envioDocumentoTransporteRequestElem xmlns:ns2="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
	<TaxRegistrationNumber>123456789</TaxRegistrationNumber>
	<CompanyName>Teste 2</CompanyName>
	<CompanyAddress>
		<Addressdetail>Rua Teste, n.º 00 1</Addressdetail>
		<City>55</City>
		<PostalCode>4000-000</PostalCode>
		<Country>PT</Country>
	</CompanyAddress>
	<DocumentNumber>GT X/1</DocumentNumber>
	<MovementStatus>N</MovementStatus>
	<MovementDate>2020-06-29</MovementDate>
	<MovementType>GT</MovementType>
	<CustomerTaxID>GB156185302</CustomerTaxID>

	<CustomerAddress>
		<Addressdetail>MAGIC MOUNTAIN RD, n.º 24</Addressdetail>
		<City>UK</City>
		<PostalCode>9542-000</PostalCode>
		<Country>GB</Country>
	</CustomerAddress>
	<CustomerName>Paypal</CustomerName>

	<AddressTo>
		<Addressdetail>Rua X 4000-022, Porto</Addressdetail>
		<City>Porto</City>
		<PostalCode>4000-022</PostalCode>
		<Country>PT</Country>
	</AddressTo>

	<AddressFrom>
		<Addressdetail>Rua Teste, n.º 00 1</Addressdetail>
		<City>Porto</City>
		<PostalCode>4000-000</PostalCode>
		<Country>PT</Country>
	</AddressFrom>

	<MovementEndTime>2020-06-29T10:43:00.00</MovementEndTime>
	<MovementStartTime>2020-06-29T10:43:00.00</MovementStartTime>
	<Line>
		<ProductDescription>Simples 11</ProductDescription>
		<Quantity>1</Quantity>
		<UnitOfMeasure>m2</UnitOfMeasure>
		<UnitPrice>112</UnitPrice>
	</Line>
</ns2:envioDocumentoTransporteRequestElem>

 

O XSD das finanças esta fixo o PT na validação do campo Contry! Alguém têm este caso o que fazem? Mandam o Country PT a mesma? Metem o local de descarga na morada do cliente? Não enviam os documentos (nós não enviávamos) 

 

O Webservice para Documentos de Transporte, só permite envio de documentos que se refiram a mercadoria transportada no território Nacional

Toda a mercadoria que segue de imediato para fora do País ( nestes casos a Guia de Transporte menciona o cliente e morada estrangeira ), não obriga a envio do documento por Webservice

Share this post


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

 

O Webservice para Documentos de Transporte, só permite envio de documentos que se refiram a mercadoria transportada no território Nacional

Toda a mercadoria que segue de imediato para fora do País ( nestes casos a Guia de Transporte menciona o cliente e morada estrangeira ), não obriga a envio do documento por Webservice

A mercadoria é para ser deixada num armazém em PT dai a duvida, mas entretanto encontrei no documento da OCC o seguinte texto :

 

Citação

12. As transações intracomunitárias estarão abrangidas pela obrigação da emissão do documento de transporte do RBC? Não. No entanto dever-se-á atender a que caso o transporte intracomunitário seja acompanhado com os CMR (ou factura intracomunitária, etc..) emitidos com os destinatários finais localizados em território nacional, ainda que o transporte seja efectuado até um armazém e expedidos desse armazém para os clientes finais noutra viatura ou noutro dia, o CMR continua a servir para acompanhar os bens continuando a não ser necessária a emissão de um DT nos termos do RBC. Outra situação diferente poderá ser a emissão do CMR com o destinatário do armazém logístico e posteriormente a expedição de bens para os clientes finais. Neste caso, no transporte posterior, os bens já terão que ter um DT nos termos do RBC. 

https://www.occ.pt/fotos/editor2/sebc013c.pdf

 

 

Obrigado pela ajuda!

Share this post


Link to post
Share on other sites
jmsimoes

Caros,

 

Olá a todos. Sou novo no forum, mas usei bastante informação daqui (obrigado :) para avançar com a minha implementação em NodeJS do cliente WS da AT, para envio de declarações periódicas de IVA.

Consegui ultrapassar vários obstáculos: certificados SSL, certificados de cliente, etc etc. No entanto, já numa fase em que tudo "deveria funcionar", bati numa parede: Tenho o erro que já apareceu aqui varias vezes (com o endpoint de testes - não posso experimentar com o de produção ) :

{ Fault:
         { faultcode: 'Client.Authentication',
           faultstring: 'Ocorreu um erro na autenticação dos contribuintes.',
           faultactor: null,
           detail:
            { AuthenticationException:
               { AuthenticationFailed:
                  { Code: '8',
                    Message: 'Nonce: Cifra da chave pública inválida',
                    NumberOfTriesRemaining: '-1',
                    Actor: 'http://at.pt/actor/SPA' } } } } }

Estou a fazer tudo segundo o manual da AT: 128 random bits, cifrados com RSA com PubKey da AT, tudo codificado em Base64 no fim.

No entanto, recebo sempre este erro. Estou a utilizar a chave pública que vem no ZIP de certificados de teste no E-Factura (https://faturas.portaldasfinancas.gov.pt/testarLigacaoWebService.action). Também já experimentei extrair a chave do PFX de testes (e converter para PEM), mas recebo o mesmo erro.

 

Segue o meu código para criar o Nonce:

Webservice.js:

	// AT defines these initial 16 random bytes (128 random bits) as "Ks", so we're doing the same for clarity
    const ks = getRandomBytes(16);

    // Note: Nonce = base64 ( Rsa ( randomBytes, AtPubKey  ) )
    debug({ serverPublicKey: this.serverPublicKey.toString('utf8'), ks });

    const nonce = rsaEncrypt64(ks, this.serverPublicKey);

Utils:

import crypto from 'crypto';

// 16 bytes = 128 bits
export const getRandomBytes = (size = 16) => {
  return crypto.randomBytes(size);
};

export const rsaEncrypt64 = (byteBuffer, key) => {
  let encryptBuff = crypto.publicEncrypt(key, byteBuffer);
  return encryptBuff.toString('base64');
};

 

Alguém tem alguma ideia do que possa estar a fazer errado? Começo a pender para a ideia de ter a chave pública errada, porque não encontro mais explicações possíveis.

Share this post


Link to post
Share on other sites
jncevcosta
13 minutos atrás, jmsimoes disse:

Caros,

 

Olá a todos. Sou novo no forum, mas usei bastante informação daqui (obrigado :) para avançar com a minha implementação em NodeJS do cliente WS da AT, para envio de declarações periódicas de IVA.

Consegui ultrapassar vários obstáculos: certificados SSL, certificados de cliente, etc etc. No entanto, já numa fase em que tudo "deveria funcionar", bati numa parede: Tenho o erro que já apareceu aqui varias vezes (com o endpoint de testes - não posso experimentar com o de produção ) :


{ Fault:
         { faultcode: 'Client.Authentication',
           faultstring: 'Ocorreu um erro na autenticação dos contribuintes.',
           faultactor: null,
           detail:
            { AuthenticationException:
               { AuthenticationFailed:
                  { Code: '8',
                    Message: 'Nonce: Cifra da chave pública inválida',
                    NumberOfTriesRemaining: '-1',
                    Actor: 'http://at.pt/actor/SPA' } } } } }

Estou a fazer tudo segundo o manual da AT: 128 random bits, cifrados com RSA com PubKey da AT, tudo codificado em Base64 no fim.

No entanto, recebo sempre este erro. Estou a utilizar a chave pública que vem no ZIP de certificados de teste no E-Factura (https://faturas.portaldasfinancas.gov.pt/testarLigacaoWebService.action). Também já experimentei extrair a chave do PFX de testes (e converter para PEM), mas recebo o mesmo erro.

 

Segue o meu código para criar o Nonce:

Webservice.js:


	// AT defines these initial 16 random bytes (128 random bits) as "Ks", so we're doing the same for clarity
    const ks = getRandomBytes(16);

    // Note: Nonce = base64 ( Rsa ( randomBytes, AtPubKey  ) )
    debug({ serverPublicKey: this.serverPublicKey.toString('utf8'), ks });

    const nonce = rsaEncrypt64(ks, this.serverPublicKey);

Utils:


import crypto from 'crypto';

// 16 bytes = 128 bits
export const getRandomBytes = (size = 16) => {
  return crypto.randomBytes(size);
};

export const rsaEncrypt64 = (byteBuffer, key) => {
  let encryptBuff = crypto.publicEncrypt(key, byteBuffer);
  return encryptBuff.toString('base64');
};

 

Alguém tem alguma ideia do que possa estar a fazer errado? Começo a pender para a ideia de ter a chave pública errada, porque não encontro mais explicações possíveis.

 

Tendo estado envolvido no desenvolvimento em NodeJS a única solução que consegui encontrar para contornar esse problema, foi alterar uns ficheiros PHP que alguém disponibilizou aqui para que em vez de fazer a comunicação, recebe como argumento o ficheiro com o body e completa com a informação do cabeçalho e devolve o xml completo.

No NodeJS construo então o body, corro o ficheiro PHP e envio o XML que recebo para o WebService da AT.

Tentei imensos packages que fui encontrando mas tinha sempre esse erro a única solução que encontrei foi a que descrevi.

Share this post


Link to post
Share on other sites
jmsimoes
12 minutes ago, jncevcosta said:

 

Tendo estado envolvido no desenvolvimento em NodeJS a única solução que consegui encontrar para contornar esse problema, foi alterar uns ficheiros PHP que alguém disponibilizou aqui para que em vez de fazer a comunicação, recebe como argumento o ficheiro com o body e completa com a informação do cabeçalho e devolve o xml completo.

No NodeJS construo então o body, corro o ficheiro PHP e envio o XML que recebo para o WebService da AT.

Tentei imensos packages que fui encontrando mas tinha sempre esse erro a única solução que encontrei foi a que descrevi.

Eu consegui com o node-soap (https://github.com/vpulim/node-soap). Criei um um módulo de segurança (a package é pluggable) que trata dos headers e autenticação SSL, bem como de interceptar o XML antes de enviar e adicionar os campos todos do WSS. Posso publicar aqui ou no github, se der jeito a alguém (avisem que eu publico).

 

Ou seja, consigo construir o XML completo, e com todos os campos que em teoria são necessários. O único (e persistente ) problema é este erro do RSA com a chave pública da AT. Em princípio queria evitar dependências externas, como esse PHP - se for possível.

 

Segue o meu XML:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:tns="https://servicos.portaldasfinancas.gov.pt/dpivaws/DeclaracaoPeriodicaIVAWebService">
  <soap:Header>
    <wss:Security xmlns:at="http://at.pt/wsp/auth" soap:actor="http://at.pt/actor/SPA" at:Version="2">
      <wss:UsernameToken>
        <wss:Username>
          555555555
        </wss:Username>
        <wss:Password Digest="iZlTPqtbTSZz+EaxGpuN4ndcER33xz4fuvEDITADO=">
          FURfPCshAEDITADO==
        </wss:Password>
        <wss:Nonce>    G+XK1wqUN0xTiiDvD+dMDvhcfShkBJiLrEIq/eWS6tgHzQxJHB+c9Iq0N3ApenfdGah8mINfCm4+EhIKIhDxkoZ/kw78vk52jw7VVF8jQnFKwCOijSG4b/F56mRmJ10EzDLPK1JVt/KTDQ15q+UEoQxGYO5+r0lfsmRmUB/uZcHG6tHXrz5RmZHYYE2IUs3GQrqtESzejIZoJ68hsW1/M8CvSuRQas5V5QcxtRmrmmHu/r6xTZpCvk7OH3JVQw2wOBOjUV7rikdkf2H7zRUbnjG7Mmb8T3czFcgm/TTu+UWjLsuptKsr9w5EeV0f0sajso6nNMHfun5ea322+OZwyQ==
        </wss:Nonce>
        <wss:Created>
          2020-06-29T17:01:29.190Z
        </wss:Created>
      </wss:UsernameToken>
    </wss:Security>
  </soap:Header>
  <soap:Body>
    <tns:submeterDeclaracaoPeriodicaIVARequest>
      <versaoDeclaracao>
        2016
      </versaoDeclaracao>
      <declaracao>
        DECL_BASE64_EDITADO
      </declaracao>
    </tns:submeterDeclaracaoPeriodicaIVARequest>
  </soap:Body>
</soap:Envelope>

 

Outra questão: onde arranjaram a  chave pública de testes da AT? No ZIP disponibilizado no e-factura, com os certificados de teste? Obrigado

Edited by jmsimoes

Share this post


Link to post
Share on other sites
m_s_f_@hotmail.com

Engraçado que em Android também não consigo passar desse patamar, mesmo usando as funções deles para encriptar, aparece esse mesmo erro :///
Isto foi a resposta que me deram da AT:


A Autoridade Tributária e Aduaneira (AT) agradece o seu contacto.
O erro descrito indica que o erro poderá estar na construção do header do pedido SOAP. Verifique se a estrutura do pedido cumpre as regras do "Manual de Integração de Software - Comunicação dos Documentos de Transporte à AT" publicado no portal das finanças (endereço: http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/Documents/Comunicacao_Dados_Documentos_Transporte.pdf).
Com os melhores cumprimentos
AT- Autoridade Tributária e Aduaneira

😫

--
Os ficheiros para testes tens que requisitar, enviando um mail para lá. Está no manual como fazer isso. Em 24h devem enviar isso.

Edited by m_s_f_@hotmail.com
  • Vote 1

Share this post


Link to post
Share on other sites
jmsimoes
1 hour ago, m_s_f_@hotmail.com said:

A Autoridade Tributária e Aduaneira (AT) agradece o seu contacto.
O erro descrito indica que o erro poderá estar na construção do header do pedido SOAP. Verifique se a estrutura do pedido cumpre as regras do "Manual de Integração de Software - Comunicação dos Documentos de Transporte à AT" publicado no portal das finanças (endereço: http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/Documents/Comunicacao_Dados_Documentos_Transporte.pdf).
Com os melhores cumprimentos
AT- Autoridade Tributária e Aduaneira

😫

--
Os ficheiros para testes tens que requisitar, enviando um mail para lá. Está no manual como fazer isso. Em 24h devem enviar isso.

Pois. Pensei em enviar uma questão para o e-balcão também, mas imaginei que a resposta fosse algo no género dessa. É basicamente "Estás a fazer qualquer coisa errada", que ajuda imenso. De qualquer forma obrigado pela info!

Pois, não pedi certificados de teste, apenas de produção. Assumi que o ZIP com certs de teste do e-factura fosse suficiente. Acabei de fazer o pedido. O engraçado é que o e-mail que está no manual devolve uma resposta automática a dizer que foi abandonado, e para se fazer o pedido no e-balcão, mas responderam na mesma:
 

Quote

Exmos. Srs.,
Em resposta à vossa mensagem, enviamos o seguinte:

1. Certificado digital de testes ("TesteWebservices.pfx")
2. Chave publica para a cifra da password de acesso ("ChaveCifraPublicaAT2020.cer")
A chave para instalação do certificado referido no ponto 1, é "TESTEwebservice".

As instruções para comunicação de dados por Webservice à Autoridade Tributária e Aduaneira podem ser consultadas no documento disponível no Portal das Finanças, selecionando 'Apoio ao Contribuinte', e a opção respectiva.

Ou seja, estou de volta à estaca zero. Já estou a usar este certificado (chave pública), mas continuo com o erro "Nonce: Cifra da chave pública inválida".

[ EDIT: A chave que me enviaram é a mesma que está no ZIP do portal de produtores de software ]

Quaisquer ideias são bem-vindas. Obrigado pelo feedback até agora

Edited by jmsimoes

Share this post


Link to post
Share on other sites
albertosilva
1 hora atrás, jmsimoes disse:

Quaisquer ideias são bem-vindas. Obrigado pelo feedback até agora

Apesar de fortemente desaconselhado pela AT, a única forma efetiva que encontro de fazer testes é mesmo em produção, e passando algo de "errado", como uma data de envio ultrapassada, para que seja devolvido um erro "controlado", ou então anulando em seguida no portal.

  • Vote 1

Share this post


Link to post
Share on other sites
jose.cordeiro

Boas,

Recebi um email com um novo certificado até 2023.

Estão finalmente a começar a enviar...

abraço

Edited by jose.cordeiro

Share this post


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.