PHP soapclient wsdl SOAP-ERROR: 解析 WSDL: 无法从



我在stackoverflow中搜索过这里,但还没有找到解决我特定问题的方法。我一直收到错误

 SOAP-ERROR: Parsing WSDL: Couldnt load from "https://sampleurl.com/MerchantQueryService.asmx?WSDL" : failed to load external entity "https://sampleurl.com/MerchantQueryService.asmx?WSDL"

我正在尝试使用SOAP API和类似的URL

https://sampleurl.com/MerchantQueryService.asmx?WSDL 

我在本地主机上运行MAMP,并使用godaddy共享托管,我已经尝试过这两种方式,wsdl文件可以在这里找到

http://clemdemo.com/test.wsdl

在PHP中,我使用下面的代码

error_reporting(-1);
ini_set('display_errors', 'On');
ini_set('soap.wsdl_cache_enabled', 0);
echo "<pre>";
try {
$url     = "https://sampleurl.com/MerchantQueryService.asmx?WSDL ";
$headers = [
    'Host: sampleurl.com',
    'Connection: Keep-Alive',
    'User-Agent: PHP-SOAP/5.3.29',
    'Content-Type: text/xml; charset=utf-8',
    'SOAPAction: "RequestTransaction"',
    'Content-Length: 409'];
$rq = [
"userName" => "username_here",
"passWord" => "password_here",
"referenceId" => "3455566694",
"msisdn" => "346774313"];

try {
$cient = new SoapClient($url,
    [
    'soap_version' => SOAP_1_2,
    'exceptions' => 1,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'trace' => 1,
    'stream_context' => stream_context_create(array('http' => array('header' => $headers)))
]);
print_r($cient);
} catch (SoapFault $e) {
    echo "nFault Code: ".$e->faultcode;
    echo "nFault String: ".$e->faultstring;
}

在我的MAMP本地主机上,我有SOAP、openssl和curl。

此外,我还尝试使用(发送请求)到带有在线WSDL的APIhttp://wsdlbrowser.com它工作,但在使用PHP的代码上,它失败了

通常情况下,提供商会忽略他们的SSL证书,因此站点和服务最终会有无效的证书——我怀疑这里就是这样。

按照Kaii在这里描述的禁用证书验证,或者更好地让您的提供商修复他们的证书。

你的代码可能/应该是这样的:

$url     = "https://sampleurl.com/MerchantQueryService.asmx?WSDL ";
$context = stream_context_create(array(
        'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
        )
));
$rq = ["userName" => "username_here",
       "passWord" => "password_here",
       "referenceId" => "3455566694",
       "msisdn" => "346774313"];
$service = new SoapClient($url, array('stream_context' => $context));
$service->RequestTransaction($rq);

错误消息显示您的应用程序无法读取我们的WSDL。尝试从运行应用程序的同一台机器上打开浏览器,看看是否可以访问位于的WSDL地址https://sampleurl.com/MerchantQueryService.asmx?WSDL.

如果不是-您有网络/防火墙/防病毒问题。(万一)

如果您可以从浏览器访问此地址,您的应用程序是否仍存在此问题?然后检查任何可能阻碍防火墙的应用程序。(抗病毒是最可能的原因)

如果使用docker,则可能会因为OpenSSL默认安全级别而出错即使禁用了验证并允许在SoapClient选项中自签名

尝试将/etc/ssl/openssl.cnf中的seclevel从DEFAULT@SECLEVEL=2降低到

DEFAULT@SECLEVEL=1

或者只需添加到Dockerfile

RUN sed -i "s|DEFAULT@SECLEVEL=2|DEFAULT@SECLEVEL=1|g" /etc/ssl/openssl.cnf

签字人:https://github.com/dotnet/runtime/issues/30667#issuecomment-566482876


您可以通过在容器上运行来验证它

curl -A 'cURL User Agent' -4 https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/Auth?wsdl
  • 可以使用以下命令执行更好的诊断:libxml_get_last_error()
  • 可能缓存了错误的响应,在初始化对象时设置"cache_wsdl"=>wsdl_cache_NONE
  • 如果您跳过缓存,并在您的libxml错误中得到这个:

    LibXMLError对象([级别]=>1[代码]=>1549[列]=>0[message]=>加载外部实体"URL"失败[文件]=>[line]=>0)

没有Ubuntu上的描述,那么它就没有拉文件周期。你刚刚受到Ubuntu更新的影响。向他们挥手致意,然后重新启动。

最新更新