2012-11-30 11 views
5

Próbuję przetworzyć odpowiedź SOAP z globalnej bramki First Data. Używałem wcześniej SoapClient, ale nie ma w nim pliku wsdl - a firma twierdzi, że go nie dostarcza.Przetwarzanie odpowiedzi SOAP

Próbowałem różnych innych podejść, takich jak SimpleXMLElement na podstawie przykładów tutaj i podręcznika PHP, ale nie mogę dostać nic do pracy. Podejrzewam, że przestrzenie nazw są częścią mojego problemu. Czy ktoś może zaproponować podejście lub wskazać mi podobny przykład - moje wysiłki Google były jak dotąd bezowocne.

pomocą PHP 5.

Częściowa odpowiedź SOAP (z wszystkich rzeczy nagłówka HTML, który poprzedza go zdjął) wygląda następująco:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 

<SOAP-ENV:Header/> 

<SOAP-ENV:Body> 

<fdggwsapi:FDGGWSApiOrderResponse xmlns:fdggwsapi="http://secure.linkpt.net/fdggwsapi/schemas_us/fdggwsapi"> 

<fdggwsapi:CommercialServiceProvider/> 

<fdggwsapi:TransactionTime>Thu Nov 29 17:03:18 2012</fdggwsapi:TransactionTime> 

<fdggwsapi:TransactionID/> 

<fdggwsapi:ProcessorReferenceNumber/> 

<fdggwsapi:ProcessorResponseMessage/> 

<fdggwsapi:ErrorMessage>SGS-005005: Duplicate transaction.</fdggwsapi:ErrorMessage> 

<fdggwsapi:OrderId>A-e833606a-5197-45d6-b990-81e52df41274</fdggwsapi:OrderId> 
... 

<snip> 

ja również muszą być w stanie określić, czy SOAP zakłócenie zostało zasygnalizowane. XML, który wygląda tak:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Header/> 
<SOAP-ENV:Body> 
<SOAP-ENV:FaultX> 
<faultcode>SOAP-ENV:Client</faultcode> 
<faultstring xml:lang="en">MerchantException</faultstring> 
<detail> 
cvc-pattern-valid: Value '9999185.00' is not facet-valid with respect to pattern '([1-9]([0-9]{0,3}))?[0-9](\.[0-9]{1,2})?' for type '#AnonType_ChargeTotalAmount'. 
cvc-type.3.1.3: The value '9999185.00' of element 'v1:ChargeTotal' is not valid. 
</detail> 
</SOAP-ENV:FaultX> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Korzystanie odpowiedź pana kodeksu byłem w stanie odzyskać dane z odpowiedziami bez usterek. Ale muszę określić, jakiego typu pakiet mam do czynienia i wyodrębnić dane z obu typów. Byłoby o wiele łatwiej, gdyby tylko dostarczały wsdl!

Odpowiedz

6

Twoja odpowiedź może zostać przeanalizowana przy pomocy SimpleXML, oto przykład. Zawiadomienie Przekazuję URL przestrzeni nazw do children(), aby uzyskać dostęp do elementów.

$obj = simplexml_load_string($xml); 

$response = $obj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://secure.linkpt.net/fdggwsapi/schemas_us/fdggwsapi')->FDGGWSApiOrderResponse; 

echo $response->TransactionTime . "\n"; 
echo $response->ErrorMessage; 

Wyjścia

Czw Lis 29 17:03:18 2012
SGS-005005: Duplikat transakcji.

Codepad Demo

Edycja: Odpowiedź SoapFault można przeanalizować jak poniżej. Wyprowadza ciąg błędu i szczegóły, lub "Brak usterek":

if($obj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://schemas.xmlsoap.org/soap/envelope/') && isset($obj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://schemas.xmlsoap.org/soap/envelope/')->children()->faultcode)) 
{ 
    $fault = $obj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://schemas.xmlsoap.org/soap/envelope/')->children(); 

    // soap fault 
    echo $fault->faultstring; 
    echo $fault->detail; 
} 
else 
{ 
    echo 'No fault found, do normal parsing...'; 
} 
+0

Dzięki - dokładnie to, czego potrzebowałem - nie widziałem przykład, w którym obie te przestrzenie nazwano w ten sposób. – JonP

+0

Przykład działa pięknie, gdy otrzymam poprawną odpowiedź, ale odkryłem dodatkową "zmarszczkę", gdy sygnalizowana jest usterka mydła. W takim przypadku oczywiście nie ma drugiej przestrzeni nazw i nie mogę znaleźć prostej metody określenia, czy występuje element błędu i jego zawartość. Czy możesz coś zasugerować? – JonP

+0

Zaktualizuj pytanie, podając przykład odpowiedzi na błąd związany z mydłem i niech się przyjrzy. – MrCode

Powiązane problemy