2012-11-30 24 views
5

First DataのグローバルゲートウェイからSOAP応答を処理しようとしています。以前はSoapClientを使っていましたが、wsdlはありません。SOAP応答の処理

私はここにあるサンプルとPHPマニュアルに基づいてSimpleXMLElementなどのさまざまなアプローチを試しましたが、何もできません。私は名前空間が私の問題の一部だと思う。誰かがアプローチを提案したり、同じような例を私に指摘することができますか?私のGoogleの取り組みはこれまで実りありませんでした。私はまた、SOAPかどうかを判断できるようにする必要があります

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

:(それは剥がさの前に、すべてのHTMLヘッダーのものと)PHP 5

部分のSOAP応答を使用した

はこのようになります断層が合図された。そのためのXMLは次のようになります。

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

私は非障害応答からデータを取得することができたミスター・コードの答えを使用します。しかし、私はどのタイプのパケットを扱っているのかを判断し、両方のタイプからデータを抽出する必要があります。彼らだけがwsdlを供給すればもっと簡単になるでしょう!

答えて

6

あなたの応答はSimpleXMLで解析できます。ここでは例を示します。要素にアクセスするために、名前空間URLをchildren()に渡しています。

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

出力

木11月29日17時03分18秒2012
SGS-005005:重複トランザクション。

Codepad Demo

編集:にSoapFault応答は以下のように解析することができます。障害の文字列と詳細、または「No fault found」が出力されます。

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

ありがとう - これは私が必要としていたものです。両方の名前空間が同じように参照されている例は見ていませんでした。 – JonP

+0

有効な応答が得られればこの例は美しく動作しますが、私は石けんの故障が通知されたときに余分な「しわ」を発見しました。その場合、もちろん第2の名前空間は存在せず、障害要素とその内容が存在するかどうかを判断する簡単な方法はありません。あなたは何かを提案できますか? – JonP

+0

質問を石鹸のフォールトレスポンスの例で更新してみてください。 – MrCode