Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP + SOAP
Forum PHP.pl > Forum > PHP
gerffi
Witam, mam problem z uruchomieniem SOAP w PHP..
Próbując wywołać metodę dostaję błąd:
Fatal error: Uncaught SoapFault exception: [HTTP] Internal Server Error

wywołuję metodę Zaloguj
- logowanie udane- zwracany jest 20 znakowy identyfikator sesji
- logowanie nieudane- zwracany jest pusty ciąg

tak samo dzieje się przy PobierzCaptcha;
- jeśli wymagane jest wprowadzenie kodu - obrazek 5 znakowego ciągu, liter i cyfr, zakodowany w formacie BASE64
- jeśli niewymagane jest wprowadzenie kodu
- pusty ciąg , jeśli wygasła sesja - ciąg „-1”

Mój kod:
  1. $client = new SoapClient('https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd',
  2. "encoding"=>"UTF-8",
  3. "exceptions" => 1,
  4. "soap_version" => SOAP_1_2
  5. )
  6. );
  7.  
  8. $test = $client->Zaloguj('sapodasdpadsad');
  9. print $rest;

Może ktoś pomoże, bo walczę dwa dni i stoję w miejscu ....
morthan
Polecam do HEADERA dodać:
  1. "trace" => TRUE,


i poczytać o

http://php.net/manual/pl/soapclient.call.php

W razie pytań CALL ME wink.gif
gerffi
Cytat(morthan @ 4.03.2015, 14:30:11 ) *
Polecam do HEADERA dodać:
  1. "trace" => TRUE,


i poczytać o

http://php.net/manual/pl/soapclient.call.php

W razie pytań CALL ME wink.gif

Dodane i to samo...
Pyton_000
Jakiś problem z serwerem API
gerffi
Cytat(Pyton_000 @ 4.03.2015, 16:11:28 ) *
Jakiś problem z serwerem API

Raczej nie smile.gif Bo to serwer GUSu...
Pyton_000
No to tym bardziej tongue.gif
gerffi
Cytat(Pyton_000 @ 4.03.2015, 16:21:23 ) *
No to tym bardziej tongue.gif

HE he smile.gif nie no dzwoniłem do nich i zapewniają że działa poprawnie.
Pyton_000
Błąd jednak wskazuje na problem serwera, więc poproś ich o jakiś przykładowy kod czy coś.
gerffi
Cytat(Pyton_000 @ 4.03.2015, 16:45:43 ) *
Błąd jednak wskazuje na problem serwera, więc poproś ich o jakiś przykładowy kod czy coś.

Raczej nie podeślą przykładu w PHPie.. Bo serwer SOAP jest na Windows więc przykład jak coś podeślą pewnie w ASP. Jedynie co mi podesłali to przykładowe żadanie:

  1. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
  2. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  3. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action>
  4. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  5. </soap:Header>
  6. <soap:Body>
  7. <ns:Zaloguj>
  8. <!--Optional:-->
  9. <ns:pKluczUzytkownika>tutaj kluczużytkownika...</ns:pKluczUzytkownika>
  10. </ns:Zaloguj>
  11. </soap:Body>
  12. </soap:Envelope>
Pyton_000
Ja nadal twierdzę że coś jest nie tak po Ich stronie wink.gif

Ew. potrzebne są jakieś dane autentykacyjne które trzeba podać przy każdym requeście.
gerffi
Nie dane auth nie są wymagane.. Metody bez problemu mogę odczytać jakie są w tym soap..
Pyton_000
Niech podeślą przykład wywołania Zaloguj
gerffi
Raczej gotowego przykładu w PHP mi nie podeślą ;-)
Pyton_000
Jakikolwiek może być nawet w Assemblerze wink.gif
gerffi
he he smile.gif
Pawel1074809
Witaj,

jak odpytasz
$client = new SoapClient('https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd');
$client->__doRequest($xml, 'https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc', 'Zaloguj', 2);

to otrzymasz kod sesji.
Potem ten kod sesji musisz dokładać do nagłówka HTTP przy następnych żądaniach.

Ja aktualnie utknąłem nad strukturą XML PobierzCaptcha - dwie pokazane w dokumentacji przykładowej działają a ta wywala mi błędy składni.


Posiada ktoś może gotową strukturę XML dla następnego kroku - czyli metody PobierzCaptcha ?
Olbrych
Witam.

Mam ten sam problem. Czy jest rozwiązanie na komuniakcje z tym API. U mnie nawet nie działa zaloguj. Pytanie w $xml podajesz to przykłądowe wywołanie z dokumentacji ?
mkola
Witam!

Czy udało się komuś z tą usługą faktycznie połączyć? U mnie nieustannie jest: Internal Server Error
  1. <?php
  2. try {
  3. $serviceUrl = 'https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd';
  4. $client = new SoapClient($serviceUrl, array('soap_version' => SOAP_1_2, 'trace' => true, 'style' => SOAP_DOCUMENT));
  5. $client->Zaloguj(array('pKluczUzytkownika' => 'moj_klucz'));
  6. } catch (SoapFault $fault) {
  7. trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
  8. }
  9.  
  10.  
  11.  
Pyton_000
Trzaśnij coś takiego:
  1. $client->__doRequest('<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
  2. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  3. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action>
  4. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  5. </soap:Header>
  6. <soap:Body>
  7. <ns:Zaloguj>
  8. <!--Optional:-->
  9. <ns:pKluczUzytkownika>aaaaaabbbbbcccccdddd</ns:pKluczUzytkownika>
  10. </ns:Zaloguj>
  11. </soap:Body>
  12. </soap:Envelope>', 'https://Wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc', 'http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj', SOAP_1_2);
mkola
Cytat(Pyton_000 @ 13.05.2015, 12:44:47 ) *
Trzaśnij coś takiego


Trzasnąłem smile.gif
Dzięki, byłem tak blisko a jednocześnie tak daleko! smile.gif
extreme-dh
Witam wszystkich.
Niemożliwe że nie potrafią napisać porządnej dokumentacji (albo nawet porządnego API) bo widać że każdy ma z tym cholerstwem problem.
Ale do rzeczy, ja również się z tym bujam. Logowanie udało się prawidłowo, dostaję token, ale już pobieranie Captcha nie działa jak powinno.
Moje zapytanie wygląda tak, ktoś ma pomysł co moze być nie tak?

Kod
POST /wsBIR/UslugaBIRzewnPubl.svc HTTP/1.1
Host: wyszukiwarkaregontest.stat.gov.pl
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.4.32
Content-Type: application/soap+xml; charset=utf-8; action="http://CIS/BIR/2014/07/IUslugaBIR/PobierzCaptcha"
Content-Length: 437
Sid: 4p9p2g6d4f7v3f8t4c2r

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://CIS/BIR/2014/07" xmlns:ns2="http://www.w3.org/2005/08/addressing">
  3. <env:Header>
  4. <ns2:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/PobierzCaptcha</ns2:Action>
  5. <ns2:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</ns2:To>
  6. </env:Header>
  7. <env:Body>
  8. <ns1:PobierzCaptcha/>
  9. </env:Body>
  10. </env:Envelope>

Response
Kod
HTTP/1.1 500 Internal Server Error
Connection: Keep-Alive
Content-Length: 941
Date: Mon, 18 May 2015 18:39:13 GMT
Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:68818fb7-ddb6-4368-8c77-d9b40e1eea29+id=114";start-info="application/soap+xml"
Server: Microsoft-IIS/7.5
Cache-Control: private
X-AspNet-Version: 2.0.50727
MIME-Version: 1.0
X-Powered-By: ASP.NET


PS.
Podejrzane wydaje mi się action w nagłówku http "http://CIS/BIR/2014/07/IUslugaBIR/PobierzCaptcha", adres jest nieco inny niż przy metodzie Zaloguj

Przy okazji, wie ktoś moze jaki jest adres produkcyjnego wsdl?
https://wyszukiwarkaregon.stat.gov.pl/wsBIR...BIRzewnPubl.xsd nie działa
mkola
Również utknąłem na pobieraniu niemniej temat rozwojowy więc dzielę się tym, co z GUSu niemal siłą wyszarpałem wink.gif
  1. <!-- Metody uslugi sieciowej BIR1 (alfabetycznie) -->
  2.  
  3. <!-- DaneKomunikat ------------------------------------------------------------->
  4. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
  5. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  6. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneKomunikat</wsa:Action>
  7. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  8. </soap:Header>
  9. <soap:Body>
  10. <ns:DaneKomunikat/>
  11. </soap:Body>
  12. </soap:Envelope>
  13. <!-- DanePobierzPelnyRaport ------------------------------------------------------------->
  14. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
  15. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  16. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DanePobierzPelnyRaport</wsa:Action>
  17. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  18. </soap:Header>
  19. <soap:Body>
  20. <ns:DanePobierzPelnyRaport>
  21. <ns:pRegon>000331501</ns:pRegon>
  22. <ns:pNazwaRaportu>PublDaneRaportPrawna</ns:pNazwaRaportu>
  23. </ns:DanePobierzPelnyRaport>
  24. </soap:Body>
  25. </soap:Envelope>
  26. <!-- DaneSzukaj ------------------------------------------------------------->
  27. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07" xmlns:dat="http://CIS/BIR/PUBL/2014/07/DataContract">
  28. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  29. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukaj</wsa:Action>
  30. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  31. </soap:Header>
  32. <soap:Body>
  33. <ns:DaneSzukaj>
  34. <ns:pParametryWyszukiwania>
  35. <!--Optional:-->
  36. <dat:Krs></dat:Krs>
  37. <!--Optional:-->
  38. <dat:Krsy></dat:Krsy>
  39. <!--Optional:-->
  40. <dat:Nip></dat:Nip>
  41. <!--Optional:-->
  42. <dat:Nipy></dat:Nipy>
  43. <!--Optional:-->
  44. <dat:Regon>142396858</dat:Regon>
  45. <!--Optional:-->
  46. <dat:Regony14zn></dat:Regony14zn>
  47. <!--Optional:-->
  48. <dat:Regony9zn></dat:Regony9zn>
  49. </ns:pParametryWyszukiwania>
  50. </ns:DaneSzukaj>
  51. </soap:Body>
  52. </soap:Envelope>
  53. <!-- GetValue ------------------------------------------------------------->
  54. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/2014/07">
  55. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  56. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/GetValue</wsa:Action>
  57. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  58. </soap:Header>
  59. <soap:Body>
  60. <ns:GetValue>
  61. <ns:pNazwaParametru>StatusUslugi</ns:pNazwaParametru>
  62. </ns:GetValue>
  63. </soap:Body>
  64. </soap:Envelope>
  65. <!-- PobierzCaptcha ------------------------------------------------------------->
  66. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/2014/07">
  67. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  68. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/PobierzCaptcha</wsa:Action>
  69. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  70. </soap:Header>
  71. <soap:Body>
  72. <ns:PobierzCaptcha/>
  73. </soap:Body>
  74. </soap:Envelope>
  75. <!-- SprawdzCaptcha ------------------------------------------------------------->
  76. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/2014/07">
  77. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  78. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/SprawdzCaptcha</wsa:Action>
  79. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  80. </soap:Header>
  81. <soap:Body>
  82. <ns:SprawdzCaptcha>
  83. <ns:pCaptcha>aaaaa</ns:pCaptcha>
  84. </ns:SprawdzCaptcha>
  85. </soap:Body>
  86. </soap:Envelope>
  87. <!-- Wyloguj ------------------------------------------------------------->
  88. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
  89. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  90. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Wyloguj</wsa:Action>
  91. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  92. </soap:Header>
  93. <soap:Body>
  94. <ns:Wyloguj>
  95. <ns:pIdentyfikatorSesji>k4r3h2y8r6w5h4d4n7d4</ns:pIdentyfikatorSesji>
  96. </ns:Wyloguj>
  97. </soap:Body>
  98. </soap:Envelope>
  99. <!-- Zaloguj ------------------------------------------------------------->
  100. <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
  101. <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
  102. <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action>
  103. <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
  104. </soap:Header>
  105. <soap:Body>
  106. <ns:Zaloguj>
  107. <ns:pKluczUzytkownika>theUsersKey</ns:pKluczUzytkownika>
  108. </ns:Zaloguj>
  109. </soap:Body>
  110. </soap:Envelope>
  111. <!-- ------------------------------------------------------------->
ikario
Witam,
po wielu bojach, udało mi się przedrzeć przez API GUS, z wykorzystaniem podstawowych metod klasy SoapClient. Gdyby ktoś był zainteresowany takim rozwiązaniem, bez wchodzenia w CURLe i inne niskopoziomowe __doRequest() z zabawą w tworzenie całych zapytań XML, to (pozwolę sobie również podsumować wcześniejsze spostrzeżenia w tym wątku):

1. Internal Server Error otrzymujemy, kiedy stosujemy domyślną wersję SOAP 1.1, należy zmienić ją koniecznie na SOAP 1.2

  1. $options['soap_version'] = SOAP_1_2;


2. Wyjątek pt. "looks like we got no XML document" związany jest z faktem, że SoapClient nie jest na tyle elastyczny, aby przetworzyć odpowiedź wygenerowaną przez server SOAP GUS, zawierającą dodatkowe dane (nagłówki). Konieczne jest więc niestety stworzenie własnej klasy dziedziczącej po SoapClient, nadpisującej metodę __doRequest(), wyciągającej do przetworzenia sam kod XML:
  1. class SoapClientGUS extends \SoapClient {
  2. public function __doRequest($req, $location, $action, $version = SOAP_1_2) {
  3. $location = "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc"; // o tej linii w dalszej części wątku
  4. $response = parent::__doRequest($req, $location, $action, $version);
  5. //odpowiedź z serwera GUS musimy pozbawić innych elementów, pozostawiając jedynie kopertę SOAP w XML
  6. $matches = array();
  7. preg_match("/<s:Envelope.*<\/s:Envelope>/s", $response, $matches); //szybkie, niekoniecznie optymalne
  8. return $matches[0];
  9. }
  10. }


3. Serwer GUS wymaga, aby dodać do zapytania XML dwa nagłówki:
  1. $soap = new SoapClientGUS("https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd", $options);
  2. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', URL_WYBRANEJ_MEDOTY, 0);
  3. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc", 0);
  4. $soap->__setSoapHeaders($header);

URL_WYBRANEJ_MEDOTY (np. http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj) można pobrać i sparsować XML z pliku WSDL lub zdefiniować na stałe dzięki uprzejmości kolegi mkola, post 22 (niestety, nie każda metoda ma ten sam początek adresu http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/).

4. Z tak skonstruowanym zapytaniem, możemy śmiało się logować:
  1. $result = $soap->Zaloguj(array('pKluczUzytkownika'=>'aaaaaaaaaaaaaaaaaaaa'));
  2.  
  3. //identyfikator sesji powinien się znaleźć w
  4. echo $result->ZalogujResult;


5. Po zalogowaniu (otrzymaniu identyfikatora sesji), należy ten identyfikator dodawać do każdego następnego zapytania:
  1. $options['stream_context'] = stream_context_create(array('http' => array('header' => 'sid: '.$otrzymanyIdentyfikatorSesji)));


6. Przejście na środowisko produkcyjne. Na dzień dzisiejszy, przy przejściu na środowisko produkcyjne, zmienia się klucz użytkownika oraz adres usługi, nie zmienia się natomiast adres pliku WSDL. Dodatkowo, klient SoapClient, bez względu na powyżej wprowadzone parametry, nadal pobiera adres usługi z pliku WSDL (a więc testowy). Skutkiem takiego stanu rzeczy będzie błąd autoryzacji, jako że klient będzie łączył się z usługą testową z wykorzystaniem klucza produkcyjnego. Dlatego też konieczne jest "brutalne" nadpisanie parametru adresu usługi w naszej klasie dziedziczącej.
  1. $location = "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc"; //po przejściu na środowisko produkcyjne zmieniamy zawartość tego parametru na adres otrzymany od konsultantów GUS
Pyton_000
Tak jakby nie dało się zrobić normalnego API RESTfull wink.gif
a_kawecki
Witam,

Skorzystałem z porad i udało mi się poprawnie zalogować.
Jednak mam problem z wykonaniem kolejnych operacji np. pobranie danych o statusie.

  1. class SoapClientGUS extends \SoapClient {
  2. public function __doRequest($req, $location, $action, $version = SOAP_1_2) {
  3. $location = "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc";
  4. $response = parent::__doRequest($req, $location, $action, $version);
  5. $matches = array();
  6. preg_match("/<s:Envelope.*<\/s:Envelope>/s", $response, $matches);
  7. return $matches[0];
  8. }
  9. }
  10.  
  11. $contextOptions = array('http' => array('header' => 'sid: 2c2d7d3s7c7t5h2n2k4b'));
  12. $stream_context = stream_context_create($contextOptions);
  13.  
  14.  
  15. $soap = new SoapClientGUS("https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd", array('stream_context' => $stream_context, 'soap_version'=>SOAP_1_2));
  16. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', "http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/GetValue", 0);
  17. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc", 0);
  18. $soap->__setSoapHeaders($header);
  19.  
  20. $result = $soap->GetValue(array('pNazwaParametru'=>'StatusUslugi'));
  21. echo $result->GetValueResponse;


Zapytanie zwraca błąd

  1. Notice: Undefined offset: 0 in E:\baza\htdocs\testy\gus_captcha.php on line 12
  2.  
  3. Fatal error: Uncaught SoapFault exception: [HTTP] Internal Server Error in E:\baza\htdocs\testy\gus_captcha.php:9 Stack trace: #0 E:\baza\htdocs\testy\gus_captcha.php(9): SoapClient->__doRequest('<?xml version="...', 'https://wyszuki...', 'http://CIS/BIR/...', 2) #1 [internal function]: SoapClientGUS->__doRequest('<?xml version="...', 'https://wyszuki...', 'http://CIS/BIR/...', 2, 0) #2 E:\baza\htdocs\testy\gus_captcha.php(25): SoapClient->__call('GetValue', Array) #3 E:\baza\htdocs\testy\gus_captcha.php(25): SoapClientGUS->GetValue(Array) #4 {main} thrown in E:\baza\htdocs\testy\gus_captcha.php on line 9


Prośba o jakieś wskazówki.

Pozdrawiam,
ikario
Witam,
z góry przepraszam, popełniłem gafę w moim poście pisząc, że można pobrać adresy URL metod z postu #22. Jak przyjrzałem się teraz głębiej, okazuje się, że właściwy plik WSDL zawiera inne adresy tych metod, i tak dla przykładu właśnie GetValue ma adres http://CIS/BIR/2014/07/IUslugaBIR/GetValue, a nie tak jak kolega wprowadził w swoim kodzie http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/GetValue. To tak na szybko, pierwszy wykryty błąd.
a_kawecki
Witam,

Dziękuję za szybką odpowiedź.

Faktycznie po zmianie adresu i małej poprawce w zwracanej wartości, zaczęło działać.
Powoli zacznę wszystko zbierać w całość i podrzucę na forum.

Pozdrawiam,

  1. class SoapClientGUS extends \SoapClient {
  2. public function __doRequest($req, $location, $action, $version = SOAP_1_2) {
  3. $location = "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc";
  4. $response = parent::__doRequest($req, $location, $action, $version);
  5. $matches = array();
  6. preg_match("/<s:Envelope.*<\/s:Envelope>/s", $response, $matches);
  7. return $matches[0];
  8. }
  9. }
  10.  
  11. $contextOptions = array('http' => array('header' => 'sid: '.$sesja));
  12. $stream_context = stream_context_create($contextOptions);
  13.  
  14.  
  15. $soap = new SoapClientGUS("https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd", array('stream_context' => $stream_context, 'soap_version'=>SOAP_1_2));
  16. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', "http://CIS/BIR/2014/07/IUslugaBIR/GetValue", 0);
  17. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc", 0);
  18. $soap->__setSoapHeaders($header);
  19.  
  20. $result = $soap->GetValue(array('pNazwaParametru'=>'StatusSesji'));
  21.  
  22. echo $result->GetValueResult;
denis95x
Czy udalo się komuś z tym poradzić w końcu ?
deomike
Z tego co wiem to w lipcu 2016r. API do GUS znowu uległo zmianie.... Szczegóły opisali w dokumentacji, ale jak tak dalej pójedzie, to raz na pół roku trzeba będzie grzebać w kodzie żeby dostosować się do wprowadzanych przez nich zmian.. sad.gif
Na github.com albo sourceforge.com masz gotowe, darmowe biblioteki, które umożliwiają wykorzystanie GUS API, np:
https://sourceforge.net/projects/nip24-pl-gus-api/files/

Z tego co widzę to są na bieżąco aktualizowane.
kitaboy
Dzień Dobry!

Potrzebuję na mojej stronie skorzystać z wyszukiwarki danych z GUS po NIP-ie i gdy podany nip będzie prawidłowy uzupełni mi pola tekstowe takie jak Nip, Kod-pocztowy, miasto itp. Potrzebuję jakiegoś kodu php, żebym miał się na czym wzorować.

Z poważaniem.
margdoc
Witam,

Próbuję się dostać do testowych danych GUS i wygląda to tak: udaje mi się zalogować (dostaję identyfikator sesji), ale nie potrafię wyciągnąć nic, co wymaga podania tego identyfikatora.
Jeśli zapytam przez GetValue o KomunikatUslugi lub StatusUslugi - dostaję odpowiedź (usługa dostepna). Ale te parametry nie wymagają podania sid.
Kiedy pytam o StatusSesji - dostaję 0 (czyli wg instrukcji "sesja nie istnieje").
Wygląda to tak, jakbym nie podawał prawidłowo identyfikatora, chociaż wszystko robiłem na podstawie Waszych postów:

  1. $options['soap_version'] = SOAP_1_2;
  2. //tu klasa SoapClientGUS i logowanie
  3. //...
  4. $options['stream_context'] = stream_context_create(array('http' => array('header' => 'sid: '.$otrzymanyIdentyfikatorSesji)));
  5.  
  6. $soap = new SoapClientGUS("https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd", $options);
  7. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', "http://CIS/BIR/2014/07/IUslugaBIR/GetValue", 0);
  8. $header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc", 0);
  9. $soap->__setSoapHeaders($header);
  10.  
  11. $result = $soap->GetValue(array('pNazwaParametru'=>'StatusSesji'));
  12.  
  13. echo $result->GetValueResult;


Może czegoś tu jednak brakuje? Czegoś, co jest dla Was oczywiste? smile.gif

Zajec
Odgrzebuję ten stary temat, bo to jedyne miejsce gdzie znalazłem dyskusję i pomocne informacje na temat używania SoapClient do komunikacji z REGON API. Korzystając z powyższych doświadczeń napisałem swoją klasę rozszerzającą SoapClient.

Zalety:
  1. Domyślnie wybiera SOAP 1.2
  2. Obchodzi problem braku obsługi Multipart messages
  3. Automatycznie dodaje nagłówki WS-Address bez potrzeby ręcznego podawania URL
  4. Pozwala na wygodne dodanie sid (identyfikatora sesji) po zalogowaniu


  1. // SPDX-License-Identifier: Unlicense
  2. class SoapClientGUS extends \SoapClient {
  3. protected $stream;
  4.  
  5. function __construct(?string $wsdl, array $options = [])
  6. {
  7. $this->stream = stream_context_create();
  8.  
  9. $options = array_merge([
  10. // Use SOAP 1.2 to avoid: Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'multipart/related; type="application/xop+xml"'.
  11. 'soap_version' => SOAP_1_2,
  12. // Custom stream to allow adding HTTP headers
  13. 'stream_context' => $this->stream,
  14. ], $options);
  15.  
  16. return parent::__construct($wsdl, $options);
  17. }
  18.  
  19. public function __doRequest($request, $location, $action, $version, $one_way = null)
  20. {
  21. // GUS requires WS-Addressing
  22. $dom = new DomDocument('1.0');
  23. $dom->loadXML($request);
  24. $header = $dom->createElementNS('http://www.w3.org/2003/05/soap-envelope', 'Header');
  25. $header->appendChild($dom->createElementNS('http://www.w3.org/2005/08/addressing', 'Action', $action));
  26. $header->appendChild($dom->createElementNS('http://www.w3.org/2005/08/addressing', 'To', $location));
  27. $dom->documentElement->insertBefore($header, $dom->documentElement->firstChild);
  28. $request = $dom->saveXML();
  29.  
  30. $response = parent::__doRequest($request, $location, $action, $version);
  31.  
  32. // Get just an XML from the multipart message response (SoapClient doesn't support it)
  33. return preg_replace('/.*\n(<.*>).*/s', '\1', $response);
  34. }
  35.  
  36. public function __setSid($sid)
  37. {
  38. stream_context_set_option($this->stream, [
  39. 'http' => [
  40. 'header' => 'sid: '. $sid,
  41. ]
  42. ]);
  43. }
  44. }


Do tego dosyć kompletny przykład użycia:

  1. // SPDX-License-Identifier: Unlicense
  2. define('GUS_REGON_WSDL', 'https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-test.wsdl');
  3. define('GUS_REGON_KEY', 'abcde12345abcde12345');
  4.  
  5. //define('GUS_REGON_WSDL', 'https://wyszukiwarkaregon.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl-ver11-prod.wsdl');
  6. //define('GUS_REGON_KEY', 'putyoursecretkeyhere');
  7.  
  8. try {
  9. $gus = new SoapClientGUS(GUS_REGON_WSDL);
  10.  
  11. /* Sign in */
  12.  
  13. $result = $gus->Zaloguj([
  14. 'pKluczUzytkownika' => GUS_REGON_KEY,
  15. ]);
  16. if (empty($result->ZalogujResult)) {
  17. throw new Exception('Failed to login');
  18. }
  19.  
  20. $sid = $result->ZalogujResult;
  21. $gus->__setSid($result->ZalogujResult);
  22.  
  23. /* Search */
  24.  
  25. $result = $gus->DaneSzukajPodmioty([
  26. 'pParametryWyszukiwania' => [
  27. 'Nip' => '5261040828',
  28. ],
  29. ]);
  30. var_dump($result->DaneSzukajPodmiotyResult);
  31.  
  32. /* Report */
  33.  
  34. $result = $gus->DanePobierzPelnyRaport([
  35. 'pRegon' => '000331501',
  36. ]);
  37. var_dump($result->DanePobierzPelnyRaportResult);
  38.  
  39. /* Sign out */
  40.  
  41. $result = $gus->Wyloguj([
  42. 'pIdentyfikatorSesji' => $sid,
  43. ]);
  44. } catch (Exception $e) {
  45. echo $e->getMessage();
  46. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.