【发布时间】:2020-03-06 15:47:40
【问题描述】:
其他类似的问题并没有帮助我解决这个问题。
我必须使用客户端证书 + 私钥组合从我的网络服务器调用另一个外部 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-ERROR: Parsing WSDL: Couldn't load from '..domain..' : failed to load external entity "..domain..?wsdl"
我尝试了许多设置,但没有一个对这个响应有任何影响。我没试过设置,空数组。
什么有效:
通过 CURL 建立原始连接,所以证书文件没问题
从 SoapUI 检索 WSDL 信息,因此 WSDL 目标正确且证书文件正常
phpinfo() 返回 SoapClient 已启用,OpenSSL 已启用。我还能尝试或检查什么?
【问题讨论】:
-
您可以尝试通过简单的
file_get_contents加载 WSDL 以确保可以加载它 -
@NicoHaase 1) 我通过 SoapUI 加载了文件。它可以加载。 2) 我不确定 file_get_contents 是否可以使用客户端证书文件
-
file_get_contents可以使用与您在脚本中创建的相同的$context。确保可以加载 WSDL,以确保问题以任何方式连接到 SOAP 而不是网络/证书问题 -
@NicoHaase 无法使用 file_get_contents 完成此操作,该值始终为 false。我设法通过从 SoapUI 下载 wsdl 文件来加载它。我仍然无法连接以提出请求。
-
好吧,如果请求失败,
file_get_contents会产生false。这意味着:即使失败了,您在连接到该服务器时也会遇到严重问题。另一方面,这意味着您不一定会遇到与 SOAP 相关的问题
标签: php web-services soap wsdl soap-client