2012-11-30 3 views
5

First Data Global Gateway'den bir SOAP yanıtı işlemeye çalışıyorum. Daha önce SoapClient kullandım, ama wsdl yok - ve şirket bir tane tedarik etmediklerini söylüyor.SOAP yanıtı işleniyor

Burada ve PHP el kitabında bulunan örneklere dayanarak SimpleXMLElement gibi çeşitli diğer yaklaşımları denedim, ancak çalışmak için hiçbir şey alamıyorum. İsim alanlarının benim sorunumun bir parçası olduğunu sanıyorum. Herkes bir yaklaşım önerebilir veya benzer bir örneğe işaret edebilir mi? Google çabalarım bugüne kadar verimsiz olmuştur. (Bu sıyrılıp önce gelen tüm HTML başlığı şeylerle) PHP 5.

Kısmi SABUN Yanıtını kullanma

şuna benzer:

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

Ben de bir SOAP olmadığını belirlemek için gerekiyor Arıza bildirildi. Ben arıza olmayan yanıtları veri almak mümkün olmuştur Sn Code'un cevabını kullanma

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

: Bunun için XML buna benzemez. Ama ne tür paketlerle uğraştığımı ve her iki türden veri almam gerektiğini belirlemem gerekiyor. Sadece bir wsdl sağlayabileceklerse çok daha kolay olurdu!

cevap

6

Yanıtınız SimpleXML ile ayrıştırılabilir, işte bir örnek. Öğelere erişmek için ad alanı URL'sini children()'a iletiyorum.

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

Çıkışlar

Per Kas 29 17:03:18 2012
SGS-005005: Yinelenen işlem.

Codepad Demo

Düzenleme

: SoapFault tepkisi aşağıda gibi çözümlenebilir. Hata dize ve ayrıntıları veya 'Hata yok' çıktı:

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

Teşekkürler - tam olarak ihtiyacım olan şey buydu - her iki ad alanının bu şekilde referans edildiği bir örnek görmedim. – JonP

+0

Örnek, geçerli bir yanıt alırsam güzel çalışır, ancak bir sabun hatası bildirildiğinde fazladan bir "kırışıklık" keşfettim. Bu durumda, elbette ikinci bir isim alanı yoktur ve bir hata unsuru ve içeriğinin olup olmadığını belirleme basit bir yöntemle çalışamıyorum. Bir şey önerebilir misin? – JonP

+0

Soruyu sabun hata yanıtının bir örneğiyle güncelleyin ve bir göz atın. – MrCode