[其他类似问题并没有帮助我解决这个问题。
我必须从我的Web服务器调用另一个外部SOAP API来使用客户端证书+私钥组合来检索WSDL文件。
$wsdl = 'https://www.example.com?wsdl';
$endpoint = 'https://www.example.com';
$sslContext = stream_context_create($contextOptions);
$options = [
'local_cert' => '/var/www/combo.pem',
'passphrase' => 'Pass1',
'cache_wsdl' => WSDL_CACHE_MEMORY,
'trace' => 1,
'stream_context' => stream_context_create([
'ssl' => [
'ciphers' => 'RC4-SHA',
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
])
];
try{
$soapClient = new SoapClient($wsdl, $options);
}
catch(Exception $e)
{
var_dump($e);
}
我收到的错误是:SOAP错误:解析WSDL:无法从'..domain ..'加载:无法加载外部实体“ ..domain ..?wsdl”
我尝试了许多设置,但这些设置都没有改变此响应。我未尝试任何设置,为空数组。
有效的方法:
通过CURL建立原始连接,因此证书文件很好
从SoapUI检索WSDL信息,因此WSDL目标是正确的,并且证书文件是可以的
phpinfo()返回SoapClient已启用,OpenSSL已启用。我还能尝试或检查什么?
SOAP错误可能来自无效的字符编码,或者当您查询远程服务器时,可能缺少一些HTTP标头,例如'User-Agent。
尝试将User-Agent添加到以下示例中的选项。
$options = array(
'http' => array(
'user_agent' => 'PHP_Embedded_Soap_Client'
)
);
PS:我不建议对以下密码使用严格的密码:RC4-SHA
我想对此进行评论,但是基于其他人使用file_get_contents
的建议以及您的答复提到它返回了false,我现在可以确定这更多是一个连接问题。请检查以下内容:
$wsdl
值与发布的值不同,但是请确保代码中未发生.com?wsdl
。它应该是.com/?wsdl
。如果以上方法均无帮助。您可能会考虑使用其他工具(例如cURL
)并在其他计算机上下载WSDL内容,以确定问题的原因。