这在我的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();
}
Run Code Online (Sandbox Code Playgroud)
我在这里想念的是什么?!:(
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"
Run Code Online (Sandbox Code Playgroud)
从PHP调用URL会返回错误
$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
从HTTP 200XML 命令行调用URL将返回XML响应
curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Run Code Online (Sandbox Code Playgroud)
Iva*_*var 72
对于某些版本的php,SoapClient不会发送http用户代理信息.您在服务器上与本地WAMP有什么PHP版本?
尝试使用上下文流显式设置用户代理,如下所示:
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();
}
Run Code Online (Sandbox Code Playgroud)
它实际上似乎是您正在使用的Web服务的一些问题.HTTP over IPv6和缺少HTTP用户代理字符串的组合似乎给Web服务带来了问题.
要验证这一点,请在Linux主机上尝试以下操作:
curl -A '' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Run Code Online (Sandbox Code Playgroud)
此IPv6请求失败.
curl -A 'cURL User Agent' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Run Code Online (Sandbox Code Playgroud)
此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
Run Code Online (Sandbox Code Playgroud)
这两个IPv4请求都成功了.
有趣的案例:)我猜您的linux主机将ec.europa.eu解析为其IPv6地址,并且您的SoapClient版本默认情况下未添加用户代理字符串.
gog*_*ubi 14
试试这个.我希望它有所帮助
$options = [
'cache_wsdl' => 0,
'trace' => 1,
'stream_context' => stream_context_create(
[
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]
)
];
$client = new SoapClient($url, $options);
Run Code Online (Sandbox Code Playgroud)
可能是由于禁用了libxml实体加载器导致的。
libxml_disable_entity_loader(false);在实例化之前尝试运行SoapClient。
尽管这个问题没有准确的答案,但它可能对某人有所帮助。
我的soap url有一个非标准端口(例如9087),防火墙阻止了该请求,每次出现此错误时我都会接受:
错误 - 2017-12-19 20:44:11 --> 致命错误 - SOAP 错误:解析 WSDL:无法从“ http://soalurl.test:9087/orawsv?wsdl ”加载:无法加载外部实体“ http://soalurl.test:9087/orawsv?wsdl ”
我在防火墙中允许端口并解决了错误!