2012-04-25 4 views
2

Я пытаюсь установить соединение SOAP, используя следующий PHP код, и он терпит неудачу в точке SoapClient конструкции:SoapClient LibXMLError: не удалось загрузить внешний объект, SOAP-ERROR: Разбор WSDL: Не удалось загрузить

// Need to declare these settings here because our php.ini has alternate 
// settings due to global purposes for other PHP scripts 
ini_set("soap.wsdl_cache_enabled", "0"); 
ini_set("soap.wsdl_cache", "0"); 
ini_set("display_errors","On"); 
ini_set("track_errors","On"); 

// FedEx web services URL, note the HTTPS 
$path_to_wsdl = 'https://wsbeta.fedex.com/web-services'; 

$soap_args = array(
    'exceptions'=>true, 
    'cache_wsdl'=>WSDL_CACHE_NONE, 
    'trace'=>1) 
; 

try { 
    $client = new SoapClient($path_to_wsdl,$soap_args); 
} catch (SoapFault $e) { 
    var_dump(libxml_get_last_error()); 
    echo "<BR><BR>"; 
    var_dump($e); 
} 

Это выходы:

object(LibXMLError)#1 (6) { 
    ["level"]=> int(1) 
    ["code"]=> int(1549) 
    ["column"]=> int(0) 
    ["message"]=> string(71) "failed to load external entity "https://wsbeta.fedex.com/web-services" " 
    ["file"]=> string(0) "" 
    ["line"]=> int(0) 
} 

object(SoapFault)#2 (9) { 
    ["message":protected]=> string(158) "SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://wsbeta.fedex.com/web-services' : failed to load external entity "https://wsbeta.fedex.com/web-services" " 
    ["string":"Exception":private]=> string(0) "" 
    ["code":protected]=> int(0) 
    ["file":protected]=> string(53) "/mnt/array/bell-enterprise/bell/fedex_shipservice.php" 
    ["line":protected]=> int(34) 
    ["trace":"Exception":private]=> array(1) { 
     [0]=> array(6) { 
      ["file"]=> string(53) "/mnt/array/bell-enterprise/bell/fedex_shipservice.php" 
      ["line"]=> int(34) 
      ["function"]=> string(10) "SoapClient" 
      ["class"]=> string(10) "SoapClient" 
      ["type"]=> string(2) "->" 
      ["args"]=> array(2) { 
       [0]=> string(37) "https://wsbeta.fedex.com/web-services" 
       [1]=> array(4) { 
        ["exceptions"]=> bool(true) 
        ["soap_version"]=> int(1) 
        ["cache_wsdl"]=> int(0) 
        ["trace"]=> int(1) 
       } 
      } 
     } 
    } 
    ["previous":"Exception":private]=> NULL 
    ["faultstring"]=> string(158) "SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://wsbeta.fedex.com/web-services' : failed to load external entity "https://wsbeta.fedex.com/web-services" " 
    ["faultcode"]=> string(4) "WSDL" 
} 

ответ

8

После 6 часов головной боли единственным решением является загрузка файлов WSDL.

https://wsbeta.fedex.com/web-services и https://ws.fedex.com/web-services

Он всегда будет выдавать ошибку 500, потому что это не WSDL.

После загрузки WSDL, из Технические ресурсы -> FedEx WebServices для судоходства -> GetStarted (нажмите на кнопку «Стоимость услуг», а затем «Загрузить WSDL или XML»), в сценарии вам нужно будет загрузить ваш локально хранимый WSDL, и все будет работать как шарм.

$this->_soapClient = new SoapClient("RateService_v13.wsdl", array('exceptions'=>true, 'trace' => true)); 

Удачи!

+0

Спасибо, Джастин. Это то, что я в конце концов узнал, чтобы быть правдой, и, когда я прочитал этот оригинальный пост, я никогда не закрывал его с правильным ответом. На самом деле это правильное решение, которое я нахожу после нескольких часов избиения головы и стены. Документация FedEx в этом отношении ужасно отсутствует. – David

0

Вам понадобится локальный файл сертификата для доступа к WSDL по протоколу HTTPS:

$client = new SoapClient($wsdl, array('local_cert' => $pathToLocalCert)); 

Добавьте этот вариант к текущему $soap_args, и этот код должен работать должным образом. Опция passphrase также доступна, если она вам нужна для сертификата.

+0

Я уже делал это, и я удалил этот вариант, потому что это не изменило ситуацию. Сертификат не имел никакого влияния на выход. – David

+0

Включен ли 'allow_url_fopen' в настройках php.ini? – alganet

+0

Да, allow_url_fopen включен – David

2

Этот URL-адрес не является путём к WSDL, но URL-адрес SOAP-запросов должен идти. Никогда не работал с ребятами, но я думаю, вы можете получить файл wsdl где-то и сохранить его локально, и вы можете изменить конечную точку в этом wsdl на wsbeta. Я не могу найти, что wsdl и сайт fedex не позволяют мне идти дальше в своих технических ресурсах dev без регистрации, поэтому я оставлю это на этом: вы wsdl находится где-то в другом месте, у вас есть ссылка местоположение конкретной услуги.

+0

Спасибо Wrikken. Как было отмечено в ответе Джастина, я проверил его, потому что он был более точным и полным, поскольку это связано с моей проблемой, но ваш ответ также верен. – David

Смежные вопросы