PHP SoapClient请求主体与提供给它的请求主体不匹配

时间:2018-06-15 15:01:02

标签: php soap soap-client

我在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工作。任何帮助将不胜感激。

0 个答案:

没有答案