Witam,
Probuje przy wykorzystaniu:
Nie zauważyłem, że założyłeś nowy wątek...
rozwiązanie tkwi chyba w samej definicji __soapCall;
zgodnie z opisem z php.net:
output_headers - If supplied, this array will be filled with the headers from the SOAP response
tylko jak to zapisać?
gdy dla kodu:
$parametry = ['credentials'=> [ ['name'=>'domain','value'=>['stringValue'=>'15']], ['name'=>'login','value'=>['stringValue'=>$user]] ], 'password'=>$pass];
$sesja = $client->login($parametry);
$sesja = $client->__soapCall('login',$parametry);
$user = 'TEST1'; $pass = 'qwerty!@#'; $parametry = ['credentials'=> [ ['name'=>'domain','value'=>['stringValue'=>'15']], ['name'=>'login','value'=>['stringValue'=>$user]] ], 'password'=>$pass]; http://www.php.net/echo 'parametry :';var_dump($parametry); http://www.php.net/echo '<br />'; $sesja = $client->login($parametry); http://www.php.net/echo 'sesja:';var_dump($sesja);echo '<br />'; http://www.php.net/echo '<br />'; $sesja = $client->__soapCall('login',http://www.php.net/array($parametry), null, null, $header); http://www.php.net/echo 'sesja2:';var_dump($sesja);echo '<br />'; http://www.php.net/echo '<br />'; http://www.php.net/var_dump($header); http://www.php.net/echo '<br />';
A rozgryzł już ktoś jak po zalogowaniu sprawdzić ubezpieczenie pacjenta?
Logowanie już opanowane:
<?php function objectToArray($d) { if (http://www.php.net/is_object($d)) { $d = get_object_vars($d); } if (http://www.php.net/is_array($d)) { return http://www.php.net/array_map(__FUNCTION__, $d); } else { return $d; } } $client=new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl'); $user = 'TEST1'; $pass = 'qwerty!@#'; $parametry = ['credentials'=> [ ['name'=>'domain','value'=>['stringValue'=>'15']], ['name'=>'login','value'=>['stringValue'=>$user]] ], 'password'=>$pass]; $sesja = $client->login($parametry); $sesja = $client->__soapCall('login',http://www.php.net/array($parametry), null, null, $header); http://www.php.net/echo 'sesja: '.$sesja.''; http://www.php.net/echo '<br />'; $array = objectToArray($header); //var_dump($array); //echo '<br />'; http://www.php.net/echo 'Session: '.$array['session']['id'].''; http://www.php.net/echo '<br />'; http://www.php.net/echo 'Token: '.$array['authToken']['id'].''; ?>
logowanie mamy ale jak się wylogować?
status_cwu sprawdzasz na innym adresie www
próbowałem:
$wylogowanie = $client->__soapCall('logout',http://www.php.net/array($header), null, null, $header2); http://www.php.net/var_dump($wylogowanie);
cześć
Też próbuję zmierzyć się z tym problemem i mam niestety cały czas problem z logowaniem.
używam:
$client=new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl');
$user = 'TEST1';
$pass = 'qwerty!@#';
$parametry = ['credentials'=>[['name'=>'domain','value'=>['stringValue'=>'15']],['name'=>'login','value'=>['stringValue'=>$user]]],'password'=>$pass];
i wyrzuca mi błąd:
Parse error: syntax error, unexpected '[' in C:\AppServ\www\victoria2\ewus.php on line 28
czyli jest to błąd w linii $parametry
jak używałam wcześniejszych wywołań z forum to za każym razem mam błąd odnośnie tego nawiasu '['
czy używa ktoś php w wersji 5.2.6? może powinnam podnieść wersję?
będę wdzięczna za jakiekolwiek sugestie
Wg mnie to jest wina starej wersji PHP. U mnie na wersji 5.4.3 nie wyrzuca tego błędu.
Na drugim serwerze mam 5.2.17 i mam taki sam błąd jak u Ciebie.
kod logowania, który skleił ostatecznie marekpulawy jest 100% działający
logout poddałem się...
próbuję dopisać do tamtego kodu
$clientBroker = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/ServiceBroker?wsdl'); $functions = $clientBroker->__getFunctions(); http://www.php.net/echo '<br />'; http://www.php.net/echo 'DOSTĘPNE FUNKCJE:'; http://www.php.net/var_export($functions); http://www.php.net/echo '<br />'; $sesjaReturn = $clientBroker->__soapCall('executeService',http://www.php.net/array($parametry), $header, null, $header2);
a co masz tym razem w zmiennej $parametry?
bo w zmiennej $header masz session i authToken?
Hym, wiem niewiele, ale wydaje mi się, że po zalogowaniu najpierw trzeba ustawić nagłówki z session id i authToken id
coś jak
$auth = ['session'=>['id'=>$array['session']['id']], 'authToken'=>['id'=>$array['authToken']['id']]];
$hd = new SoapHeader("http://xml.kamsoft.pl/ws/common", "com", $auth, false);
$return = $client->__setSoapHeaders($hd);
tylko, że to zwraca FALSE a nie TRUE - czyli coś jest nie tak
te same parametry co w przypadku logowania
$parametry = ['credentials'=> [ ['name'=>'domain','value'=>['stringValue'=>$domain]], ['name'=>'login','value'=>['stringValue'=>$login]] ], 'password'=>$password];
__soapCall('executeService',http://www.php.net/array($parametry), $header, null, $header2)
Teraz zwraca TRUE, chyba;)
$hd = [
new SoapHeader("http://xml.kamsoft.pl/ws/common", "com", ['session'=>['id'=>$array['session']['id']]], true),
new SoapHeader("http://xml.kamsoft.pl/ws/common", "com", ['authToken'=>['id'=>$array['authToken']['id']]], true),
];
$return = $client->__setSoapHeaders($hd);
if ($return == TRUE) {
echo "<br>TRUE";
}
i to działa;)
$functions = $client->__getFunctions();
var_export($functions);
$client =
Auth czy ServiceBroker?
Auth
Nie znam się, ale wydaje mi się, że teraz
$response = $client->__doRequest(
"checkCWU",
"https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/ServiceBroker?wsdl",
"executeService",
"1.0");
tylko, że to nie działa;)
var_export($response);
daje takie coś
'http://www.w3.org/2005/08/addressing/soap/faultcom.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character \'c\' (code 99) in prolog; expected \'<\' at [row,col {unknown-source}]: [1,1]
w zapytaniu checkCWU musisz przesłać pesel oraz równolegle nazwę i wersję swojego systemu
Może po
$client->__setSoapHeaders($hd);
trzeba:
$clientBroker = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/ServiceBroker?wsdl');
$response = $clientBroker->__soapCall('executeService', ['status_cwu_pyt'=>['numer_pesel'=>49091480757],['system_swiad'=>['nazwa'=>"eWUS", 'wersja'=>"2.0"]]]);
Wprawdzie wywala mi to z błędem:
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'location' property in index.php:49 Stack trace: #0 index.php(49): SoapClient->__soapCall('executeService', Array) #1 {main} thrown in index.php on line 49
ale wydaje mi się że nie podałem wszystkich parametrów jako drugi argument
$response = $clientBroker->__soapCall('executeService', ['status_cwu_pyt'=>['numer_pesel'=>49091480757],['system_swiad'=>['nazwa'=>"eWUS", 'wersja'=>"2.0"]]], null, null, $wynik);
identyczny komunikat dostaję w swoim wywołaniu
$sesjaReturn = $clientBroker->__soapCall('executeService',http://www.php.net/array($parametry), $header, null, $header2);
$response = $clientBroker->__soapCall('executeService', ['parameters'=>[ 'location'=>[ 'namespace'=>"nfz.gov.pl/ws/broker/cwu", 'localname'=>"checkCWU", 'version'=>"1.0"], 'date'=>"2008-09-12T09:37:36.406+01:00", 'payload'=>[ 'status_cwu_pyt'=>[ 'numer_pesel'=>49091480757, 'system_swiad'=>[ 'nazwa'=>"eWUS", 'wersja'=>"2.0" ] ] ] ] ] );
$parametry = ['location'=> [ ['namespace'=>'nfz.gov.pl/ws/broker/cwu'], ['localname'=>'checkCWU'], ['version'=>'1.0'] ], ['date'=>'2008-09-12T09:37:36.406+01:00'], ['payload'=>[ ['textload'=>[ 'status_cwu_pyt'=>[ ['numer_pesel'=>49091480757], ['system_swiad'=>[ ['nazwa'=>"eWUS"], ['wersja'=>"2.0"] ] ] ] ] ] ] ] ]; // $hd = [ // new SoapHeader("http://xml.kamsoft.pl/ws/common", "com", ['session'=>['id'=>$array['session']['id']]], true), // new SoapHeader("http://xml.kamsoft.pl/ws/common", "com", ['authToken'=>['id'=>$array['authToken']['id']]], true), // ]; // $sesjaReturn = $clientBroker->__soapCall('executeService',array($parametry),$hd,NULL, $header2); $sesjaReturn = $clientBroker->__soapCall('executeService',http://www.php.net/array($parametry),$header,NULL, $header2);
Udało się komuś rozgryźć temat zapytania eWUS o ubezpieczenie pacjenta?
I jeszcze jedno: czy w parametrach executeService nie należy podać session i authToken?
trzeba, trzeba... jak widzisz "powyżej" - na dwa sposoby nawet rozwiązane (bezpośrednio w zapytaniu lub definiując wcześniej header
problem - co dalej?
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'namespace' property
Może źle jest zdefiniowana ta tablica $parametry, jeśli krzyczy że jest nieprawidłowe namespace?
ja zrozumiałem, że "nie ma obiektu namespace"; za szybko czytam poprostu - to przez ten eWUŚ, rozliczenia, koniec roku itp.
tak jak pisałem - na forach innych języków programowania pisali, że używane są dwa różne namespace ale nikt nie powiedział jak go użyć prawidłowo.
Ja próbuję po zalogowaniu się takiego czegoś:
$clientBroker = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/ServiceBroker?wsdl');
// $functions = $clientBroker->__getFunctions();
// echo '<br />';
// echo 'DOSTĘPNE FUNKCJE:'; var_export($functions);
// echo '<br />';
// $sesjaReturn = $clientBroker->__soapCall('executeService',array($parametry), $header, null, $header2);
$parametry = ['location'=>
[
['namespace'=>'nfz.gov.pl/ws/broker/cwu'],
['localname'=>'checkCWU'],
['version'=>'1.0']
],
['date'=>'2008-09-12T09:37:36.406+01:00'],
['payload'=>[
['textload'=>[
'status_cwu_pyt'=>[
['numer_pesel'=>10101010101],
['system_swiad'=>[
['nazwa'=>"eWUS"],
['wersja'=>"2.0"] ]] ] ] ] ] ] ];
$sesjaReturn = $clientBroker->__soapCall('executeService',array($parametry),$header,NULL, $header2);
i zwraca mi taki komunikat:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: <message> 'executeServiceRequestMsg' already defined in C:\AppServ\www\ewus\ewus.php:43
Stack trace: #0 C:\AppServ\www\ewus\ewus.php(43): SoapClient->SoapClient('https://ewus.nf...') #1 {main} thrown in C:\AppServ\www\ewus\ewus.php on line 43
Miał ktoś coś podobnego?
ja chyba też tak miałem - na testowej błąd dublowania a na roboczej ok.
dzięki
rzeczywiście na produkcji ten błąd nie występuje
~szaitis o tagach bbcode słyszałeś? Jeśli nie to poczytaj i popraw swoje posty.
...niestety dalej problem z namespace nierozwiązany...
a wiesz jak się wylogować? co prawda po nowym zalogowaniu lub po zamknięciu przeglądarki sesja ulega zniszczeniu ale ładnie by było wylogowac się
Wiecie że to ma działać od 1 stycznia?
<?php $client = new SoapClient( 'https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/Auth?wsdl', http://www.php.net/array ( 'trace' => true )); $response = $client->login( http://www.php.net/array ( 'credentials' => http://www.php.net/array ( 'item' => http://www.php.net/array ( http://www.php.net/array( 'name' => 'domain', 'value' => http://www.php.net/array ( 'stringValue' => '06' ) ), http://www.php.net/array( 'name' => 'type', 'value' => http://www.php.net/array ( 'stringValue' => 'SWD' ) ), http://www.php.net/array( 'name' => 'idntSwd', 'value' => http://www.php.net/array ( 'stringValue' => '[identifkator]' ) ), http://www.php.net/array( 'name' => 'login', 'value' => http://www.php.net/array ( 'stringValue' => '[login]' ) ) ) ), 'password' => '[hasło]' )); http://www.php.net/print '<pre>' . http://www.php.net/print_r( $client->__getLastResponse(), true ) . '<pre>';
wiesz, logowanie to już jakiś czas temu było zrobione (patrz wcześniejsze posty). ja pytałem o logout.
tak na marginesie - skoro masz działający kod to zamiast się złościć i odsyłać do dokumentacji mógłbyś coś podpowiedzieć w trakcie naszych prób "sklecenia" kodu abyśmy i my zrozumieli...
webdice mógłbyś zdradzić jak sobie poradziłeś ze sprawdzaniem ubezpieczenia pacjenta? albo podpowiedz gdzie robimy błąd
jeszcze trzeba będzie pilnować czasu od zalogowania zgodnie z komunikatem NFZ:
Udało sie już komuś to zapytanie o ubezpieczenie napisać? czy dalej na poziomie logowania są wszyscy?
niestety, ja dalej na poziomie logowania się zatrzymałem, ale cały czas walczę. jak coś to napiszę
...ja też, niestety ograniczam próby logowania i wysyłki zapytań aby mnie weryfikator Departamentu Informatyki nie nakrył
powiem szczerze, że nie wierzę aby nikt z forumowiczów nie miał gotowego rozwiązania tylko nie chce się podzielić z innymi, trudno, wspólnymi siłami coś tam się wymyśli i na pewno to opublikujemy
Wersja "na chama" (w dodatku bez obsługi wyjątków), własciwie to nie do publikacji, ale lepsze to niż nic.
$params = http://www.php.net/array( 'credentials' => http://www.php.net/array( http://www.php.net/array('name' => 'domain', 'value' => http://www.php.net/array('stringValue' => '15')), http://www.php.net/array('name' => 'login', 'value' => http://www.php.net/array('stringValue' => $user)) ), 'password' => $pass); $clientAuth = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/Auth?wsdl', http://www.php.net/array('trace' => true)); $clientAuth->__soapCall('login', http://www.php.net/array($params), null, null, $loginHeaders); $xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://xml.kamsoft.pl/ws/common" xmlns:brok="http://xml.kamsoft.pl/ws/broker"> <soapenv:Header> <com:session id="' . $loginHeaders['session']->id . '" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/> <com:authToken id="' . $loginHeaders['authToken']->id . '" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/> </soapenv:Header> <soapenv:Body> <brok:executeService> <com:location> <com:namespace>nfz.gov.pl/ws/broker/cwu</com:namespace> <com:localname>checkCWU</com:localname> <com:version>2.0</com:version> </com:location> <brok:date>2008-09-12T09:37:36.406+01:00</brok:date> <brok:payload> <brok:textload> <ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2"> <ewus:numer_pesel>00000000000</ewus:numer_pesel> <ewus:system_swiad nazwa="eWUS" wersja="2012.07.1.0"/> </ewus:status_cwu_pyt> </brok:textload> </brok:payload> </brok:executeService> </soapenv:Body> </soapenv:Envelope>'; $clientBroker = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/ServiceBroker?wsdl', http://www.php.net/array('trace' => true, 'exceptions' => true)); $r = $clientBroker->__doRequest($xml, 'https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/ServiceBroker', 'executeService', SOAP_1_1);
jest mały błąd: </brok:stextload>
powinno być: </brok:textload>,
ale działa. Wielkie dzięki stary. Podaj adres gdzie mam piwo wysłać
Dzięki, poprawiłem, to też moze sie przydać:
$doc = new DOMDocument(); $doc->loadXML($r); $xpath = new DOMXpath($doc); $xpath->registerNamespace('odp','https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2'); $elements = $xpath->query("//odp:status_cwu"); if ($elements->length !== 1) throw new Exception('OMG'); $status = $elements->item(0)->nodeValue; http://www.php.net/echo ' Status: '.$status;
Także pozwolę sobie skorzystać i wielkie dzięki
A wie ktoś może jak się dobrać do kodu autoryzacji/id_operacji?
w odpowiedzi na zapytanie otrzymujesz string, który musisz odpowiednio podzielić, siedzę nad tym teraz, jak zrobię wrzucę tutaj
ps. dzięki wielkie gilek (z jakiegoś powodu nie mogę dodać Ci "pomógł")
Hmm... no właśnie kroję tego stringa ale kodu autoryzacji nie widzę, a z tego co wiem potrzebne to będzie do sprawozdań.
PS: Oczywiście dołączam się do podziękowań gilek
po kolei:
35 znaków to adres Brokera (nie wykorzystywany w potwierdzeniu
29 znanów to data i godzina
1 znak to status obecności nr pesel w CWU (1 - jest, 0 - nie ma)
11 znaków to nr pesel
9 znaków to nr świadczeniodawcy
2 znaki to nr NFZ
5 znaków to identyfikator operatora (czy tylko 5 znaków?)
1 znak to status potwierdzenia (1 - NFZ potwierdza, 0 - NFZ nie potwierdza)
16 znaków to data i godzina do kiedy ważne potwierdzenie
tu zaczynają się schodki -
kolejne znaki to
imię i nazwisko (ilość różna)
28 znaków to podpis? (skrót kodu autoryzacyjnego?)
kolejne znaki to kod autoryzacyjny (dla statusu ubezpieczenia 1- 172 znaki, dla 0-154)
nasuwają się pytania:
1. jak utworzyć nazwę pliku (id_operacji)?
2. czy jest jakaś inna metoda wyciągania elementów z komunikatu zwrotnego niż dzielenie stringa na "części"?
jeśli nie to imię i nazwisko trzeba odczytywać od 110 (licząc od początku) do 201 (licząc od końca) lub do 182 (licząc od końca).
Odpowiedź w zmiennej $r to jest zwykły XML, zatem można po nim wędrować za pośrednictwem XPath. W poprzednim poście pokazałem jak odwołać się do statusu, poniższy kod odwołuje sie do id_operacji. Analogicznie można pobrać wszystkie elementy.
$elements = $xpath->query("//odp:status_cwu_odp"); if ($elements->length !== 1) throw new Exception('OMG 2'); $id = $elements->item(0)->getAttribute('id_operacji');
A czy pacjent ubezpieczony czy nie jest tutaj jako 0 lub 1
$elements = $xpath->query("//odp:status_ubezp");
$status_ubezp = $elements->item(0)->nodeValue;
dokładnie
jakież to jest łatwe jak się widzi gotowe rozwiązanie...
jak mogę odczytać całego XML aby widzieć wszystkie składowe? - nie w postaci stringa tak jak do tej pory.
gilek: wielkie dzięki
ps. gdzie można nauczyć się tak programować te XML'e?
Jednym z rozwiązań jest skorzystanie z rozszerzenia DOM lub SimpleXML. Na podstawie stringa tworzone jest drzewo. Należy pamiętać, że w wynikowym XML, jest kilka przestrzeni nazw, należy jest zarejestrować, aby móc później wyszukiwać elementy do nich należące.
Przykład z DOM, jest kilka postów wstecz.
Można również dokonać transformacji poprzez XSLT do dowolnego formatu.
p.s. ja się w szkole nauczyłem, to są raczej podstawy, nie jestem wymiataczem...
Wie ktoś może skąd mogę wyłowić informacje o oznaczeniu DN na receptach ?
Nieaktualne Miałem starą wersję status_cwu.xsd
...jak wyciągnąć nazwę i wersję systemu NFZ?
$systemNFZnazwa = $xpath->query("//odp:system")->item(0)->getAttribute('nazwa'); http://www.php.net/echo '<br />Nazwa systemu: '. $systemNFZnazwa; $systemNFZwersja = $xpath->query("//odp:system")->item(0)->getAttribute('wersja'); http://www.php.net/echo '<br />Wersja systemu: '. $systemNFZwersja;
function status ($potwierdzenie) { $doc = new DOMDocument(); $doc->loadXML($potwierdzenie); $xpath = new DOMXpath($doc); $xpath->registerNamespace('odp','https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2'); $statusCWU = $xpath->query("//odp:status_cwu")->item(0)->nodeValue; http://www.php.net/echo '<br /><br /> Status CWU (jest pesel czy nie?) : '.$statusCWU; $statusUbezpieczenia = $xpath->query("//odp:status_ubezp")->item(0)->nodeValue; http://www.php.net/echo '<br />Status ubezpieczenia : '.$statusUbezpieczenia; $receptaDN = $xpath->query("//odp:status_ubezp")->item(0)->getAttribute('ozn_rec'); http://www.php.net/echo '<br />Oznaczenie recepty: '. $receptaDN; $zwrotnyPesel = $xpath->query("//odp:numer_pesel")->item(0)->nodeValue;; http://www.php.net/echo '<br />zwrotny pesel: '. $zwrotnyPesel; $pacjentImie = $xpath->query("//odp:imie")->item(0)->nodeValue;; http://www.php.net/echo '<br />Imię pacjenta: '. $pacjentImie; $pacjentNazwisko = $xpath->query("//odp:nazwisko")->item(0)->nodeValue;; http://www.php.net/echo '<br />Imię pacjenta: '. $pacjentNazwisko; $systemNFZ = $xpath->query("//odp:system_nfz")->item(0)->nodeValue;; http://www.php.net/echo '<br />System NFZ: '. $systemNFZ; $swiadczeniodawca = $xpath->query("//odp:swiad")->item(0)->nodeValue;; http://www.php.net/echo '<br />Świadczeniodawca: '. $swiadczeniodawca; $swiadczeniodawcaID = $xpath->query("//odp:id_swiad")->item(0)->nodeValue;; http://www.php.net/echo '<br />Świadczeniodawca: '. $swiadczeniodawcaID; $nfzID = $xpath->query("//odp:id_ow")->item(0)->nodeValue;; http://www.php.net/echo '<br />NFZ: '. $nfzID; $operatorID = $xpath->query("//odp:id_operatora")->item(0)->nodeValue;; http://www.php.net/echo '<br />Operator: '. $operatorID; $idOperacji = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('id_operacji'); http://www.php.net/echo '<br />ID operacji: '. $idOperacji; $dataCzasOperacji = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('data_czas_operacji'); http://www.php.net/echo '<br />Data i czas operacji: '. $dataCzasOperacji; $dataWaznosciPotwierdzenia = $xpath->query("//odp:data_waznosci_potwierdzenia")->item(0)->nodeValue; http://www.php.net/echo '<br />Data ważności potwierdzenia : '.$dataWaznosciPotwierdzenia; $systemNFZnazwa = $xpath->query("//odp:system")->item(0)->getAttribute('nazwa'); http://www.php.net/echo '<br />Nazwa systemu: '. $systemNFZnazwa; $systemNFZwersja = $xpath->query("//odp:system")->item(0)->getAttribute('wersja'); http://www.php.net/echo '<br />Wersja systemu: '. $systemNFZwersja; }
Powinno być chyba odwołanie do węzła system_nfz a nie system
$systemNFZnazwa = $xpath->query("//odp:system_nfz")->item(0)->getAttribute('nazwa'); http://www.php.net/echo '<br />Nazwa systemu: '. $systemNFZnazwa;
ledwie coś załapię z tych xml'ów to znów "ciemność widzę..."
w status_cwu_2.xsd nie widzę "węzła" o którym mówisz; możesz mi to rozpracować?
<xs:element name="status_cwu_odp"> <xs:annotation> <xs:documentation>Komunikat z odpowiedzią dla świadczeniodawcy</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="status_cwu" type="xs:string"> <xs:annotation> <xs:documentation>Status pozycji w systemie CWU - jest/nie ma</xs:documentation> </xs:annotation> </xs:element> <xs:element name="numer_pesel" type="pesel"> <xs:annotation> <xs:documentation>Numer PESEL</xs:documentation> </xs:annotation> </xs:element>
<xs:element name="system_nfz" type="system"> <xs:annotation> <xs:documentation>Informacja o systemie udzielającym odpowiedzi po stronie NFZ </xs:documentation> </xs:annotation> </xs:element>
<xs:element name="swiad" type="swiadczeniodawca"> <xs:annotation> <xs:documentation>Identyfikacja operatora świadczeniodawcy wysyłającego zapytanie</xs:documentation> </xs:annotation> </xs:element> <xs:element name="pacjent" type="swiadczeniobiorca" minOccurs="0"> <xs:annotation> <xs:documentation>Wystepuje tylko dla pacjentów zarejestrowanych w CWU</xs:documentation> </xs:annotation> </xs:element> <xs:element ref="dsig:Signature" minOccurs="0"/> </xs:sequence> <xs:attribute name="id_operacji" use="required"> <xs:annotation> <xs:documentation>Unikalny identyfikator operacji sprawdzenia statusu ubezpieczenia</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="8"/> <xs:maxLength value="20"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="data_czas_operacji" type="xs:dateTime" use="required"> <xs:annotation> <xs:documentation>Data i czas dokonana sprawdzenia w systemie NFZ</xs:documentation> </xs:annotation> </xs:attribute> </xs:complexType> </xs:element>
Spójrz w "System eWUS - opis interfejs dostępowego v.1.2.pdf" na końcu masz:
"Komunikat odpowiedzi zawierający informacje o statusie uprawnienia do świadczeń"
tam jest opisane jaki to element
1.2?
wrzuć proszę link do tego dokumentu.
mam podstawową, 1.1, 1.3
...w 1.1 i 1.3 też jest - rzeczywiście moje niedopatrzenie... jak widzę jeszcze sporo nauki przede mną... w pierwszej kolejności prawidłowo zapisać potwierdzenie do pliku
Ja właśnie korzystałam z dokumentacji i tam znalazłam, że to system_nfz
a do pliku można zrzucać cały XML zwrotny
czyli po wywyłaniu loadXML i ustawieniu zmiennych np.
$doc->loadXML $doc->save('C:/AppServ/www/ewus/'.$numer_pesel.'-'.$kod.'.xml');
zapisujesz to w innej postaci niż potwierdzenia z NFZ - choć to nie jest problem bo id_operacji uzyskujemy z odpowiedzi;
podpis i jego skrót też zapisujesz do pliku?
jak go uzyskujesz skoro
$sygnatura = $xpath->query("//odp:Signature")->item(0)->nodeValue;; http://www.php.net/echo '<br />Sygnatura: '. $sygnatura;
$xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#'); $SignatureValue = $xpath->query("//ds:SignatureValue")->item(0)->nodeValue;; http://www.php.net/echo '<br />SignatureValue: '. $SignatureValue; $DigestValue = $xpath->query("//ds:DigestValue")->item(0)->nodeValue;; http://www.php.net/echo '<br />ValueDigest: '. $DigestValue;
no tak, podpis jest przecież opisany w:
Można tak ($responseXML zawiera to co zrobił gilek):
$doc = new DOMDocument(); $doc->loadXML($responseXML); $match = $doc->getElementsByTagName('status_cwu_odp');// $foundXML = $doc->saveXML($match->item(0)); $xpath = new DOMXpath($doc); $xpath->registerNamespace('odp','https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2'); $operId = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('id_operacji'); file_put_contents($operId . '.xml', $foundXML);
u "gilek"
$doc = new DOMDocument(); $doc->loadXML($r); $match = $doc->getElementsByTagName('status_cwu_odp');// $foundXML = $doc->saveXML($match->item(0)); $xpath = new DOMXpath($doc); $xpath->registerNamespace('odp','https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2'); $operId = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('id_operacji'); http://www.php.net/setlocale(LC_ALL, 'pl_PL', 'pl', 'Polish_Poland.28592'); $folderPotwierdzen = './potwierdzenia/' . http://www.php.net/strftime('%Y') . '/' . http://www.php.net/substr(http://www.php.net/strftime('%B'), 0, 3) . '/'; if (!http://www.php.net/file_exists($folderPotwierdzen)) http://www.php.net/mkdir($folderPotwierdzen, 0777, true); file_put_contents($folderPotwierdzen. $operId . '.xml', $foundXML);
try { $clientBroker = new SoapClient($path . '?wsdl', http://www.php.net/array('trace' => 1, 'exceptions' => true)); $potwierdzenie = $clientBroker->__doRequest($xml, $path, 'executeService', SOAP_1_1); } catch (Exception $e) {http://www.php.net/echo 'BŁĄD: ' . $e->getMessage().'<br>';}
Jeśli zwróci element Fault z przestrzeni nazw http://schemas.xmlsoap.org/soap/envelope/. Oczywiście nie jest to takie proste. W elemencie detail może znadować sie element z przestrzeni http://xml.kamsoft.pl/ws/common mówiący o typie błedu. W zależności od typu czasem należy odświeżyć sesje. Można to obsłużyć tak (kod jest powiązany z moimi klasami, rozważ koncepcje, nie rowiązanie):
class EWUSException extends Exception { private $_type; public function http://www.php.net/settype($type) { $this->_type = $type; } public function http://www.php.net/gettype() { return $this->_type; } }
/** * * @param string $response * @throws Exception * @throws EWUSException */ private function _parseResponse($response) { if (http://www.php.net/strlen($response)===0) throw new Exception('Brak odpowiedzi na żądanie.'); $doc = new DOMDocument(); $doc->loadXML($response); $xpath = new DOMXpath($doc); $xpath->registerNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/'); $xpath->registerNamespace('com', 'http://xml.kamsoft.pl/ws/common'); $fault = $xpath->query('//env:Fault'); if ($fault->length===1) { $ee = new EWUSException(); $ks = $xpath->query('//com:*'); if ($ks->length>=1) $ee->setType($ks->item(0)->localName); throw $ee; } }
try { $r = $ec->checkCWU($pesel, EWUSClient::FLAG_STATUS | EWUSClient::FLAG_RESPONSE); } catch(EWUSException $ee) { switch($ee->getType()) { case 'authTokenError': case 'sessionError': $e->refreshSession(true); break; case 'inputError': $result[$pesel] = http://www.php.net/array('error'=>'Błędne dane wejściowe.'); break; default: $result[$pesel] = http://www.php.net/array('error'=>'Nieznany błąd.'); break; } } catch(Exception $e) { $result[$pesel] = http://www.php.net/array('error'=>$e->getMessage()); }
$doc = new DOMDocument(); $doc->loadXML($r); $match = $doc->getElementsByTagName('status_cwu_odp');// $foundXML = $doc->saveXML($match->item(0)); file_put_contents($operId . '.xml', $foundXML);
Witam,
Zmodyfikowałem kod tak, aby na początku korzystał z serwera testowego eWUŚ.
<?php $params = http://www.php.net/array( 'credentials' => http://www.php.net/array( http://www.php.net/array('name' => 'domain', 'value' => http://www.php.net/array('stringValue' => '15')), http://www.php.net/array('name' => 'login', 'value' => http://www.php.net/array('stringValue' => 'TEST1')) ), 'password' => 'qwerty!@#'); $clientAuth = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl', http://www.php.net/array( 'trace' => true, 'soap_version' => SOAP_1_2, "exceptions" => true, "cache_wsdl" => "WSDL_CACHE_NONE" )); $clientAuth->__soapCall('login', http://www.php.net/array($params), null, null, $loginHeaders); $xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://xml.kamsoft.pl/ws/common" xmlns:brok="http://xml.kamsoft.pl/ws/broker"> <soapenv:Header> <com:session id="' . $loginHeaders['session']->id . '" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/> <com:authToken id="' . $loginHeaders['authToken']->id . '" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/> </soapenv:Header> <soapenv:Body> <brok:executeService> <com:location> <com:namespace>nfz.gov.pl/ws/broker/cwu</com:namespace> <com:localname>checkCWU</com:localname> <com:version>2.0</com:version> </com:location> <brok:date>2008-09-12T09:37:36.406+01:00</brok:date> <brok:payload> <brok:textload> <ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2"> <ewus:numer_pesel>00000000000</ewus:numer_pesel> <ewus:system_swiad nazwa="eWUS" wersja="2012.07.1.0"/> </ewus:status_cwu_pyt> </brok:textload> </brok:payload> </brok:executeService> </soapenv:Body> </soapenv:Envelope>'; $clientBroker = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/ServiceBroker?wsdl', http://www.php.net/array('trace' => true, 'soap_version' => SOAP_1_2, "exceptions" => true, "cache_wsdl" => "WSDL_CACHE_NONE")); $r = $clientBroker->__doRequest($xml, 'https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/ServiceBroker', 'executeService', SOAP_1_2); ?>
A jak włączyć ten certyfikat do SOAP?
Poniżej komunikat NFZ:
"W związku z koniecznością wymiany certyfikatu informujemy, że w dniu 10 września 2018 r. po godzinie 7-ej, system eWUŚ zostanie przełączony na nowy certyfikat. Certyfikat ten wykorzystywać będzie między innymi funkcję skrótu SHA-2.
Certyfikat pośredni (intermediate) oraz główny (root) można pobrać ze strony wystawcy pod adresem https://knowledge.digicert.com/generalinformation/INFO3805.html, w sekcji "SHA-2 Intermediate CAs (under SHA-2 Root)"."
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)