WSDL для PHP с использованием Basic Auth

Мне нужно построить php-классы из WSDL, который находится за основным auth.

У этого есть тонны пространств имен, таким образом это выглядит обременительным, чтобы сделать это вручную.

Я попробовал несколько инструментов, но похоже, что сеанс аутентификации не является настойчивым.

$options = array( 'login' => $username, 'password' => $password, ); $client = new SoapClient($wsdl, $options); 

Да, это работает! Я попытался в решении, которое я создавал, и он подключается к моему клиенту WS, который с HTTP Basic Auth.

HTTP Auth работает с клиентом SOAP, однако вы не можете получить доступ к защищенным паролем WSDL-файлам

См. https://bugs.php.net/bug.php?id=27777

Используя встроенный клиент SOAP, вы должны иметь что-то вроде этого:

 $options = array( 'login' => $username, 'password' => $password, ); $client = new SoapClient($wsdl, $options); 

Я решил это, используя lib nusoap . Посмотрите, помогает ли это

 $params = array( "param" => "value" ); $soap_client = new nusoap_client($wsdl_url, true); $soap_client->setCredentials(USER_SERVICE, PASS_SERVICE, 'basic'); $soap_client->soap_defencoding = 'UTF-8'; //Fix encode erro, if you need $soap_return = $soap_client->call("method_name", $params); 

Это простой пример аутентификации webservice с использованием soapClient

 $apiauth =array('UserName'=>'abcusername','Password'=>'xyzpassword','UserCode'=>'1991'); $wsdl = 'http://sitename.com/service.asmx?WSDL'; $header = new SoapHeader('http://tempuri.org/', 'AuthHeader', $apiauth); $soap = new SoapClient($wsdl); $soap->__setSoapHeaders($header); $data = $soap->methodname($header); 

Этот код внутренне анализирует заголовок, как следует

 <soap:Header> <AuthHeader xmlns="http://tempuri.org/"> <UserName>abcusername</UserName> <Password>xyzpassword</Password> <UserCode>1991</UserCode> </AuthHeader> </soap:Header> 

я пытаюсь решить эту проблему, но из того, что я понимаю, подключение к клиенту sapl + httpauth больше связано с использованием клиентских подключений. Я искал Google и, насколько я понимаю, при решении моей проблемы вы также можете использовать приведенный ниже пример для решения своей проблемы (используя информацию HttpAuth в настройках url и soapClient).

 $username="test"; $password="test"; $url = "https://".urlencode($username).":".urlencode($password)."@example.com/service.asmx?WSDL"; $context = stream_context_create([ 'ssl' => [ // set some SSL/TLS specific options 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, ]]); $client = new SoapClient($url, [ 'location' => $url, 'uri' => $url, 'stream_context' => $context, 'login' => $username, 'password' => $password ]); $params=array( 'operation'=>'arguments', 'and'=>'other bull', 'goes'=>'here' ); $response = $client->__soapCall('OperationName', array($params)); 

Как насчет этого решения:

  1. Загрузите WSDL и сохраните в локальный файл
  2. Создание SoapClient с локальным файлом

Что-то вроде этого (в упрощенной версии):

 class MySoap { private $WSDL = 'https://secure-wsdl.url?wsdl'; private $USERNAME = 'dummy'; private $PASSWORD = 'dummy'; private $soapclient; private function localWSDL() { $local_file_name = 'local.wsdl'; $local_file_path = 'path/to/file/'.$local_file_name; // Cache local file for 1 day if (filemtime($local_file_path) < time() - 86400) { // Modify URL to format http://[username]:[password]@[wsdl_url] $WSDL_URL = preg_replace('/^https:\/\//', "https://{$this->USERNAME}:{$this->PASSWORD}@", $this->WSDL); $wsdl_content = file_get_contents($WSDL_URL); if ($wsdl_content === FALSE) { throw new Exception("Download error"); } if (file_put_contents($local_file_path, $wsdl_content) === false) { throw new Exception("Write error"); } } return $local_file_path; } private function getSoap() { if ( ! $this->soapclient ) { $this->soapclient = new SoapClient($this->localWSDL(), array( 'login' => $this->USERNAME, 'password' => $this->PASSWORD, )); } return $this->soapclient; } public function callWs() { $this->getSoap()->wsMethod(); } } 

Меня устраивает 🙂