2012-11-30 38 views
5

Tôi đang cố gắng xử lý phản hồi SOAP từ Cổng toàn cầu của dữ liệu thứ nhất. Tôi đã sử dụng SoapClient trước đây, nhưng không có wsdl - và công ty nói rằng họ không cung cấp một.Xử lý phản hồi SOAP

Tôi đã thử nhiều cách tiếp cận khác như SimpleXMLElement dựa trên các ví dụ được tìm thấy ở đây và trong hướng dẫn sử dụng PHP nhưng tôi không thể làm được gì cả. Tôi nghi ngờ không gian tên là một phần của vấn đề của tôi. Bất cứ ai có thể đề xuất một cách tiếp cận hoặc chỉ cho tôi một ví dụ tương tự - những nỗ lực của Google của tôi đã không có hiệu lực cho đến nay.

Sử dụng PHP 5.

phần đáp ứng SOAP (với tất cả những thứ tiêu đề HTML đứng trước cởi) trông như thế này:

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

Tôi cũng cần để có thể xác định xem một SOAP lỗi đã được báo hiệu. XML cho hình như sau:

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

Sử dụng câu trả lời của ông. Tôi đã có thể truy xuất dữ liệu từ phản hồi không có lỗi. Nhưng tôi cần phải xác định loại gói tôi đang xử lý và trích xuất dữ liệu từ cả hai loại. Nó sẽ dễ dàng hơn nhiều nếu chỉ có họ sẽ cung cấp một wsdl!

Trả lời

6

Phản hồi của bạn có thể được phân tích cú pháp bằng SimpleXML, đây là một ví dụ. Lưu ý tôi đang chuyển URL không gian tên tới children() để truy cập các phần tử.

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

Đầu ra

Thu Nov 29 17:03:18 2012
SGS-005.005: giao dịch trùng lặp.

Codepad Demo

Edit: Các phản ứng SoapFault thể được phân tích như dưới đây. Nó xuất ra chuỗi lỗi và chi tiết, hoặc 'Không tìm thấy lỗi':

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

Cảm ơn - đó chính xác là những gì tôi cần - Tôi chưa thấy một ví dụ mà cả hai không gian tên đều được tham chiếu như thế. – JonP

+0

Ví dụ này hoạt động tốt nếu tôi nhận được phản hồi hợp lệ, nhưng tôi đã phát hiện thêm "nhăn" khi có lỗi báo hiệu. Trong trường hợp đó, tất nhiên không có không gian tên thứ hai và tôi không thể làm việc ra một phương pháp đơn giản để xác định nếu có một yếu tố lỗi và nội dung của nó. Bạn có thể gợi ý gì không? – JonP

+0

Cập nhật câu hỏi bằng một ví dụ về phản ứng lỗi xà phòng và bị bệnh. – MrCode

Các vấn đề liên quan