SOAP 错误:解析 WSDL:无法从 加载 - 但在 WAMP 上工作错误从 PHP 调用 URL错误从命令行调用 URL编辑

2022-08-30 09:19:12

这在我的WAMP服务器上工作正常,但在Linux主服务器上不起作用!?

try{
    $client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
    $result = $client->checkVat([
        'countryCode' => 'DK',
        'vatNumber' => '47458714'
    ]);
    print_r($result);
}
catch(Exception $e){
    echo $e->getMessage();
}

我在这里错过了什么?!:(

SOAP 已启用

错误

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"/taxation_customs/vies/checkVatService.wsdl"

从 PHP 调用 URL

从 PHP 调用 URL 返回错误

$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;

错误

Warning:  file_get_contents(http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable

从命令行调用 URL

从 linux 命令行调用 URL 将返回 XML 响应HTTP 200

curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

答案 1

对于某些版本的 php,SoapClient 不会发送 http 用户代理信息。您在服务器上拥有哪些php版本与本地WAMP?

尝试使用上下文流显式设置用户代理,如下所示:

try {
    $opts = array(
        'http' => array(
            'user_agent' => 'PHPSoapClient'
        )
    );
    $context = stream_context_create($opts);

    $wsdlUrl = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
    $soapClientOptions = array(
        'stream_context' => $context,
        'cache_wsdl' => WSDL_CACHE_NONE
    );

    $client = new SoapClient($wsdlUrl, $soapClientOptions);

    $checkVatParameters = array(
        'countryCode' => 'DK',
        'vatNumber' => '47458714'
    );

    $result = $client->checkVat($checkVatParameters);
    print_r($result);
}
catch(Exception $e) {
    echo $e->getMessage();
}

编辑

实际上,这似乎是您正在使用的Web服务的一些问题。基于 IPv6 的 HTTP 和缺少 HTTP 用户代理字符串的组合似乎给 Web 服务带来了问题。

要验证这一点,请在 Linux 主机上尝试以下操作:

curl  -A ''  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

此 IPv6 请求失败。

curl  -A 'cURL User Agent'  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

此 IPv6 请求成功。

curl  -A ''  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
curl  -A 'cURL User Agent'  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

这两个 IPv4 请求都成功。

有趣的案例:)我猜你的linux主机 ec.europa.eu 解析为IPv6地址,并且你的SoapClient版本默认情况下没有添加用户代理字符串。


答案 2

安全问题:此答案禁用安全功能,不应在生产中使用!

试试这个。我希望它有帮助

$options = [
    'cache_wsdl'     => WSDL_CACHE_NONE,
    'trace'          => 1,
    'stream_context' => stream_context_create(
        [
            'ssl' => [
                'verify_peer'       => false,
                'verify_peer_name'  => false,
                'allow_self_signed' => true
            ]
        ]
    )
];

$client = new SoapClient($url, $options);

推荐