2012-04-18 10 views
7

Ho bisogno di creare classi php da un WSDL che si trova dietro l'autenticazione di base.WSDL in PHP con autenticazione di base

Ha un sacco di spazi dei nomi, quindi sembra oneroso farlo a mano.

Ho provato alcuni strumenti ma sembra che la sessione di autenticazione non sia presistente.

+0

vedere questo collegamento ..... Questo collegamento può aiutarti .. http://stackoverflow.com/a/38784772/5634447 –

risposta

1

utilizzando built client SOAP, si dovrebbe avere qualcosa di simile:

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

Come è questa una risposta? Secondo https://bugs.php.net/bug.php?id=27777 l'autenticazione HTTP non è supportata per i file WSDL in questo modo. – hakre

4

HTTP Auth funziona con client SOAP, tuttavia non è possibile accedere ai file protetti da password WSDL

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

+0

Per una soluzione alternativa, vedere http://www.php.net/manual/soapclient.soapclient.php#101503 – hakre

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

Sì, funziona! Ho provato in una soluzione che stavo costruendo e si connette al mio cliente WS, che è con HTTP Basic Auth.

+1

Questo funziona per l'autenticazione nell'API, ma per qualche motivo non utilizza l'autenticazione per recuperare il WSDL. –

1

Ho risolto questo utilizzando il lib nusoap. Vedere se aiuta

$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

Questo è semplice esempio per l'autenticazione webservice utilizzando 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);   

Questo codice analizza internamente intestazione come seguo

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

Ho cercato di risolvere questo problema, ma da quello che ho capito, le connessioni di soap al ssl + servizi web di httpauth sono più dolorose. Ho cercato su google e da quello che ho capito, con il mio problema risolto, puoi usare l'esempio qui sotto per risolvere il tuo problema (usando le informazioni di HttpAuth sia nella configurazione di url che di 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

Che ne dite di questa soluzione:

  1. Scarica il WSDL e salvare in un file locale
  2. Creare SoapClient con il file locale

Qualcosa di simile (in una versione semplificata):

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

Funziona per me :)

Problemi correlati