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
$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:
class SoapClientGUS extends \SoapClient {
public function __doRequest($req, $location, $action, $version = SOAP_1_2) {
$location = "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc"; // o tej linii w dalszej części wątku
$response = parent::__doRequest($req, $location, $action, $version);
//odpowiedź z serwera GUS musimy pozbawić innych elementów, pozostawiając jedynie kopertę SOAP w XML
preg_match("/<s:Envelope.*<\/s:Envelope>/s", $response, $matches); //szybkie, niekoniecznie optymalne return $matches[0];
}
}
3. Serwer GUS wymaga, aby dodać do zapytania XML dwa nagłówki:
$soap = new SoapClientGUS("https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd", $options);
$header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', URL_WYBRANEJ_MEDOTY, 0);
$header[]= new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc", 0);
$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ć:
$result = $soap->Zaloguj(array('pKluczUzytkownika'=>'aaaaaaaaaaaaaaaaaaaa'));
//identyfikator sesji powinien się znaleźć w
echo $result->ZalogujResult;
5. Po zalogowaniu (otrzymaniu identyfikatora sesji), należy ten identyfikator dodawać do każdego następnego zapytania:
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.
$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