web-dev-qa-db-fra.com

SOAP-ERROR: Analyse de WSDL: Impossible de charger à partir de - mais fonctionne sur WAMP

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é

Erreur

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"

Appeler l'URL depuis PHP

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;

Erreur

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

Appeler l'URL depuis la ligne de commande

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
49
clarkk

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();
}

Modifier

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.

65
Ivar

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);
9
gogagubi

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.

4
Attila Szeremi

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.

4
klugerama

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!

3
EmRa228

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. 

2
Madan

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);
0
Juan Fernando

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 ...

0
Yohann Nizon