PHP SOAP 请求不适用于 WSDL

PHP SOAP request not working with WSDL

我正在尝试使用名为 Chaverweb 的 SOAP 服务。我有他们的 WSDL;这是 here.

当我尝试发出像 GetCWVersion 这样的简单请求时,它可以正常工作,但每当我尝试请求需要某种身份验证的功能时,例如 Get_Syn_Comsend(获取研究所的详细信息) ), 它不起作用。

我尝试按照 WSDL 中的规定设置 AuthHeader,但它不起作用。

这是我的代码。我希望有一些明显的事情我没有做,因为这是我第一次使用 SOAP:

try {
    $soapClient = new SoapClient('https://www.chaverweb.net/Synagogue.asmx?WSDL');
    $header = new SoapHeader('https://www.chaverweb.net/webservices/', 'AuthHeader', array("Username"=>"xx@yy.com", "Password"=>"...", "SynKey"=>"..."), false);
    $header2 = new SoapHeader('https://www.chaverweb.net/webservices/', 'SFHeader', array("sf"=>""), false);


    $soapClient->__setSoapHeaders(array($header, $header2));
    $versionResponse = $soapClient->Get_Syn_Comsend();
    print_r($versionResponse);
} catch (SoapFault $exception) {
    echo "Exception: " . $exception->getMessage();
}

顺便说一下,这给了我:stdClass Object ( ) 非常感谢!

所以我直接做了一些测试,很简单:

在 WSDL 上返回无效登录。

http://phpfiddle.org/main/code/3pvp-8wi9

您可以在此处查看我的代码和测试。当您测试时,在 TestFunction() 中使用他们的 bulit 而不是您想要 运行 的函数,这样您就可以看到错误在哪里。让我知道如何提供更多帮助。

编辑前,这是我的回复:

您首先需要确保您上次发送的完成该功能的请求没有错误。还要检查是否收到了响应。这可能有助于调试为什么要开始这样做。只需添加这两行代码,让我们知道您看到了什么:

print_r($soapClient->__getLastRequest());
print_r($soapClient->__getLastResponse());

此处的关键是确保您正确接收到响应。 Post 此响应,我很乐意帮助您调试它。

仅供思考,这里是我将如何设置此请求(未测试),但您的 wsdl 中的定义显示您需要使用文字,而 SoapClient 在解释时并不总是使用正确的文档类型回应:

ini_set("soap.wsdl_cache_enabled", "0");
try {
$options = array('trace'=>1,
                 'exceptions'=> 1,
                 'style'=> SOAP_DOCUMENT,
                 'use'=> SOAP_LITERAL 
                ); 

$soapClient = new SoapClient('https://www.chaverweb.net/Synagogue.asmx?WSDL',$options);
$header = new SoapHeader('https://www.chaverweb.net/webservices/', 'AuthHeader', array("Username"=>"ofer.ungar@gmail.com", "Password"=>"demo1234!", "SynKey"=>"T21982011213"), false);
    $header2 = new SoapHeader('https://www.chaverweb.net/webservices/', 'SFHeader', array("sf"=>""), false);


    $soapClient->__setSoapHeaders(array($header, $header2));
    $versionResponse = $soapClient->Get_Syn_Comsend();

    print_r($versionResponse->Get_Syn_ComsendSoapOut);

    } catch (SOAPFault $f) {
     print $f;
    }

希望这对您有所帮助!发送您的结果以获得进一步帮助:)

POST 为 SIMPLXML 测试编辑: 替换:

print_r($versionResponse->Get_Syn_ComsendSoapOut);

有了这个:

$data = simplexml_load_file($versionResponse->Get_Syn_ComsendSoapOut);
print_r($data);

看看它给你带来了什么,希望它要么抛出描述性错误,要么处理结果(非常罕见,但有可能)!