Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/SOAP] eWUS - info o pacjencie
Forum PHP.pl > Forum > PHP
Stron: 1, 2
Kris2X
Wie ktoś może skąd mogę wyłowić informacje o oznaczeniu DN na receptach ?

Nieaktualne
Miałem starą wersję status_cwu.xsd
eMCeH
...jak wyciągnąć nazwę i wersję systemu NFZ?

  1. $systemNFZnazwa = $xpath->query("//odp:system")->item(0)->getAttribute('nazwa');
  2. echo '<br />Nazwa systemu: '. $systemNFZnazwa;
  3.  
  4. $systemNFZwersja = $xpath->query("//odp:system")->item(0)->getAttribute('wersja');
  5. echo '<br />Wersja systemu: '. $systemNFZwersja;

błąd:
Kod
Call to a member function getAttribute() on a non-object


całość:
  1. function status ($potwierdzenie) {
  2. $doc = new DOMDocument();
  3. $doc->loadXML($potwierdzenie);
  4. $xpath = new DOMXpath($doc);
  5. $xpath->registerNamespace('odp','https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2');
  6.  
  7. $statusCWU = $xpath->query("//odp:status_cwu")->item(0)->nodeValue;
  8. echo '<br /><br /> Status CWU (jest pesel czy nie?) : '.$statusCWU;
  9.  
  10. $statusUbezpieczenia = $xpath->query("//odp:status_ubezp")->item(0)->nodeValue;
  11. echo '<br />Status ubezpieczenia : '.$statusUbezpieczenia;
  12.  
  13. $receptaDN = $xpath->query("//odp:status_ubezp")->item(0)->getAttribute('ozn_rec');
  14. echo '<br />Oznaczenie recepty: '. $receptaDN;
  15.  
  16. $zwrotnyPesel = $xpath->query("//odp:numer_pesel")->item(0)->nodeValue;;
  17. echo '<br />zwrotny pesel: '. $zwrotnyPesel;
  18.  
  19. $pacjentImie = $xpath->query("//odp:imie")->item(0)->nodeValue;;
  20. echo '<br />Imię pacjenta: '. $pacjentImie;
  21.  
  22. $pacjentNazwisko = $xpath->query("//odp:nazwisko")->item(0)->nodeValue;;
  23. echo '<br />Imię pacjenta: '. $pacjentNazwisko;
  24.  
  25. $systemNFZ = $xpath->query("//odp:system_nfz")->item(0)->nodeValue;;
  26. echo '<br />System NFZ: '. $systemNFZ;
  27.  
  28. $swiadczeniodawca = $xpath->query("//odp:swiad")->item(0)->nodeValue;;
  29. echo '<br />Świadczeniodawca: '. $swiadczeniodawca;
  30.  
  31. $swiadczeniodawcaID = $xpath->query("//odp:id_swiad")->item(0)->nodeValue;;
  32. echo '<br />Świadczeniodawca: '. $swiadczeniodawcaID;
  33.  
  34. $nfzID = $xpath->query("//odp:id_ow")->item(0)->nodeValue;;
  35. echo '<br />NFZ: '. $nfzID;
  36.  
  37. $operatorID = $xpath->query("//odp:id_operatora")->item(0)->nodeValue;;
  38. echo '<br />Operator: '. $operatorID;
  39.  
  40. $idOperacji = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('id_operacji');
  41. echo '<br />ID operacji: '. $idOperacji;
  42.  
  43. $dataCzasOperacji = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('data_czas_operacji');
  44. echo '<br />Data i czas operacji: '. $dataCzasOperacji;
  45.  
  46. $dataWaznosciPotwierdzenia = $xpath->query("//odp:data_waznosci_potwierdzenia")->item(0)->nodeValue;
  47. echo '<br />Data ważności potwierdzenia : '.$dataWaznosciPotwierdzenia;
  48.  
  49. $systemNFZnazwa = $xpath->query("//odp:system")->item(0)->getAttribute('nazwa');
  50. echo '<br />Nazwa systemu: '. $systemNFZnazwa;
  51.  
  52. $systemNFZwersja = $xpath->query("//odp:system")->item(0)->getAttribute('wersja');
  53. echo '<br />Wersja systemu: '. $systemNFZwersja;
  54.  
  55. }
szaitis
Powinno być chyba odwołanie do węzła system_nfz a nie system
  1. $systemNFZnazwa = $xpath->query("//odp:system_nfz")->item(0)->getAttribute('nazwa');
  2. echo '<br />Nazwa systemu: '. $systemNFZnazwa;
eMCeH
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ć?
  1. <xs:element name="status_cwu_odp">
  2. <xs:annotation>
  3. <xs:documentation>Komunikat z odpowiedzią dla świadczeniodawcy</xs:documentation>
  4. </xs:annotation>
  5. <xs:complexType>
  6. <xs:sequence>
  7. <xs:element name="status_cwu" type="xs:string">
  8. <xs:annotation>
  9. <xs:documentation>Status pozycji w systemie CWU - jest/nie ma</xs:documentation>
  10. </xs:annotation>
  11. </xs:element>
  12. <xs:element name="numer_pesel" type="pesel">
  13. <xs:annotation>
  14. <xs:documentation>Numer PESEL</xs:documentation>
  15. </xs:annotation>
  16. </xs:element>


jedyna wartość dla system_nfz to:

  1. <xs:element name="system_nfz" type="system">
  2. <xs:annotation>
  3. <xs:documentation>Informacja o systemie udzielającym odpowiedzi po stronie NFZ </xs:documentation>
  4. </xs:annotation>
  5. </xs:element>

i dalszy kod:
  1. <xs:element name="swiad" type="swiadczeniodawca">
  2. <xs:annotation>
  3. <xs:documentation>Identyfikacja operatora świadczeniodawcy wysyłającego zapytanie</xs:documentation>
  4. </xs:annotation>
  5. </xs:element>
  6. <xs:element name="pacjent" type="swiadczeniobiorca" minOccurs="0">
  7. <xs:annotation>
  8. <xs:documentation>Wystepuje tylko dla pacjentów zarejestrowanych w CWU</xs:documentation>
  9. </xs:annotation>
  10. </xs:element>
  11. <xs:element ref="dsig:Signature" minOccurs="0"/>
  12. </xs:sequence>
  13. <xs:attribute name="id_operacji" use="required">
  14. <xs:annotation>
  15. <xs:documentation>Unikalny identyfikator operacji sprawdzenia statusu ubezpieczenia</xs:documentation>
  16. </xs:annotation>
  17. <xs:simpleType>
  18. <xs:restriction base="xs:string">
  19. <xs:minLength value="8"/>
  20. <xs:maxLength value="20"/>
  21. </xs:restriction>
  22. </xs:simpleType>
  23. </xs:attribute>
  24. <xs:attribute name="data_czas_operacji" type="xs:dateTime" use="required">
  25. <xs:annotation>
  26. <xs:documentation>Data i czas dokonana sprawdzenia w systemie NFZ</xs:documentation>
  27. </xs:annotation>
  28. </xs:attribute>
  29. </xs:complexType>
  30. </xs:element>



chyba zajarzyłem: system_nfz jest tak jakby "obiektem" klasy "system" dlatego nie można odwoływac się do system tylko trzeba odwołać do system_nfz i wyciągnąć z niego atrybuty nazwa i wersja... dobrze myślę?
d_adamkiewicz
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
eMCeH
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 smile.gif
szaitis
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.
  1. $doc->loadXML
  2. $doc->save('C:/AppServ/www/ewus/'.$numer_pesel.'-'.$kod.'.xml');
eMCeH
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
  1. $sygnatura = $xpath->query("//odp:Signature")->item(0)->nodeValue;;
  2. echo '<br />Sygnatura: '. $sygnatura;


daje błąd
Kod
Trying to get property of non-object


mimo, że w specyfikacji 13 jest co_jest.gif
d_adamkiewicz
  1. $xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#');
  2.  
  3. $SignatureValue = $xpath->query("//ds:SignatureValue")->item(0)->nodeValue;;
  4. echo '<br />SignatureValue: '. $SignatureValue;
  5.  
  6. $DigestValue = $xpath->query("//ds:DigestValue")->item(0)->nodeValue;;
  7. echo '<br />ValueDigest: '. $DigestValue;
eMCeH
no tak, podpis jest przecież opisany w:
Kod
xmldsig-core-schema.xsd


jak widzę macie duże doświadczenie w "automatach"; czy każdy serwis ma tak skomplikowaną strukturę, że trzeba korzystać z:
opisu sesji testowej,
opisu interfejsu v.1.0
opisu interfejsu v.1.3
plików .xsd (2x)
plików xml (2x)


d_adamkiewicz
Można tak ($responseXML zawiera to co zrobił gilek):

  1. $doc = new DOMDocument();
  2. $doc->loadXML($responseXML);
  3. $match = $doc->getElementsByTagName('status_cwu_odp');//
  4. $foundXML = $doc->saveXML($match->item(0));
  5. $xpath = new DOMXpath($doc);
  6. $xpath->registerNamespace('odp','https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2');
  7. $operId = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('id_operacji');
  8. file_put_contents($operId . '.xml', $foundXML);

eMCeH
u "gilek"
Kod
$r


uzupełniony kod o zapis do folderów z 3-lit nazwą miesiąca:

  1. $doc = new DOMDocument();
  2. $doc->loadXML($r);
  3. $match = $doc->getElementsByTagName('status_cwu_odp');//
  4. $foundXML = $doc->saveXML($match->item(0));
  5. $xpath = new DOMXpath($doc);
  6. $xpath->registerNamespace('odp','https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2');
  7. $operId = $xpath->query("//odp:status_cwu_odp")->item(0)->getAttribute('id_operacji');
  8.  
  9. setlocale(LC_ALL, 'pl_PL', 'pl', 'Polish_Poland.28592');
  10. $folderPotwierdzen = './potwierdzenia/' . strftime('%Y') . '/' . substr(strftime('%B'), 0, 3) . '/';
  11. if (!file_exists($folderPotwierdzen))
  12. mkdir($folderPotwierdzen, 0777, true);
  13.  
  14. file_put_contents($folderPotwierdzen. $operId . '.xml', $foundXML);


W przypadku podania błędnego nr pesel np. 00000000000 serwer zwraca :
Kod
soapenv:ServerNiepoprawny numer PESEL.nfz.gov.pl/ws/broker/cwucheckCWU2.0Client.InputExceptionBłędne dane wejściowe.pl.kamsoft.app.ws.broker.cwu.BrokerServiceAuth


jak to przechwycić do wyjątku?

  1. try {
  2. $clientBroker = new SoapClient($path . '?wsdl', array('trace' => 1, 'exceptions' => true));
  3. $potwierdzenie = $clientBroker->__doRequest($xml, $path, 'executeService', SOAP_1_1);
  4. }
  5. catch (Exception $e) {echo 'BŁĄD: ' . $e->getMessage().'<br>';}


przepuszcza i nie wyrzuca wyjątku
gilek
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):

  1. class EWUSException extends Exception {
  2. private $_type;
  3. public function setType($type) { $this->_type = $type; }
  4. public function getType() { return $this->_type; }
  5. }


  1. /**
  2.   *
  3.   * @param string $response
  4.   * @throws Exception
  5.   * @throws EWUSException
  6.   */
  7. private function _parseResponse($response) {
  8. if (strlen($response)===0)
  9. throw new Exception('Brak odpowiedzi na żądanie.');
  10.  
  11. $doc = new DOMDocument();
  12. $doc->loadXML($response);
  13.  
  14. $xpath = new DOMXpath($doc);
  15. $xpath->registerNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/');
  16. $xpath->registerNamespace('com', 'http://xml.kamsoft.pl/ws/common');
  17.  
  18. $fault = $xpath->query('//env:Fault');
  19.  
  20. if ($fault->length===1) {
  21. $ee = new EWUSException();
  22.  
  23. $ks = $xpath->query('//com:*');
  24. if ($ks->length>=1)
  25. $ee->setType($ks->item(0)->localName);
  26.  
  27. throw $ee;
  28. }
  29. }


  1. try {
  2.  
  3. $r = $ec->checkCWU($pesel, EWUSClient::FLAG_STATUS | EWUSClient::FLAG_RESPONSE);
  4. } catch(EWUSException $ee) {
  5. switch($ee->getType()) {
  6. case 'authTokenError':
  7. case 'sessionError':
  8. $e->refreshSession(true);
  9. break;
  10.  
  11. case 'inputError':
  12. $result[$pesel] = array('error'=>'Błędne dane wejściowe.');
  13. break;
  14.  
  15. default:
  16. $result[$pesel] = array('error'=>'Nieznany błąd.');
  17. break;
  18.  
  19. }
  20. } catch(Exception $e) {
  21. $result[$pesel] = array('error'=>$e->getMessage());
  22. }
d_adamkiewicz
  1. $doc = new DOMDocument();
  2. $doc->loadXML($r);
  3. $match = $doc->getElementsByTagName('status_cwu_odp');//
  4. $foundXML = $doc->saveXML($match->item(0));
  5. file_put_contents($operId . '.xml', $foundXML);


Czy, ktoś próbował tak utworzony plik potwierdzenia sprawdzać, weryfikować, wgrywać do programu do rozliczeń?
tzn. wiem, że Kamsoft nie udostępnia jeszcze dla KS PPS mechanizmu importu, ale może inne oprogramowanie?
Może szukam dziury w całym, ale wołałbym się upewnić.
nitro18
Witam,

Zmodyfikowałem kod tak, aby na początku korzystał z serwera testowego eWUŚ.

  1. <?php
  2. $params = array(
  3. 'credentials' => array(
  4. array('name' => 'domain', 'value' => array('stringValue' => '15')),
  5. array('name' => 'login', 'value' => array('stringValue' => 'TEST1'))
  6. ),
  7. 'password' => 'qwerty!@#');
  8.  
  9. $clientAuth = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/Auth?wsdl', array(
  10. 'trace' => true,
  11. 'soap_version' => SOAP_1_2,
  12. "exceptions" => true,
  13. "cache_wsdl" => "WSDL_CACHE_NONE"
  14. ));
  15. $clientAuth->__soapCall('login', array($params), null, null, $loginHeaders);
  16.  
  17. $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">
  18. <soapenv:Header>
  19. <com:session id="' . $loginHeaders['session']->id . '" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/>
  20. <com:authToken id="' . $loginHeaders['authToken']->id . '" xmlns:ns1="http://xml.kamsoft.pl/ws/common"/>
  21. </soapenv:Header>
  22. <soapenv:Body>
  23. <brok:executeService>
  24. <com:location>
  25. <com:namespace>nfz.gov.pl/ws/broker/cwu</com:namespace>
  26. <com:localname>checkCWU</com:localname>
  27. <com:version>2.0</com:version>
  28. </com:location>
  29. <brok:date>2008-09-12T09:37:36.406+01:00</brok:date>
  30. <brok:payload>
  31. <brok:textload>
  32. <ewus:status_cwu_pyt xmlns:ewus="https://ewus.nfz.gov.pl/ws/broker/ewus/status_cwu/v2">
  33. <ewus:numer_pesel>00000000000</ewus:numer_pesel>
  34. <ewus:system_swiad nazwa="eWUS" wersja="2012.07.1.0"/>
  35. </ewus:status_cwu_pyt>
  36. </brok:textload>
  37. </brok:payload>
  38. </brok:executeService>
  39. </soapenv:Body>
  40. </soapenv:Envelope>';
  41.  
  42. $clientBroker = new SoapClient('https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/ServiceBroker?wsdl', array('trace' => true,
  43. 'soap_version' => SOAP_1_2,
  44. "exceptions" => true,
  45. "cache_wsdl" => "WSDL_CACHE_NONE"));
  46. $r = $clientBroker->__doRequest($xml, 'https://ewus.nfz.gov.pl/ws-broker-server-ewus-auth-test/services/ServiceBroker', 'executeService', SOAP_1_2);
  47.  
  48. ?>


jednakże po wywołaniu pojawia się:

Cytat
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: <message> 'loginResponse' already defined in C:\dane\serwer\htdocs\ewus.php:14 Stack trace: #0 C:\dane\serwer\htdocs\ewus.php(14): SoapClient->SoapClient('https://ewus.nf...', Array) #1 {main} thrown in C:\dane\serwer\htdocs\ewus.php on line 14


w jaki sposób można naprawić błąd.


z SOAP jestem noga. Proszę bardzo o pomoc.





marekpulawy
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/generalinfor...n/INFO3805.html, w sekcji "SHA-2 Intermediate CAs (under SHA-2 Root)"."
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-2025 Invision Power Services, Inc.