Jump to content

Envio DMR (AT) via webservices.


desconfiado

Recommended Posts

Boa tarde,

 

Alguém sabe se a AT disponibiliza algum webservice para envio da DMR (AT)?

Estou-me a referir à DMR que é enviada á AT e não a que é enviada á segurança social (têm ambas o mesmo nome mas são diferentes).

Para enviar á segurança social eu sei que existe e já tenho desenvolvido mas não consigo encontrar nada para enviar á Autoridade Tributária. No entanto existe um site que tem uma aplicação que diz que faz o envio destes ficheiros á AT.

Link to comment
Share on other sites

Em 03/04/2019 às 21:59, ccue2003 disse:

Boa noite

Pode disponibilizar o código ou a linha de orientação para conseguir enviar o ficheiro DMR para segurança social

Obrigado

Peço desculpa por só agora ter respondido. Esqueci-me completamente deste tópico.

O envio da DMR da segurança social podes obter toda a informação aqui http://www.plataformaservicos.seg-social.pt/ .

Eles são muito complicados, tens que pedir credenciais de teste e dar um IP pois os testes só funcionam a partir de um IP.

Link to comment
Share on other sites

Bom Dia

Cá estou eu mais uma vez, a tentar colocar o webserver no envio das DMR da AT e Seg.Social, mas a maior parte da informação desapareceu, no portal das finanças, já nem existe qualquer informação, no da seg. social, há lá muitas lacunas , alguém tem alguma informação que possa disponibilizar ... ( pdf, wsdl, codigo ... )

Obrigado

  •  😵😴🥵🥴  No Desenvolvimento as Possibilidades são Infinitas  😵😴🥵🥴 , podemos é ficar doidos ...
Link to comment
Share on other sites

Em 12/02/2022 às 09:55, Carlos Pais disse:

Bom Dia

Cá estou eu mais uma vez, a tentar colocar o webserver no envio das DMR da AT e Seg.Social, mas a maior parte da informação desapareceu, no portal das finanças, já nem existe qualquer informação, no da seg. social, há lá muitas lacunas , alguém tem alguma informação que possa disponibilizar ... ( pdf, wsdl, codigo ... )

Obrigado

O link que coloquei acima há já algum tempo continua em funcionamento. Este é para a DMR da segurança social.

Não existe nenhum webservice para envio da DMR da AT (que eu saiba).

 

PS: Isto de chamar DMR ás 2 declarações confunde um bocado.

Link to comment
Share on other sites

Em 22/02/2022 às 10:27, desconfiado disse:

O link que coloquei acima há já algum tempo continua em funcionamento. Este é para a DMR da segurança social.

Não existe nenhum webservice para envio da DMR da AT (que eu saiba).

 

PS: Isto de chamar DMR ás 2 declarações confunde um bocado.

boas, essa documentação eu já tenho, eu queria era algum código já meio feito, algo que estivesse a funcionar ...

  •  😵😴🥵🥴  No Desenvolvimento as Possibilidades são Infinitas  😵😴🥵🥴 , podemos é ficar doidos ...
Link to comment
Share on other sites

Em 23/02/2022 às 15:53, Carlos Pais disse:

boas, essa documentação eu já tenho, eu queria era algum código já meio feito, algo que estivesse a funcionar ...

O código é simples demais. No envio de ficheiros tens basicamente 3 funções:

  1. RegistarFicheiro
  2. SubstituirFicheiro
  3. ConsultarFicheiro

Se programas em .NET podes utilizar os webservices references do próprio VS para obter as especificações dos serviçosa através da WSDL. Depois é só chamar os serviços.

É um bocado básico mas aqui tens o código.

    private void RegistarFicheiro()
    {
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            byte[] myFile = System.IO.File.ReadAllBytes(txtFicheiro.Text);
            var resp = myWS.registarFicheiro(myFile, Path.GetFileName(txtFicheiro.Text));
            txtID.Text = resp;
            registaLog("Registo Ficheiro (ID: " + txtID.Text + ") " + txtFicheiro.Text, resp);
            MsgBox("Ficheiro registado com sucesso. ID Ficheiro: " + resp, MsgBoxStyle.Information);
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
            registaLog("Erro Registo Ficheiro " + txtFicheiro.Text, "");
        }
    }

    private void SubstituirFicheiro()
    {
        string idAnt = txtID.Text;
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            byte[] myFile = System.IO.File.ReadAllBytes(txtFicheiro.Text);
            var resp = myWS.substituirFicheiro(myFile, txtFicheiro.Text, txtID.Text);
            txtID.Text = resp;
            registaLog("Substituição Ficheiro com ID: " + TxtIDant.Text + " por ficheiro (ID: " + txtID.Text + ") " + txtFicheiro.Text, resp);
            MsgBox("Ficheiro substituido com sucesso. ID Ficheiro: " + resp, MsgBoxStyle.Information);
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
            registaLog("Erro Registo Ficheiro " + txtFicheiro.Text, "");
        }
    }

    private void ConsultarFicheiro()
    {
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            var resp = myWS.consultarFicheiro(txtID.Text);
            switch (resp.estado)
            {
                case "0":
                    {
                        string dirPath = Path.GetDirectoryName(txtFicheiro.Text);
                        string nomeFich = dirPath + @"\" + resp.nomeFicheiro;
                        File.WriteAllBytes(nomeFich, resp.lstErrosAlertasZip);
                        registaLog("Ficheiro " + resp.estadoFicheiro + ", ID: " + txtID.Text + ", Fich=" + resp.nomeFicheiro, txtID.Text);
                        var abre = MsgBox("Ficheiro " + resp.estadoFicheiro + "." + IIf(resp.dataEntregaSpecified, Constants.vbNewLine + "Data Entrega: " + resp.dataEntrega, "") + IIf(resp.dataLimiteSubstituicaoSpecified, Constants.vbNewLine + "Data Limite Substituição: " + resp.dataLimiteSubstituicao, "") + "Pretende abrir o ficheiro para consultar os alertas/erros?", MsgBoxStyle.YesNo);
                        if (abre)
                            Process.Start(nomeFich);
                        break;
                    }
                default:
                    {
                        MsgBox(resp.mensagem, MsgBoxStyle.Information);
                        break;
                    }
            }
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
        }
    }

Depois tens mais 2 serviços, um de consulta da situação do funcionário e outro de registo de vinculo do funcionário. Mas como digo são bastante básicos.

Link to comment
Share on other sites

Boas

Existe webservice da AT para envio do DMR.
WEBSERVICE AT DMR

Estou a ter problemas na ligação
Inicialmente estava a ir buscar o wsdl, adicionando "?wsdl" ao link
Depois descarreguei o ficheiro zip que eles disponibilizam, e aparece-me o seguinte erro
 

SOAP-ERROR: Parsing Schema: can't import schema from 'oaatws.xsd', namespace must not match the enclosing schema 'targetNamespace'

De seguida comentei o código que gerava o erro
 

<xsd:import namespace="https://servicos.portaldasfinancas.gov.pt/oaatws/GestaoDeclarativaOAWebService/2021"
                        schemaLocation="oaatws.xsd"/>

Começou a aparecer o seguinte erro
 

object(SoapFault)#3 (9) {
  ["message":protected]=>
  string(25) "Could not connect to host"
  ["string":"Exception":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(78) "teste-AT.php"
  ["line":protected]=>
  int(67)
  ["trace":"Exception":private]=>
  array(2) {
    [0]=>
    array(3) {
      ["function"]=>
      string(11) "__doRequest"
      ["class"]=>
      string(10) "SoapClient"
      ["type"]=>
      string(2) "->"
    }
    [1]=>
    array(5) {
      ["file"]=>
      string(78) "teste-AT.php"
      ["line"]=>
      int(67)
      ["function"]=>
      string(6) "__call"
      ["class"]=>
      string(10) "SoapClient"
      ["type"]=>
      string(2) "->"
    }
  }
  ["previous":"Exception":private]=>
  NULL
  ["faultstring"]=>
  string(25) "Could not connect to host"
  ["faultcode"]=>
  string(4) "HTTP"
}

Deixo aqui o meu código de exemplo
 

<?php

    class WsseAuthHeader extends SoapHeader
    {

        //Policy Server Certificates
        private $PubKeyCertificate;
        //Header Authentication
        private $header;
        
        function __construct($PubKeyCertificate, $user, $pass)
        {
            
            //Policy Server Certificates
            $this->PubKeyCertificate = $PubKeyCertificate;

            //Método Cipher
            $cipher_ecb = 'aes-128-ecb';

            $pubkey  = openssl_pkey_get_public(file_get_contents($this->PubKeyCertificate));
            $pkey    = openssl_pkey_get_details($pubkey);
            $pub_key = $pkey['key'];

            $Created = gmdate('Y-m-d\TH:i:s\.00\Z');

            $SimetricKey = bin2hex(openssl_random_pseudo_bytes(16));

            openssl_public_encrypt($SimetricKey, $encryt_nonce, $pub_key);
            $Nonce = base64_encode($encryt_nonce);

            $Concat = $SimetricKey.$Created.$pass;

            $Size = mcrypt_get_block_size('des', 'ecb');

            $Password_PKCS5 = $this->pkcs5_pad($pass, $Size);
            $encrypt_password = openssl_encrypt($Password_PKCS5, $cipher_ecb, $SimetricKey, OPENSSL_RAW_DATA);
            $EncodePassword = base64_encode($encrypt_password);

            $Concat_PKCS5 = $this->pkcs5_pad($Concat, $Size);
            $encryt_digest = openssl_encrypt($Concat_PKCS5, $cipher_ecb, $SimetricKey, OPENSSL_ALGO_SHA1);
            $EncodeDigest = base64_encode($encryt_digest);

            $this->header = '<S:Header>
                        <wss:Security xmlns:wss="https://schemas.xmlsoap.org/ws/2002/12/secext/" at:Version="2">
                            <wss:UsernameToken>
                                <wss:Username>'.$user.'</wss:Username>
                                <wss:Password Digest="'.$EncodeDigest.'">'.$EncodePassword.'</wss:Password>
                                <wss:Nonce>'.$Nonce.'</wss:Nonce>
                                <wss:Created>'.$Created.'</wss:Created>
                            </wss:UsernameToken>
                        </wss:Security>
                    </S:Header>';
        }

        public function gerar_xml_validar($file)
        {

            $versao = '2021.0';
            $modelo = 'DMR';
            $file_encode = base64_encode(file_get_contents($file));

            $this->xml_validar = '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="https://servicos.portaldasfinancas.gov.pt/oaatws/GestaoDeclarativaOAWebService/2021">
                        '.$this->header.'
                        <S:Body>
                            <ns:validarDeclaracaoRequest>
                                <versaoDeclaracao>'.$versao.'</versaoDeclaracao>
                                <declaracao>'.$file_encode.'</declaracao>
                                <modelo>'.$modelo.'</modelo>
                            </ns:validarDeclaracaoRequest>
                        </S:Body>
                    </S:Envelope>';

        }

        private function pkcs5_pad ($text, $blocksize)
        {
            
            $pad = $blocksize - (strlen($text) % $blocksize);
            return $text . str_repeat(chr($pad), $pad);

        }

    }
$Protocol = 'https://';
    $TestPort = '718';

    //Hostname
    $Hostname = 'servicos.portaldasfinancas.gov.pt';

    //URL
    if(_DEBUG_)
        $soap_uri = $Protocol.$Hostname.':'.$TestPort.'/oaatws/GestaoDeclarativaOAWebService';
    else
        $soap_uri = $Protocol.$Hostname.'/oaatws/GestaoDeclarativaOAWebService';

    //Location
    if(_DEBUG_)
        $soap_location = $Protocol.$Hostname.':'.$TestPort.'/oaatws/GestaoDeclarativaOAWebService/';
    else
        $soap_location = $Protocol.$Hostname.'/oaatws/GestaoDeclarativaOAWebService/';

    if(_DEBUG_)
        $wsdl = $Protocol.$Hostname.':'.$TestPort.'/oaatws/GestaoDeclarativaOAWebService?wsdl';
    else
        $wsdl = $Protocol.$Hostname.'/oaatws/GestaoDeclarativaOAWebService?wsdl';

    $wsdl = "/path/to/oaatws.wsdl";

    //Policy Server Certificates
    $PubKeyCertificate = "/path/to/Chave.cer";
    $CertPfx           = "/path/to/Certs.pfx";
    $CertPem           = "/path/to/Certs.pem";
    $Passphase         = 'TESTEwebservice';
    
    $Username_cliente = '599999993/37';
    $Password_cliente = 'testes1234';

    $file_dmr = 'DMR_FILE.TXT';

    try
    {

        $XML = new WsseAuthHeader($PubKeyCertificate, $Username_cliente, $Password_cliente);

        $params = array(
            'trace'      => true,
            'keep_alive' => true,
            'exceptions' => false,
            'cache_wsdl' => WSDL_CACHE_NONE,
            'uri'        => $soap_uri,
            'location'   => $soap_location,
            'local_cert' => $CertPfx,
            'passphrase' => $Passphase
        );

        $client = new SoapClient($wsdl, $params);
        $XML->gerar_xml_validar($file_dmr);

        $validar = $client->validarDeclaracao($XML->xml_validar);

        var_dump($validar);

    }
    catch(SoapFault $exception)
    {

        echo $exception->getMessage();

    }

Alguém me pode ajudar

MrG0DL3

Link to comment
Share on other sites

Em 23/02/2022 às 15:36, desconfiado disse:

O código é simples demais. No envio de ficheiros tens basicamente 3 funções:

  1. RegistarFicheiro
  2. SubstituirFicheiro
  3. ConsultarFicheiro

Se programas em .NET podes utilizar os webservices references do próprio VS para obter as especificações dos serviçosa através da WSDL. Depois é só chamar os serviços.

É um bocado básico mas aqui tens o código.

    private void RegistarFicheiro()
    {
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            byte[] myFile = System.IO.File.ReadAllBytes(txtFicheiro.Text);
            var resp = myWS.registarFicheiro(myFile, Path.GetFileName(txtFicheiro.Text));
            txtID.Text = resp;
            registaLog("Registo Ficheiro (ID: " + txtID.Text + ") " + txtFicheiro.Text, resp);
            MsgBox("Ficheiro registado com sucesso. ID Ficheiro: " + resp, MsgBoxStyle.Information);
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
            registaLog("Erro Registo Ficheiro " + txtFicheiro.Text, "");
        }
    }

    private void SubstituirFicheiro()
    {
        string idAnt = txtID.Text;
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            byte[] myFile = System.IO.File.ReadAllBytes(txtFicheiro.Text);
            var resp = myWS.substituirFicheiro(myFile, txtFicheiro.Text, txtID.Text);
            txtID.Text = resp;
            registaLog("Substituição Ficheiro com ID: " + TxtIDant.Text + " por ficheiro (ID: " + txtID.Text + ") " + txtFicheiro.Text, resp);
            MsgBox("Ficheiro substituido com sucesso. ID Ficheiro: " + resp, MsgBoxStyle.Information);
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
            registaLog("Erro Registo Ficheiro " + txtFicheiro.Text, "");
        }
    }

    private void ConsultarFicheiro()
    {
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            var resp = myWS.consultarFicheiro(txtID.Text);
            switch (resp.estado)
            {
                case "0":
                    {
                        string dirPath = Path.GetDirectoryName(txtFicheiro.Text);
                        string nomeFich = dirPath + @"\" + resp.nomeFicheiro;
                        File.WriteAllBytes(nomeFich, resp.lstErrosAlertasZip);
                        registaLog("Ficheiro " + resp.estadoFicheiro + ", ID: " + txtID.Text + ", Fich=" + resp.nomeFicheiro, txtID.Text);
                        var abre = MsgBox("Ficheiro " + resp.estadoFicheiro + "." + IIf(resp.dataEntregaSpecified, Constants.vbNewLine + "Data Entrega: " + resp.dataEntrega, "") + IIf(resp.dataLimiteSubstituicaoSpecified, Constants.vbNewLine + "Data Limite Substituição: " + resp.dataLimiteSubstituicao, "") + "Pretende abrir o ficheiro para consultar os alertas/erros?", MsgBoxStyle.YesNo);
                        if (abre)
                            Process.Start(nomeFich);
                        break;
                    }
                default:
                    {
                        MsgBox(resp.mensagem, MsgBoxStyle.Information);
                        break;
                    }
            }
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
        }
    }

Depois tens mais 2 serviços, um de consulta da situação do funcionário e outro de registo de vinculo do funcionário. Mas como digo são bastante básicos.

Olá Desconfiado, estou a pensar usar estas funcionalidades disponibilizadas pela Segurança Social, usando o wdsl no vb.net. O código acima partilhado vai provavelmente ajudar bastante, mas gostava de ver a função GetMyCredentials (sem o nif+pass, evidentemente), se a puderes partilhar, assim como a chamada à consulta de funcionário, agradecia.

 

Link to comment
Share on other sites

3 horas atrás, Pelikan disse:

Olá Desconfiado, estou a pensar usar estas funcionalidades disponibilizadas pela Segurança Social, usando o wdsl no vb.net. O código acima partilhado vai provavelmente ajudar bastante, mas gostava de ver a função GetMyCredentials (sem o nif+pass, evidentemente), se a puderes partilhar, assim como a chamada à consulta de funcionário, agradecia.

 

Boas.

Essa função não tem interesse nenhum porque apenas vai buscar á BD o utilizador e a password de acesso ao webservice (que é a mesma do acesso ao Segurança Social Directa se não me engano).

private NetworkCredential GetMyCredentials()
{
    if (testMode)
    {
        LoginSS = "xxxxxxxxx";
        PasswordSS = "xxxxxxxx";
    }
    else
    {
      	//...
    }
    return new NetworkCredential(LoginSS, PasswordSS);
}

 

Edited by desconfiado
Link to comment
Share on other sites

Em 29/08/2022 às 21:16, desconfiado disse:

Boas.

Essa função não tem interesse nenhum porque apenas vai buscar á BD o utilizador e a password de acesso ao webservice (que é a mesma do acesso ao Segurança Social Directa se não me engano).

private NetworkCredential GetMyCredentials()
{
    if (testMode)
    {
        LoginSS = "xxxxxxxxx";
        PasswordSS = "xxxxxxxx";
    }
    else
    {
      	//...
    }
    return new NetworkCredential(LoginSS, PasswordSS);
}

 

Obrigado pela partilha, pensei que fosse mais complicado a parte das credenciais. Qdo me derem o acesso ao ambiente de testes vou experimentar.

Link to comment
Share on other sites

Em 23/02/2022 às 15:36, desconfiado disse:

O código é simples demais. No envio de ficheiros tens basicamente 3 funções:

  1. RegistarFicheiro
  2. SubstituirFicheiro
  3. ConsultarFicheiro

Se programas em .NET podes utilizar os webservices references do próprio VS para obter as especificações dos serviçosa através da WSDL. Depois é só chamar os serviços.

É um bocado básico mas aqui tens o código.

    private void RegistarFicheiro()
    {
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            byte[] myFile = System.IO.File.ReadAllBytes(txtFicheiro.Text);
            var resp = myWS.registarFicheiro(myFile, Path.GetFileName(txtFicheiro.Text));
            txtID.Text = resp;
            registaLog("Registo Ficheiro (ID: " + txtID.Text + ") " + txtFicheiro.Text, resp);
            MsgBox("Ficheiro registado com sucesso. ID Ficheiro: " + resp, MsgBoxStyle.Information);
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
            registaLog("Erro Registo Ficheiro " + txtFicheiro.Text, "");
        }
    }

    private void SubstituirFicheiro()
    {
        string idAnt = txtID.Text;
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            byte[] myFile = System.IO.File.ReadAllBytes(txtFicheiro.Text);
            var resp = myWS.substituirFicheiro(myFile, txtFicheiro.Text, txtID.Text);
            txtID.Text = resp;
            registaLog("Substituição Ficheiro com ID: " + TxtIDant.Text + " por ficheiro (ID: " + txtID.Text + ") " + txtFicheiro.Text, resp);
            MsgBox("Ficheiro substituido com sucesso. ID Ficheiro: " + resp, MsgBoxStyle.Information);
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
            registaLog("Erro Registo Ficheiro " + txtFicheiro.Text, "");
        }
    }

    private void ConsultarFicheiro()
    {
        try
        {
            SSWS_GestaoFicheiros.gestaoficheiro myWS = new SSWS_GestaoFicheiros.gestaoficheiro();
            if (ckTeste.CheckState == Windows.Forms.CheckState.Checked)
                myWS.Url = "https://preapp.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";
            else
                myWS.Url = "https://app.seg-social.pt/ws/gr/v1/gestaoFicheiro?wsdl";

            myWS.Credentials = GetMyCredentials();

            var resp = myWS.consultarFicheiro(txtID.Text);
            switch (resp.estado)
            {
                case "0":
                    {
                        string dirPath = Path.GetDirectoryName(txtFicheiro.Text);
                        string nomeFich = dirPath + @"\" + resp.nomeFicheiro;
                        File.WriteAllBytes(nomeFich, resp.lstErrosAlertasZip);
                        registaLog("Ficheiro " + resp.estadoFicheiro + ", ID: " + txtID.Text + ", Fich=" + resp.nomeFicheiro, txtID.Text);
                        var abre = MsgBox("Ficheiro " + resp.estadoFicheiro + "." + IIf(resp.dataEntregaSpecified, Constants.vbNewLine + "Data Entrega: " + resp.dataEntrega, "") + IIf(resp.dataLimiteSubstituicaoSpecified, Constants.vbNewLine + "Data Limite Substituição: " + resp.dataLimiteSubstituicao, "") + "Pretende abrir o ficheiro para consultar os alertas/erros?", MsgBoxStyle.YesNo);
                        if (abre)
                            Process.Start(nomeFich);
                        break;
                    }
                default:
                    {
                        MsgBox(resp.mensagem, MsgBoxStyle.Information);
                        break;
                    }
            }
        }
        catch (Exception ex)
        {
            Interaction.MsgBox(ex.Message, MsgBoxStyle.Critical);
        }
    }

Depois tens mais 2 serviços, um de consulta da situação do funcionário e outro de registo de vinculo do funcionário. Mas como digo são bastante básicos.

Boas, podes-me ajudar? Eu gerei os serviços através da WSDL, no entanto estou com grandes dificuldades em colocá-los a funcionar.

Após ter gerador os serviços, ao meu ficheiro de configuração (App.config) foi acrescentado o seguinte:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="GestaoFicheiroWSPortBinding" messageEncoding="Mtom">
                    <security mode="Transport">
                    </security>
                </binding>
                <binding name="GestaoFicheiroWSPortBinding1" messageEncoding="Mtom" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://app.seg-social.pt:443/ws/gr/v1/gestaoFicheiro"
                binding="basicHttpBinding" bindingConfiguration="GestaoFicheiroWSPortBinding"
                contract="ServiceReference2.GestaoFicheiroWS" name="GestaoFicheiroWSPort" />
        </client>
    </system.serviceModel>

No entanto, ao tentar realizar um request, por exemplo registar um ficheiro recebia uma mensagem a dizer "O pedido HTTP foi desautorizado com o esquema de autenticação de cliente 'Anonymous'. O cabeçalho de autenticação recebido a partir do servidor foi 'Basic realm="weblogic"'.".

Após pesquisar, disseram-me para acrescentar o seguinte ao ficheiro:

<transport clientCredentialType="Basic"/>

Ficando este assim:

 

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="GestaoFicheiroWSPortBinding" messageEncoding="Mtom">
			<security mode="Transport">
				<transport clientCredentialType="Basic" />
			</security>
        </binding>
        <binding name="GestaoFicheiroWSPortBinding1" messageEncoding="Mtom" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://app.seg-social.pt:443/ws/gr/v1/gestaoFicheiro"
        binding="basicHttpBinding" bindingConfiguration="GestaoFicheiroWSPortBinding"
        contract="SegSocialWebServiceGestaoFicheiros.GestaoFicheiroWS"
        name="GestaoFicheiroWSPort" />
    </client>
  </system.serviceModel>

Mas agora recebo esta exceção "O servidor devolveu uma falha SOAP inválida. Consulte InnerException para obter mais detalhes. ---> System.Xml.XmlException: Prefixo desvinculado utilizado no nome qualificado 'S:Client'" e não sei como resolver. Já pesquisei bastante, mas não encontrei nada. Estou a começar a trabalhar com soap e ainda não percebo muito disto.

Link to comment
Share on other sites

Configuraste isso como um service ou com web reference no VS? 

Deves configurar como Web Reference e não como Service Reference. Parece-me, pela configuração que colocaste aí, que está como "Service Reference". Esse serviço é básico demais para isso.

vs.jpg

Edited by desconfiado
Link to comment
Share on other sites

2 horas atrás, desconfiado disse:

Configuraste isso como um service ou com web reference no VS? 

Deves configurar como Web Reference e não como Service Reference. Parece-me, pela configuração que colocaste aí, que está como "Service Reference". Esse serviço é básico demais para isso.

Foi como um service, vou tentar com web reference,

Muito Obrigado pela resposta.

Link to comment
Share on other sites

5 horas atrás, desconfiado disse:

Configuraste isso como um service ou com web reference no VS? 

Deves configurar como Web Reference e não como Service Reference. Parece-me, pela configuração que colocaste aí, que está como "Service Reference". Esse serviço é básico demais para isso.

vs.jpg

Testei com o serviço de consultar declarações e funcionou, vou ver com o de registar ficheiro.

Muito Obrigado! 🙂

Link to comment
Share on other sites

Em 04/10/2022 às 18:24, p3druh77 disse:

Boa  tarde,

O que consideram ser o campo Digest para a autenticação?

Na documentação colocam o seguinte:
Ks+Created+SenhaPF := São os bytes dos três campos concatenados;

O Ks já é um random_bytes de 16,  mas os outros 2 não, converteram para alguma tipo de array ou codificaram ?


Obrigado

Boas, fiz isto:

byte[] ksBytes = ks.Key;
byte[] time = Encoding.UTF8.GetBytes(timestamp);
byte[] pwd = Encoding.UTF8.GetBytes("pass");

byte[] combined = new byte[ksBytes.Length + time.Length + pwd.Length];
Array.Copy(ksBytes, combined, ksBytes.Length);
Array.Copy(time, 0, combined, ksBytes.Length, time.Length);
Array.Copy(pwd, 0, combined, ksBytes.Length + time.Length, pwd.Length);

 

Edited by Rafael Faria
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.