Cela fonctionne bien sur mon serveur WAMP, mais ne fonctionne pas sur le serveur maître 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();
}
Qu'est-ce que j'oublie ici?! :(
SOAP est activé
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"
L'appel de l'URL depuis PHP renvoie une erreur
$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
L'appel de l'URL à partir de la ligne de commande linux HTTP 200
est renvoyé avec une réponse XML
curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Pour certaines versions de php, SoapClient n'envoie pas d'informations sur l'agent utilisateur http. Quelles versions php avez-vous sur le serveur par rapport à votre WAMP local?
Essayez de définir l'agent utilisateur explicitement, en utilisant un flux de contexte comme suit:
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();
}
Il semble en fait que le service Web que vous utilisez pose problème. La combinaison de HTTP sur IPv6 et de la chaîne manquante de l'agent d'utilisateur HTTP semble donner des problèmes au service Web.
Pour vérifier cela, essayez ce qui suit sur votre hôte Linux:
curl -A '' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
cette demande IPv6 échoue.
curl -A 'cURL User Agent' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
cette demande IPv6 aboutit.
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
ces deux requêtes IPv4 aboutissent.
Cas intéressant :) Je suppose que votre hôte Linux résout ec.europa.eu en son adresse IPv6 et que votre version de SoapClient n’a pas ajouté de chaîne d’agent utilisateur par défaut.
Essaye ça. J'espère que ça aide
$options = array(
'cache_wsdl' => 0,
'trace' => 1,
'stream_context' => stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
))
$client = new SoapClient(url, $options);
Ce problème peut être dû à la désactivation du chargeur d'entités libxml.
Essayez d’exécuter libxml_disable_entity_loader(false);
avant d’instancier SoapClient
.
Essayez de changer
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
à
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true, 'cache_wsdl' => WSDL_CACHE_MEMORY]);
De plus (que cela fonctionne ou non), assurez-vous que /tmp
est accessible en écriture par votre serveur Web et qu'il n'est pas plein.
Cela peut être utile pour quelqu'un, bien qu'il n'y ait pas de réponse précise à cette question.
Mon URL de soap a un port non standard (9087 par exemple), et le pare-feu a bloqué cette demande et j'ai pris à chaque fois cette erreur:
ERROR - 2017-12-19 20:44:11 -> Erreur fatale - SOAP-ERROR: Analyse syntaxique WSDL: Impossible de charger à partir de ' http: //soalurl.test: 9087/orawsv? Wsdl ': n'a pas pu charger l'entité externe " http: //soalurl.test: 9087/orawsv? wsdl "
J'ai autorisé le port dans le pare-feu et résolu l'erreur!
503 signifie que les fonctions fonctionnent et que vous obtenez une réponse du serveur distant vous refusant. Si vous avez déjà essayé de cURL Google résultats, la même chose se produit, car ils peuvent détecter l'agent utilisateur utilisé par file_get_contents et cURL et bloquer ainsi ces agents utilisateurs. Il est également possible que l'adresse IP du serveur auquel vous accédez soit également bloquée pour de telles pratiques.
Il existe principalement trois raisons pour lesquelles les commandes ne fonctionnent pas comme le navigateur dans une situation distante.
1) Le USER-AGENT par défaut a été bloqué . 2) Le blocage IP de votre serveur a été bloqué . 3) L'hôte distant a une détection de proxy.
Essayez d’activer l’extension openssl dans votre php.ini s’il est désactivé . Ainsi, je pourrais accéder au service Web sans avoir besoin d’arguments supplémentaires,
$client = new SoapClient(url);
J'utilise l'API AdWords et parfois le même problème… .. Ma solution consiste à ajouter Ini_set ('default_socket_timeout', 900); Sur le fichier Vendor\googleads\googleads-php -lib\src\Google\AdsApi\AdsSoapClient.php ligne 65
et dans la ligne vendor\googleads-php-lib\src\Google\AdsApi\Adwords\Reporting\v201702\ReportDownloader.php 126 ini_set ('default_socket_timeout', 900); $ requestOptions ['. stream_context '] [' http '] [' timeout '] = "900";
Le package Google remplace le paramètre php.ini par défaut.
Parfois, la page pouvait se connecter à ' https://adwords.google.com/ap i/adwords/mcm/v201702/ManagedCustomerService? wsdl et parfois non . Si la page se connecte une fois, le cache WSDL contiendra la même page et le programme sera ok jusqu'à ce que le code rafraîchit le cache ...