5

First Data の Global Gateway からの SOAP 応答を処理しようとしています。以前に SoapClient を使用したことがありますが、wsdl はありません。また、wsdl は提供していないと会社は言っています。

ここやPHPマニュアルにある例に基づいて、SimpleXMLElementなどの他のさまざまなアプローチを試しましたが、何も機能しません。名前空間が私の問題の一部であると思われます。誰かがアプローチを提案したり、同様の例を教えてくれたりできますか.

PHP 5 を使用しています。

部分的な SOAP 応答 (その前にあるすべての HTML ヘッダーが削除された状態) は、次のようになります。

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

また、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を提供するだけなら、とても簡単です!

4

1 に答える 1

6

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

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

出力

Thu Nov 29 17:03:18 2012
SGS-005005: トランザクションが重複しています。

コードパッドのデモ

編集: SoapFault 応答は以下のように解析できます。障害文字列と詳細、または「障害が見つかりません」を出力します。

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...';
}
于 2012-11-30T17:46:02.210 に答える