2012-11-30 3 views
5

Sto tentando di elaborare una risposta SOAP dal gateway globale di First Data. Ho già usato SoapClient, ma non c'è wsdl e la società dice che non ne fornisce uno.Elaborazione della risposta SOAP

Ho provato vari altri approcci, come SimpleXMLElement basato su esempi trovati qui e nel manuale PHP, ma non riesco a far funzionare nulla. Sospetto che gli spazi dei nomi facciano parte del mio problema. Qualcuno può suggerire un approccio o indicarmi un esempio simile - i miei sforzi di Google sono stati infruttuosi fino ad oggi.

Utilizzo di PHP 5.

risposta SOAP parziale (con tutte le cose di intestazione HTML che lo precede spogliò) si presenta così:

<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> 

Ho anche bisogno di essere in grado di determinare se un SOAP colpa è stata segnalata. XML per che assomiglia a questo:

<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> 

Utilizzando la risposta di Mr. Codice sono stato in grado di recuperare i dati dalle risposte non-fault. Ma ho bisogno di determinare il tipo di pacchetto con cui sto trattando ed estrarre i dati da entrambi i tipi. Sarebbe molto più semplice se solo fornissero un wsdl!

risposta

6

La tua risposta può essere analizzata con SimpleXML, ecco un esempio. Si noti che sto passando l'URL dello spazio dei nomi a children() per accedere agli elementi.

$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; 

uscite

gio nov 29 17:03:18 2012
SGS-005.005: transazione duplicata.

Codepad Demo

Edit: La risposta SoapFault può essere analizzato come qui di seguito. Produce la stringa guasto e dettagli, o 'No colpa trovato':

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

Grazie - che è esattamente quello che mi serviva - non avevo visto un esempio in cui entrambi i namespace sono state utilizzate in quel modo. – JonP

+0

L'esempio funziona perfettamente se ottengo una risposta valida, ma ho scoperto un'ulteriore "ruga" quando viene segnalato un errore di sapone. In questo caso ovviamente non esiste un secondo spazio dei nomi e non riesco a trovare un metodo semplice per determinare se esiste un elemento di errore e il suo contenuto. Puoi suggerire qualcosa? – JonP

+0

Aggiornare la domanda con un esempio della risposta di errore del sapone e dare un'occhiata. – MrCode