即使有响应,PHP SoapClient也会返回null

时间:2017-09-04 14:32:13

标签: php wsdl soap-client

使用PHP SoapClient,我在https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl调用WSDL,然后得到以下xml响应(由$soapclient->__last_response指示)

<?xml version='1.0' encoding='UTF-8'?><soap:Envelope xmlns:ede="http://ede.de/webservices" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Body><Response action="ELC" requestId="1" version="1.0"><created>2017-09-04T16:04:46.556+02:00</created><StatusInformation>OK</StatusInformation><StatusCode>0</StatusCode><Payload><SalesOrderSimulateConfirmation><Items><Item><ID>10</ID><ProductID>0003062700050</ProductID><Price>2.970</Price><PositionPrice>2.970</PositionPrice><PriceUnit>1</PriceUnit><QuantityUnit>ST</QuantityUnit><QuantityAvailable>1</QuantityAvailable><QuantityProfile>1</QuantityProfile><Currency>EUR</Currency><Services /><Schedules>Geplante Liefertermine:  1 ST in KW 36.2017;</Schedules><Remark /><DangerMaterial /></Item></Items></SalesOrderSimulateConfirmation></Payload></Response></soap:Body></soap:Envelope>

然而,对$soapclient->simulateOrder()的调用会返回null

如何让PHP SoapClient返回一个对象而不是null?

注意:我用于soap调用的xml是通过覆盖SoapClient::__doRequest()手动生成的。 soap调用的代码如下所示:

$soapClient = new SoapClient('https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl', array(
    'cache_wsdl'   => WSDL_CACHE_NONE,
    'trace'        => true,
    'exceptions'   => true,
    'soap_version' => SOAP_1_2,
    'features'     => SOAP_SINGLE_ELEMENT_ARRAYS,
    'login' => '------', // cannot post here for security purposes
    'password' => '-----', // cannot post here for security purposes
    'stream_context' => (
        stream_context_create(array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
              )
         ))
));
$result = $soapClient->simulateOrder();

不会抛出异常,但$resultnull

3 个答案:

答案 0 :(得分:3)

问题是SSL设置,当我尝试在我的服务器上调用您的代码时引发的错误如下:

致命错误:未捕获的SoapFault异常:[WSDL] SOAP-ERROR:解析WSDL:无法从&#39; https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl&#39;加载:未能加载外部实体&#34; https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl&#34;在/home/repojarilo/public_html/sc.php:22堆栈跟踪:#0 /home/repojarilo/public_html/sc.php(22):SoapClient-&gt; SoapClient(&#39; https://webserv ... &#39;,数组)#1 {main}在第22行投放......

我假设您正在尝试使用自签名证书来处理代码,如请求中的SSL数组所示,但看起来SoapClient似乎没有注意它并且无论如何都会抛出错误。 / p>

所以我的解决方案是购买SSL(现在非常便宜,尝试诸如namecheap之类的网站等等)或使用类似https://letsencrypt.org/之类的东西来获取允许您的soap客户端工作的SSL正确。

最后我注意到了一个拼写错误,在您的代码中,您在));之前的一行中应该读取)));

答案 1 :(得分:1)

问题是SOAP需要有效的SSL证书。

对于测试服务器,它有时不值得付出努力,所以也许这个链接可以帮助你使用一点workarround,让你的SOAP-Request工作而不需要创建一个完全验证的SSL-Certificat:

http://automationrhapsody.com/send-soap-request-over-https-without-valid-certificates/

答案 2 :(得分:1)

问题不是您的证书作为客户端,而是服务器证书本身(尝试在浏览器中加载https://webservices-test.ede.de:9443/ibis/ws/WS_EXT_ELC?wsdl),这是无效的。您可以完全忽略它,因为服务器证书主要是为了避免网络钓鱼,我知道它确实是您试图达到的那个。在命令行curl中,这是使用-k选项实现的。在php,SoapClient中,您可以使用this(完全是您的问题,查看第三个答案,看看有关PHP7的内容)

注意:您正在SoapClient的每个构造中加载wsdl,即服务的定义文件。如果将$ soapclient存储为静态变量,则可以始终使用它的方法而无需重新创建客户端对象(因此,避免重新加载并重新解释wsdl文件,这可能会在1到5秒内完美延迟)所有时间。