2017-09-04 46 views
8

Używanie PHP SoapClient, nawiązywać połączenia z WSDL w https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl i mam następującą odpowiedź XML (jak wskazano $soapclient->__last_response)PHP SoapClient zwraca null nawet, że tam był odpowiedzią

<?xml version='1.0' encoding='UTF-8'?><soap:Envelope xmlns:ede="http://ede.de/webservices" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body><Response action="ELC" requestId="1" version="1.0"><created>2017-09-04T16:04:46.556+02:00</created><StatusInformation>OK</StatusInformation><StatusCode>0</StatusCode><Payload><SalesOrderSimulateConfirmation><Items><Item><ID>10</ID><ProductID>0003062700050</ProductID><Price>2.970</Price><PositionPrice>2.970</PositionPrice><PriceUnit>1</PriceUnit><QuantityUnit>ST</QuantityUnit><QuantityAvailable>1</QuantityAvailable><QuantityProfile>1</QuantityProfile><Currency>EUR</Currency><Services /><Schedules>Geplante Liefertermine: 1 ST in KW 36.2017;</Schedules><Remark /><DangerMaterial /></Item></Items></SalesOrderSimulateConfirmation></Payload></Response></soap:Body></soap:Envelope> 

Niemniej jednak, zadzwoń pod $soapclient->simulateOrder() zwraca null.

Jak ustawić PHP SoapClient, aby zwracał obiekt zamiast wartości NULL?

Uwaga: xml, którego używam do wywołania mydła, jest generowany ręcznie przez przesłonięcie do SoapClient::__doRequest(). Kod na wezwanie mydło wygląda następująco:

$soapClient = new SoapClient('https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl', array(
    'cache_wsdl' => WSDL_CACHE_NONE, 
    'trace'  => true, 
    'exceptions' => true, 
    'soap_version' => SOAP_1_2, 
    'features'  => SOAP_SINGLE_ELEMENT_ARRAYS, 
    'login' => '------', // cannot post here for security purposes 
    'password' => '-----', // cannot post here for security purposes 
    'stream_context' => (
     stream_context_create(array(
      'ssl' => array(
       'verify_peer' => false, 
       'verify_peer_name' => false, 
       'allow_self_signed' => true 
      ) 
     )) 
)); 
$result = $soapClient->simulateOrder(); 

Żadnych wyjątków są wyrzucane, ale $result jest null

+0

Czy możesz pokazać nam swoją funkcję simulateOrder(), proszę? –

Odpowiedz

3

Problemem jest konfiguracja SSL, błąd, który jest generowany, kiedy próbuję wywołać kod na mój serwer jest w następujący sposób:

błąd krytyczny: Uncaught SoapFault wyjątek: [WSDL] SOAP bŁĄD: Przetwarzanie WSDL: nie można załadować z 'https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl': nie można załadować podmiot zewnętrzny "https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl" w/home/repojarilo/public_html /sc.php:22 Ślad stosu: # 0 /home/repojarilo/public_html/sc.php(22): Więc apClient-> SoapClient ('https://webserv ...', Array) # 1 {główny} wrzucono do ... w linii 22

Zakładam, że próbujesz uzyskać kod do pracy z samopodpisanym certyfikatem, jak wskazano w twojej tablicy SSL wewnątrz żądania, jednak wygląda na to, że SoapClient nie zwraca na to uwagi i mimo to rzuca błąd.

Więc moim rozwiązaniem byłoby albo kupić SSL (bardzo tanie teraz dni, wypróbować strony takie jak namecheap etc ...) lub użyć czegoś takiego jak https://letsencrypt.org/, aby uzyskać SSL, który pozwoli twojemu klientowi mydła działać poprawnie.

Wreszcie zauważyłem literówkę, w twoim kodzie jedna linia przed ostatnim masz ));, która powinna przeczytać )));.

Koda

1

Problem nie jest twoim certyfikatem jako klientem, ale sam certyfikat serwera (spróbuj załadować https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl w przeglądarce), który jest nieprawidłowy. Możesz to zignorować doskonale, ponieważ certyfikat serwera jest głównie po to, aby uniknąć wyłudzania informacji. Rozumiem, że ten adres URL to naprawdę ten, do którego próbujesz dotrzeć. W zwijaniu linii poleceń jest to realizowane za pomocą opcji -k. W php, SoapClient dokładnie, możesz użyć this (dokładnie twój problem, sprawdź trzecią odpowiedź i zobacz, co mówi o PHP7)

UWAGA: Ładujesz wsdl, plik definicji usługi, przy każdej konstrukcji SoapClient.Jeśli przechowujesz $ soapclient jako zmienną statyczną, możesz używać jego metod przez cały czas bez potrzeby ponownego tworzenia obiektu klienta (unikając przeładowania i ponownego interpretowania pliku wsdl, który może opóźnić się idealnie od 1 do 5 sekund). czas.