Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: websevice SZOI
Forum PHP.pl > Forum > PHP
marekpulawy
Cześć,

Czy ktoś z Was próbował w PHP połączyć się z webservice SZOI i przesłać plik?
Mam taki kod, ale po zalogowaniu nie mogę przesłać pliku: Błąd przesyłania pliku: SOAP-ERROR: Parsing WSDL: 'executeServiceRequestMsg' already defined

  1. <?php
  2. // Konfiguracja
  3. $brokerWsdlUrl = "https://www-2.nfz-lublin.pl/ws-broker-server-dostep/services/ServiceBroker?wsdl";
  4. $authWsdlUrl = "https://www-2.nfz-lublin.pl/kaas/services/Auth?wsdl"; // Usługa logowania
  5. $username = "*****";
  6. $password = "*****";
  7. $domain = "03"; // Domena
  8. $filePath = "*****.xml"; // Ścieżka do pliku
  9.  
  10. // Weryfikacja pliku
  11. if (!file_exists($filePath)) {
  12. die("Plik $filePath nie istnieje.");
  13. }
  14.  
  15. // Funkcja konwersji obiektu do tablicy
  16. function objectToArray($object) {
  17. return json_decode(json_encode($object), true);
  18. }
  19.  
  20. // Funkcja logowania
  21. function login($authWsdlUrl, $username, $password, $domain) {
  22. try {
  23. $arrContextOptions = [
  24. "ssl" => [
  25. "verify_peer" => false,
  26. "verify_peer_name" => false,
  27. ]
  28. ];
  29. $options = [
  30. 'soap_version' => SOAP_1_2,
  31. 'exceptions' => true,
  32. 'trace' => true,
  33. 'cache_wsdl' => WSDL_CACHE_NONE,
  34. 'stream_context' => stream_context_create($arrContextOptions),
  35. ];
  36.  
  37. $params = [
  38. 'credentials' => [
  39. ['name' => 'domain', 'value' => ['stringValue' => $domain]],
  40. ['name' => 'login', 'value' => ['stringValue' => $username]]
  41. ],
  42. 'password' => $password
  43. ];
  44.  
  45. $clientAuth = new SoapClient($authWsdlUrl, $options);
  46. $loginHeaders = null;
  47.  
  48. $clientAuth->__soapCall('login', [$params], null, null, $loginHeaders);
  49.  
  50. // Debug: Wyświetlenie nagłówków
  51. echo "Nagłówki logowania:\n";
  52. print_r($loginHeaders);
  53.  
  54. $loginHeadersArray = objectToArray($loginHeaders);
  55.  
  56. // Pobranie sessionId i authToken
  57. $sessionId = $loginHeadersArray['session']['id'] questionmark.gif null;
  58. $authToken = $loginHeadersArray['authToken']['id'] questionmark.gif null;
  59.  
  60. if (!$sessionId || !$authToken) {
  61. die("Logowanie nie powiodło się: brak sessionId lub authToken.\n");
  62. }
  63.  
  64. echo "Zalogowano pomyślnie!\n";
  65. echo "Session ID: $sessionId\n";
  66. echo "Auth Token: $authToken\n";
  67.  
  68. return [
  69. 'sessionId' => $sessionId,
  70. 'authToken' => $authToken
  71. ];
  72. } catch (SoapFault $e) {
  73. echo "Błąd logowania SOAP:\n";
  74. echo "Kod błędu: " . $e->faultcode . "\n";
  75. echo "Opis błędu: " . $e->getMessage() . "\n";
  76. die();
  77. }
  78. }
  79.  
  80. // Funkcja przesyłania pliku
  81. function putFile($brokerWsdlUrl, $sessionId, $authToken, $filePath) {
  82. try {
  83. $arrContextOptions = [
  84. "ssl" => [
  85. "verify_peer" => false,
  86. "verify_peer_name" => false,
  87. ]
  88. ];
  89. $options = [
  90. 'soap_version' => SOAP_1_2,
  91. 'exceptions' => true,
  92. 'trace' => true,
  93. 'cache_wsdl' => WSDL_CACHE_NONE,
  94. 'stream_context' => stream_context_create([
  95. 'ssl' => [
  96. 'verify_peer' => false,
  97. 'verify_peer_name' => false,
  98. ]
  99. ]),
  100. ];
  101.  
  102. $client = new SoapClient($brokerWsdlUrl, $options);
  103.  
  104. $fileContent = base64_encode(file_get_contents($filePath));
  105. $date = date('Y-m-d\TH:i:s');
  106.  
  107. $headers = [
  108. new SoapHeader("http://xml.kamsoft.pl/ws/common", "session", $sessionId),
  109. new SoapHeader("http://xml.kamsoft.pl/ws/common", "authToken", $authToken),
  110. ];
  111.  
  112. $client->__setSoapHeaders($headers);
  113.  
  114. $response = $client->__soapCall("executeService", [
  115. [
  116. 'location' => [
  117. 'localname' => "putFile",
  118. 'version' => "1.2",
  119. ],
  120. 'date' => $date,
  121. 'params' => [
  122. ['name' => 'obszar', 'value' => 'LIOCZ'],
  123. ['name' => 'id_ow', 'value' => '03'],
  124. ['name' => 'id_swiad', 'value' => '******'],
  125. ],
  126. 'payload' => [
  127. 'textload' => <<<XML
  128. <put-file xmlns="http://xml.kamsoft.pl/ws/broker/put-file/v1.2" typ="LIOCZ">
  129.   <content>$fileContent</content>
  130. </put-file>
  131. XML
  132. ]
  133. ]
  134. ]);
  135.  
  136. echo "Plik przesłany pomyślnie:\n";
  137. print_r($response);
  138. } catch (SoapFault $e) {
  139. echo "Błąd przesyłania pliku: " . $e->getMessage() . "\n";
  140. }
  141. }
  142.  
  143. // Logowanie
  144. $tokens = login($authWsdlUrl, $username, $password, $domain);
  145.  
  146. // Przesyłanie pliku
  147. putFile($brokerWsdlUrl, $sessionId, $authToken, $filePath);
  148. ?>
  149.  
nospor
Z tego co znalazlem w necie, to wyglada jakby WSDL byl zly, poprzez deklaracje dwa razy tych samych fukncji. Natywny klient php tego nie przepuszcza

Pozostaje ci wiec albo pisac do autora by poprawil WSDL, albo uzyc innego liba, ktora przepuszcza tego typu zle WSDLe, np
https://pear.php.net/package/SOAP

edit:
sprawdzilem ten WSDL i faktycznie ma duplikaty
<wsdl:message name="executeServiceRequestMsg">
<wsdl:part name="request" element="wsbroker:executeService"/>
</wsdl:message>
<wsdl:message name="executeServiceRequestMsg">
<wsdl:part name="session" element="wscommon:session"/>
</wsdl:message>
<wsdl:message name="executeServiceRequestMsg">
<wsdl:part name="token" element="wscommon:authToken"/>
</wsdl:message>

Generanie jest to bledny WSDL, name powinny byc UNIQUE
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.