2012-04-18 12 views
7

Potrzebuję zbudować klasy php z WSDL, który jest za podstawowym uwierzytelniania.WSDL na PHP z podstawowym Auth

Ma mnóstwo przestrzeni nazw, więc ręczne wykonanie tego zadania wydaje się uciążliwe.

Próbowałem kilku narzędzi, ale wygląda na to, że sesja auth nie jest wymagana.

+0

zobacz ten link ..... Ten link może pomóc .. http://stackoverflow.com/a/38784772/5634447 –

Odpowiedz

1

Korzystanie z wbudowanego klienta SOAP, trzeba mieć coś takiego:

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

Jak to jest odpowiedź? Zgodnie z https://bugs.php.net/bug.php?id=27777 uwierzytelnianie HTTP nie jest obsługiwane w ten sposób dla plików WSDL. – hakre

4

HTTP Auth działa z mydłem Klienta, jednak nie można uzyskać dostęp do chronionych hasłem plików WSDL

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

+0

Aby obejść ten problem, zobacz http://www.php.net/manual/soapclient.soapclient.php#101503 – hakre

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

Tak, to działa! Próbowałem w rozwiązaniu, które budowałem i łączy się z moim klientem WS, który jest z HTTP Basic Auth.

+1

Umożliwia to uwierzytelnianie w interfejsie API, ale z jakiegoś powodu nie korzysta z uwierzytelniania w celu pobrania pliku WSDL. –

1

Rozwiązałem to, używając biblioteki lib nusoap. Zobacz, czy to pomaga

$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

Jest to prosty przykład do uwierzytelniania przy użyciu usługa 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);   

Ten kod wewnętrznie analizować nagłówek jak postępować

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

Próbowałem rozwiązać ten problem, ale z tego co rozumiem, połączenia mydła z usługami internetowymi ssl + httpauth są bardziej bolesne. Zrobiłem i googled iz tego co rozumiem, z moim problemem jest rozwiązany, możesz użyć poniższego przykładu, aby rozwiązać swój problem (przy użyciu informacji HttpAuth zarówno w url i konfiguracji 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

Jak o tym rozwiązaniu:

  1. pobrać WSDL i zapisać do pliku lokalnego
  2. Tworzenie SoapClient z lokalnego pliku

coś takiego (w wersji uproszczonej):

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

To działa dla mnie :)