Jump to content

Utilizar Webservices da AT


cjulio
Go to solution Solved by thoga31,

Recommended Posts

Em 09/11/2022 às 19:11, albertosilva disse:

(copy/paste integral de uma resposta já enviada hoje)

Faz parte das regras de participação nos forums verificar se determinada questão foi levantada, o problema de um pode já ter sido de outros, e compreendendo que este tópico já vai muito longo - o mecanismo de pesquisa no tópico é uma ferramenta poderosa combinada a com a ordenação dos resultados - nestes casos de suspeita de indisponibilidade dos serviços da AT, de testes ou produtivo, normalmente basta olhar para as últimas mensagens para confirmar que há mais afetados, para não fazermos "todos" a mesma pergunta. 

Sobre esta questão em particular, tendo também constatado o mesmo problema ontem à noite, e confirmado aqui que não era um exclusivo meu, tal como outros também estou à espera que alguém publique uma mensagem a dizer que o ambiente já está de novo disponível, enquanto também vou testando quando posso.

Olá Alberto, sim eu sei mas já tinham passado algumas horas e como costume a informação da AT é o mesmo que falar com uma parede.
P.S. continua na mesma.

Edited by Reboot
Link to comment
Share on other sites

Para quem quiser utilizar um regex para validar a conformidade dos identificadores de uma série:

(?:^(?!.*([._-])[._-]{1,})[A-Za-z0-9][A-Za-z0-9._-]{0,33}[A-Za-z0-9]$)|(?:^[A-Za-z0-9]{1,2}$)

Podem testar aqui, deixei alguns exemplos de OK e de NOT_OK!

https://regex101.com/r/6Qmaox/2

Classe helper em C# e teste (não unitário)

    public static class Helper
    {
        static Regex seriesRegex = new Regex("(?:^(?!.*([._-])[._-]{1,})[A-Za-z0-9][A-Za-z0-9._-]{0,33}[A-Za-z0-9]$)|(?:^[A-Za-z0-9]{1,2}$)");

        public static bool IsSeriesIdentifierValid(string identifier)
        {
            return seriesRegex.IsMatch(identifier);
        }
    }
    public static class Testes
    {
        // para testar numa app do tipo ConsoleApplication
        static void TestStringIdentifiers()
        {
            Check("OK");
            Check("A");
            Check("AB");
            Check("1");
            Check("2022");
            Check("ABC123");
            Check("ABC-123");
            Check("ABC-DE-123");
            Check("ABC-DE.123");
            Check("NOT_OK!");
            Check("-");
            Check("A -");
            Check("-A");
            Check("ABC - 123");
            Check("ABC--123");
            Check("ABC.- 123");
            Check("ABC---123");
            Check("ABC.-.123");
            Check("ABC.--123");

            void Check(string id)
            {
                var b = M2USalesV5SeriesManagementLib.Helper.IsSeriesIdentifierValid(id);
                if (b)
                    Console.WriteLine($"'{id}' OK!");
                else
                    Console.WriteLine($"'{id}' NOT OK!");
            }
        }
    }

 

Edited by albertosilva
Melhoramento
  • Vote 1
  • Thanks 1
Link to comment
Share on other sites

On 11/10/2022 at 8:48 PM, albertosilva said:

Para quem quiser utilizar um regex para validar a conformidade dos identificadores de uma série:

(?:^(?!.*([._-])[._-]{1,})[A-Za-z0-9][A-Za-z0-9._-]{0,33}[A-Za-z0-9]$)|(?:^[A-Za-z0-9]{1,2}$)

Podem testar aqui, deixei alguns exemplos de OK e de NOT_OK!

https://regex101.com/r/6Qmaox/2

Não implementei... razão? O sistema da AT queixa-se na comunicação 😄

Nada melhor do que a "validação" da AT! 😄

  • Vote 2

The simplest explanation is usually the correct one

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

Link to comment
Share on other sites

Em 10/11/2022 às 21:11, marcolopes disse:

Nada melhor do que a "validação" da AT! 😄

Nem mais.😁

Já agora e de acordo com a OCC vai cair ai um despacho a alargar o prazo dos PDFs sem assinatura para todo o ano de 2023 e adiar também o SAFT na contabilidade (existe muita gente que não quer ver isso a funcionar).

Portugal no seu melhor....

Link to comment
Share on other sites

Bom dia,

Alguém sabe se a AT tem algum mecanismo no webservice para testar as credencias do portal? Gostava construir essa funcionalidade, para auxiliares os clientes mais "distraídos".

Já o tenho feito com a comunicação das guias, mas não queria recorrer a esta operação, dados que agora iremos ter duas comunicações distintas.

Obrigado

Link to comment
Share on other sites

Em 11/11/2022 às 09:58, Nuno Bagulho Marques disse:

Bom dia,

Alguém sabe se a AT tem algum mecanismo no webservice para testar as credencias do portal? Gostava construir essa funcionalidade, para auxiliares os clientes mais "distraídos".

Já o tenho feito com a comunicação das guias, mas não queria recorrer a esta operação, dados que agora iremos ter duas comunicações distintas.

Obrigado

Podes usar a consulta de séries com uma série qualquer fictícia.

  • Vote 1
Link to comment
Share on other sites

Boas,

É a primeira vez que vou integrar com a AT, pediram-me para consumir o webservice para comunicação das séries documentais.

Estive a ler a documentação e no documento "Comunicação de Séries Documentais, Aspetos Genéricos" segui os requisitos para o SOAP header.

Eis o que fiz hoje (com muita, mesmo muita pesquisa), isto está ok? 🤔

	internal class SoapHeader
    {
        private string _pathCertificado = @".\certs\TesteWebservices.pfx";
        private X509Certificate2 cert;
        private PublicKey publicKey;
        private byte[] chaveSimetrica;
        private string nonce = string.Empty;
        private string encryptedPassword = string.Empty;
        private string encryptedDataCreated = string.Empty;

        public SoapHeader()
        {
            cert = new X509Certificate2(_pathCertificado, "TESTEwebservice");
            publicKey = cert.PublicKey;
            
            chaveSimetrica = CreateSymmetricKey();
             
            nonce = Convert.ToBase64String(EncryptSymmetricKey(chaveSimetrica));
            encryptedPassword = Convert.ToBase64String(EncryptDataWithSymmetricKey("MinhaPassword"));
            encryptedDataCreated = Convert.ToBase64String(EncryptDataWithSymmetricKey(GetDataCreated()));
           	Console.WriteLine("Username: {0}", "999999999/1");
            Console.WriteLine("Nonce: {0}", nonce);
            Console.WriteLine("Password: {0}", encryptedPassword);
            Console.WriteLine("Data Created: {0}", encryptedDataCreated);

        }

        private byte[] CreateSymmetricKey()
        {
            using (var aes = Aes.Create())
            {
                aes.KeySize = 128;
                aes.BlockSize = 128;
                aes.Padding = PaddingMode.PKCS7;
                aes.Mode = CipherMode.ECB;
                aes.GenerateIV();
                aes.GenerateKey();

                return aes.Key;
            }
        }

        private byte[] EncryptSymmetricKey(byte[] input)
        {
            byte[] result;
            using (var rsa = RSA.Create())
            {
                rsa.ImportRSAPublicKey(cert.GetRSAPublicKey()?.ExportRSAPublicKey(), out _);
                result = rsa.Encrypt(input, RSAEncryptionPadding.Pkcs1);                
            }
            return result;
        }

        private byte[] EncryptDataWithSymmetricKey(string input)
        {
            byte[] result;
            byte[] data = Encoding.UTF8.GetBytes(input);
            using (var aes = Aes.Create())
            {
                aes.Key = chaveSimetrica;
                result = aes.EncryptEcb(data, PaddingMode.PKCS7);
            }
            return result;
        }

        private string GetDataCreated()
        {
            NtpClient client = new NtpClient("ntp02.oal.ul.pt");
            NtpClock clock = client.Query();

            return clock.Now.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture);
        }
    }

 

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.