Pobieranie zwolnień z e-ZLA ZUS

0

Nie mogę pobrać zwolnień z serwisu ZUS.
Utworzyłem WSDL-a, na jego podstawie dodałem klasy service reference i przy próbie łączenia dostaję błąd ISS.0088.917 One or more entries header were not understood by SOAP processor

Mój kod (VS 2017. Próbowałem w VS2010 i VB.NET, taki sam błąd):

            string url1 = "https://pue.zus.pl:8500/ws/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla/zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port";
            EndpointAddress ea = new EndpointAddress(url1);

            WSHttpBinding myBinding = new WSHttpBinding();
            myBinding.Security.Mode = SecurityMode.Transport;
            myBinding.MessageEncoding = WSMessageEncoding.Text;
            myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

            eZLAService1.wsdlPlatnikRaportyZla_PortTypeClient rrC = new eZLAService1.wsdlPlatnikRaportyZla_PortTypeClient();
            rrC.Endpoint.Binding = myBinding;
            rrC.Endpoint.Address = ea;

            string login = "[email protected]";     // testuje na prawdziwych danych  
            string haslo = "Qqqqqqqq";
            string nip = "67766666";
            eZLAService1.Raport[] raporty;
            string opis;

            rrC.ClientCredentials.UserName.UserName = "b2b_platnik_raporty_zla";
            rrC.ClientCredentials.UserName.Password = "b2b_platnik_raporty_zla";
            rrC.Open();
            rrC.pobierzRaporty("2019-04-01", login, haslo, nip, out opis, out raporty);

rrC.Open wykonuje się prawidłowo, błąd wychodzi w ostatniej linii.
W oryginalnych klasach pierwszy parametr był typu DateTime, też było źle.

Kiedy wklejam do Postmana czy SoapUI przykładowy kod SOAP Envelope z dokum. ZUS-u (login,hasło,nip daję moje) to dostaję odp. 0 - SUKCES.
Gdy zniekształcę któryś z parametrów to dostaję odpowiedź, że są błędne, więc nie jest to sprawa np. formatu daty.
Jakieś sugestie?
Jak podejrzeć request idący do serwisu ZUS (gotowy soap envelope, https)?

A.B.

1

Jak podejrzeć request idący do serwisu ZUS (gotowy soap envelope, https)?

Próbowałeś Fiddler? Da się go wpiąć jako proxy z deszyfrowaniem HTTPS man-in-the-middle.

0

dzięki za sugestię, byłem przekonany i ktoś inny mnie w tym utwierdzał, że https nie można podejrzeć.

request jest bardziej rozbudowany niż ten wysyłany z postmana,
mój header zawiera m.in. atrybut mustUnderstand="1",
z postmana jest taki, jaki wklejam z dokumentacji ZUS
z mojego programu widzę odpowiedź:

   <SOAP-ENV:Fault>
    <SOAP-ENV:Code><SOAP-ENV:Value>SOAP-ENV:MustUnderstand</SOAP-ENV:Value></SOAP-ENV:Code>
    <SOAP-ENV:Reason>
    <SOAP-ENV:Text xml:lang="">[ISS.0088.9117] One or more header entries were not understood by the SOAP processor</SOAP-ENV:Text>
    </SOAP-ENV:Reason>
    <SOAP-ENV:Role>http://pue.zus.pl:8500/ws/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla/zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port</SOAP-ENV:Role>
   </SOAP-ENV:Fault>

muszę się pozbyć tego atrybutu

0

@niemand: Z góry przepraszam za odkopanie tematu, ale tworząc klienta dla zla również otrzymałem komunikat "ISS.0088.917 One or more entries header were not understood by SOAP processor", czy problem udało Ci się rozwiązać?

0

@Maa-jin: Zacząłem szukać w googlach rozwiązania, jak pozbyć się niechcianych atrybutów z nagłówka i znalazłem radę, że prościej jest napisać samemu takiego requesta i tak zrobiłem.
W dokumentacji PDF jest przykład takiego żądania - bardzo prosty.

0

@niemand: Możesz podesłać jakiś przykład? Korzystając z pliku wystawionego przez ZUS https://bip.zus.pl/documents/493361/0/e-ZLA+Instrukcja+skorzystania+z++usługi+do+rapotów+dla+płatnika.pdf/25964652-2ad6-af1b-71fc-a5f49e6d3875

widzę jedynie metody typu Respond, przypuszczalnie metoda pobierzRaport działa jak swojego rodzaju trigger, ale właśnie przy jej wywołaniu wyskakuje błąd.

1

@Maa-jin: Z PDF-a ZUS:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:zus="http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla">
<soapenv:Header/>
<soapenv:Body>
<zus:PobierzRaporty>
<login>[email protected]</login>
<haslo>Haslo_123!</haslo>
<nip>1112223344</nip>
<dataOd>2018-09-01</dataOd>
</zus:PobierzRaporty>
</soapenv:Body>
</soapenv:Envelope>
0

@niemand:



                string url = "https://pue.zus.pl:8500/ws/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla/zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port";
                EndpointAddress endpointAddress = new EndpointAddress(url);
                WSHttpBinding Binding = new WSHttpBinding();
                Binding.Security.Mode = SecurityMode.Transport;
                Binding.MessageEncoding = WSMessageEncoding.Text;
                Binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                ServiceReference.wsdlPlatnikRaportyZla_PortTypeClient client = new ServiceReference.wsdlPlatnikRaportyZla_PortTypeClient();

                client.Endpoint.Binding = Binding;
                client.Endpoint.Address = endpointAddress;

                ServiceReference.Raport[] raporty;
                string opis;

                client.ClientCredentials.UserName.UserName = "b2b_platnik_raporty_zla";
                client.ClientCredentials.UserName.Password = "b2b_platnik_raporty_zla";

                client.pobierzRaporty(DateTime.Parse("2021-04-01"), "jan.kowalski@*******.pl", "hasloJanaK!", "1234567890", out opis, out raporty);

Korzystam z kodu jak powyżej.
Korzystając jedynie z metody pobierzRaport(datetime, login, haslo, nip, out opis, out raport) zwraca mi następujący błąd:
"Żądanie protokołu HTTP nie jest autoryzowane na podstawie schematu uwierzytelniania klienta „Anonymous”. Nagłówek uwierzytelnienia otrzymany z serwera to „Basic realm="Integration Server"”. ---> System.Net.WebException: Serwer zdalny zwrócił błąd: (401) Bez autoryzacji."

Loguję się oczywiście danymi uzyskanymi z zus.

0

@Maa-jin: Nie korzystam z Wsdl-a tylko sklecam request jako stringa (oczywiście bardziej elegancko było by jako xml-a) i standardowy HttpClient.

envlp = "<soapenv:Envelope xmlns:soapenv=" + chr34 + "http://schemas.xmlsoap.org/soap/envelope/" + chr34 +
                   " xmlns:zus=" + chr34 + "http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla" + chr34 + " >" +
                   "<soapenv:Header/><soapenv:Body><zus:PobierzRaporty><login>" + this.soapLogin + "</login>" +
                   "<haslo>" + this.soapPwd + "</haslo><nip>" + this.soapNip + "</nip><dataOd>" + this.soapDataOd + "</dataOd>" +
                   "</zus:PobierzRaporty></soapenv:Body></soapenv:Envelope>";
 i potem :
using (var client = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip }) { Timeout = new TimeSpan(0, 5, 0) })
........
var request = new HttpRequestMessage()
request.Content = new StringContent(envlp, Encoding.UTF8, "text/xml");
.................
HttpResponseMessage response = client.SendAsync(request).Result;
0

@niemand: No, ok jakoś to działa ale pytanie czy wiadomo dlaczego, mimo, że ZUS udostępnia wsdl-kę, to na jej podstawie nie można zrobić działającego klienta?
Dla mnie to bardzo dziwna sytuacja a korzystanie w tej sytuacji z HttpClient-a jest trochę na wyrost.

1

@Maa-jin: Wg tego co pisałem 2 lata temu problemem jest atrybut mustUnderstand="1".
Kiedy wysyłałem requesta Postmanem (wg dokumentacji ZUS) było OK, ręcznie tworzony request też jest OK. Ja bym więc uważał, że to raczej z generowaniem metod przez VS na podstawie WSDL-a jest coś nie tak - generuje defaultowo jakieś niepotrzebne atrybuty. Tu przydał by się komentarz kogoś kto robił to z WSDL-a w innym narzędziu (Delphi, Java?)

0

@niemand: Dzięki za sugestię, sprawdziłem na innym VS i na wersji 2017 w projekcie .Net Core 2.1 wszystko działa poprawnie :).

Tylko teraz pojawia się pytanie, dlaczego metoda PobierzRaport nie zwraca mi raportu?

Ok, już wszystko wiem :), raport nie był zwracany ponieważ nie został wygenerowany w PUE.

0

Witam,

Ja również próbuję przez postmana wygenerować raport na podstawie dokumentacji udostępnionej przez ZUS i przykładowym użytkowniku. Dostaję jednak w wyniku błąd....

[ISS.0088.9166] Binder not found for soapAction = null

screenshot-20211118132416.png

screenshot-20211118132500.png

Możecie mi Panowie pomóc, co robię źle?

Z góry dziękuję.

0

Ja niestety rzadko korzystam z postman-a, zazwyczaj gdy aplikacja nie zwraca mi odpowiedzi.
Niemniej jeśli wprowadzasz wartość "data od" późniejszą niż 30 dni wstecz to ten webservice zwraca błąd, więc w tym wypadku to może stanowić problem.

0
mkli07 napisał(a):

Witam,

Ja również próbuję przez postmana wygenerować raport na podstawie dokumentacji udostępnionej przez ZUS i przykładowym użytkowniku. Dostaję jednak w wyniku błąd....

[ISS.0088.9166] Binder not found for soapAction = null

screenshot-20211118132416.png

screenshot-20211118132500.png

Możecie mi Panowie pomóc, co robię źle?

Z góry dziękuję.

@mkli07: Udało Ci się zdiagnozować problem? Mam dokładnie ten sam błąd.

0
crespoMarcin napisał(a):
mkli07 napisał(a):

Witam,

Ja również próbuję przez postmana wygenerować raport na podstawie dokumentacji udostępnionej przez ZUS i przykładowym użytkowniku. Dostaję jednak w wyniku błąd....

[ISS.0088.9166] Binder not found for soapAction = null

screenshot-20211118132416.png

screenshot-20211118132500.png

Możecie mi Panowie pomóc, co robię źle?

Z góry dziękuję.

@mkli07: Udało Ci się zdiagnozować problem? Mam dokładnie ten sam błąd.

Łukasz, a ja u siebie zapomniałem dodać
httpRequest.Headers["SOAPAction"] = "zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Binder_pobierzRaporty";

Próbowaliście te pliki rozpakować? Mam problem z zapisaniem do formatu zip, cały czas błędny format.

0

Panowie, mam pytanie, plik po zapisaniu dodaje w bloku <zawartosc> za każdym wierszem znaki & # xd;
Testowałem w n++, wyrzuciłem te znaki, uruchomiłem wtyczkę mime tools >> base64 decode i plik można odpakować w winzipie.
Próbowałem to samo wykonać w skrypcie, ale cały czas dostaję błąd związany z błędnym formatem.
System.FormatException: 'The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters
@niemand: @Maa-jin podpowiecie?

        var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
        using (FileStream output = File.OpenWrite(@"C:\!RaportyEZLA\decodedFile.zip"))
        using (Stream input = httpResponse.GetResponseStream())
        {
            input.CopyTo(output);
        }
        
        string text = File.ReadAllText(@"C:\!RaportyEZLA\decodedFile.zip");
        text = text.Replace("&#xd;", "").Replace("\n", ""); 
        File.WriteAllText(@"C:\!RaportyEZLA\decodedFile.zip", text);

        var decodeFile = Base64Decode(text);

    }
    public static string Base64Decode(string base64EncodedData)
    {
        var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
        return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
    }
0

Czy ktoś z Państwa zechciałby pomóc (odpłatnie) w utworzeniu kodu w vb.net, który by pobrał z ZUS to dziadostwo?

1 użytkowników online, w tym zalogowanych: 0, gości: 1