2012-04-18 14 views
7

Ich muss PHP-Klassen aus einer WSDL, die hinter grundlegenden Auth ist.WSDL zu PHP mit Basic Auth

Es hat Tonnen von Namespaces, so dass es lästig scheint, dies von Hand zu tun.

Ich habe ein paar Tools ausprobiert, aber sieht aus wie die Auth-Sitzung ist nicht wünschenswert.

+0

siehe diesen Link ..... Dieser Link kann Ihnen helfen .. http://Stackoverflow.com/a/38784772/5634447 –

Antwort

1

in SOAP-Client integriert, sollten Sie etwas davon haben:

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

Wie ist das eine Antwort? Nach https://bugs.php.net/bug.php?id=27777 HTTP-Authentifizierung wird nicht für WSDL-Dateien auf diese Weise unterstützt. – hakre

4

HTTP Auth mit SOAP-Client arbeitet, jedoch können Sie nicht durch ein Passwort geschützt WSDL-Dateien zugreifen

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

+0

Für eine Problemumgehung, siehe http://www.php.net/manual/soapclient.soapclient.php#101503 – hakre

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

Ja, es funktioniert! Ich habe versucht, in einer Lösung, die ich baute, und es verbindet sich mit meinem Kunden WS, die mit HTTP Basic Auth ist.

+1

Dies funktioniert für die Authentifizierung in der API, aber nicht die Authentifizierung zum Abrufen der WSDL, aus irgendeinem Grund. –

1

Ich löste dies mit der lib nusoap. Sehen Sie, wenn es

$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

hilft, ist dieses einfache Beispiel Webservice zur Authentifizierung Soapclient mit

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

Dieser Code intern Header analysieren wie folgt

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

Ich habe versucht, zu lösen Dieses Problem, aber von dem, was ich verstehe, sind Soap-Client-Verbindungen zu SSL + HTTPAUTH Web-Dienste mehr Schmerzen. Ich habe gegoogelt und von dem, was ich verstehe, mit meinem Problem gelöst werden, können Sie das Beispiel unten verwenden, um Ihr Problem zu lösen (durch die Verwendung von HttpAuth Infos in beiden URL und SoapClient-Setup).

$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

Wie über diese Lösung:

  1. Laden Sie die WSDL und speichert in eine lokale Datei
  2. erstellen Soapclient mit der lokalen Datei

So etwas wie diese (in einer vereinfachten Version):

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

Es funktioniert für mich :)