2012-04-18 110 views
7

Necesito construir clases de PHP desde un WSDL que está detrás de la autenticación básica.WSDL a PHP con autenticación básica

Tiene un montón de espacios de nombres por lo que parece oneroso hacerlo a mano.

He intentado algunas herramientas, pero parece que la sesión de autenticación no es constante.

+0

ver este enlace ..... Este enlace puede ayudarlo .. http://stackoverflow.com/a/38784772/5634447 –

Respuesta

1

utilizando una función de cliente SOAP, debe tener algo como esto:

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

¿Cómo es esta una respuesta? De acuerdo con https://bugs.php.net/bug.php?id=27777 la autenticación HTTP no es compatible con los archivos WSDL de esa manera. – hakre

4

HTTP de autenticación trabaja con cliente SOAP, sin embargo no se puede acceder a archivos protegidos con contraseña WSDL

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

+0

Para una solución alternativa, consulte http://www.php.net/manual/soapclient.soapclient.php#101503 – hakre

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

Sí, funciona! Intenté una solución que estaba construyendo y se conecta a mi cliente WS, que es con HTTP Basic Auth.

+1

Esto funciona para la autenticación en la API, pero no usa la autenticación para recuperar el WSDL, por alguna razón. –

1

Lo resolví utilizando la lib nusoap. Ver si ayuda

$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); 
0

Este es un ejemplo simple para autenticar servicio web utilizando 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);   

Este código analizar internamente cabecera de la siguiente manera

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

que he estado tratando de resolver este problema, pero por lo que entiendo, las conexiones de los clientes de jabones a los servicios web de ssl + httpauth son más dolorosas. Busqué en Google y, por lo que entiendo, con mi problema resuelto, puedes usar el ejemplo a continuación para resolver tu problema también (usando las informaciones de HttpAuth tanto en la configuración de url como en la de 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)); 
0

¿Qué hay de esta solución:

  1. Descargar el WSDL y guardar en un archivo local
  2. Crear SoapClient con el archivo local

Algo como esto (en una versión simplificada):

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

Funciona para mí :)

Cuestiones relacionadas