我在php的SoapClient
中有一些非常奇怪的行为。我已经在SoapUI中使用了wsdl来检索XML以供使用,这非常有效。
这是我正在尝试做的简化版本:(别担心,它是一个带有测试凭据的公共访问服务,没有任何敏感信息)
<?php
$client = new SoapClient('https://secure.paygate.co.za/payhost/process.trans?wsdl', array('trace'=>1));
$body = '
<pay:PingRequest>
<pay:Account>
<pay:PayGateId>10011072130</pay:PayGateId>
<pay:Password>test</pay:Password>
</pay:Account>
<pay:Identifier/>
<!--Zero or more repetitions:-->
<pay:UserDefinedFields>
<pay:key>Timestamp</pay:key>
<pay:value>2018-03-09 12:41:09</pay:value>
</pay:UserDefinedFields>
</pay:PingRequest>';
try {
print_r($client->Ping($body));
} catch (Exception $e) {
print_r(
array(
'request' => $client->__getLastRequest(),
'response' => $client->__getLastResponse()
)
);
}
输出:
php soaptest.php
Array
(
[request] => <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.paygate.co.za/PayHOST"><SOAP-ENV:Body><ns1:PingRequest/></SOAP-ENV:Body></SOAP-ENV:Envelope>
[response] => <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Client</faultcode><faultstring xml:lang="en">Validation error</faultstring><detail><payhost:error xmlns:payhost="http://www.paygate.co.za/PayHOST">cvc-complex-type.2.4.b: The content of element 'ns1:PingRequest' is not complete. One of '{"http://www.paygate.co.za/PayHOST":Account}' is expected.</payhost:error></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
)
我正在发出一个失败的请求,并且在尝试查找原因时,我正在使用客户端的__getLastRequest
方法,该方法返回一个空的PingRequest
元素,显然不是通过的它。
返回的验证错误表明Account
元素中没有PingRequest
元素,这会让我相信在发送请求之前修改了XML并且我的原始XML请求正文未提交。当然,这纯粹是猜想,但我对此感到茫然。
我已经与当天最好的部分进行了斗争,无法深入了解,最糟糕的部分是了解SoapUI中的XML工作。任何帮助将不胜感激。