J'ai besoin de construire des classes php à partir d'un WSDL qui est derrière l'authentification de base.
Il a des tonnes d'espaces de noms, il est donc fastidieux de le faire à la main.
J'ai essayé quelques outils, mais il semble que la session d'authentification n'est pas persistante.
$options = array(
'login' => $username,
'password' => $password,
);
$client = new SoapClient($wsdl, $options);
Oui cela fonctionne! J'ai essayé une solution que je construisais et qui se connecte à mon client WS qui est avec HTTP Basic Auth.
L'authentification HTTP fonctionne avec le client SOAP, mais vous ne pouvez pas accéder aux fichiers WSDL protégés par mot de passe.
En utilisant le client SOAP intégré, vous devriez avoir quelque chose comme ceci:
$options = array(
'login' => $username,
'password' => $password,
);
$client = new SoapClient($wsdl, $options);
J'ai résolu ce problème en utilisant lib nusoap . Voir si ça aide
$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);
Que diriez-vous de cette solution:
Quelque chose comme ça (dans une version simplifiée):
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();
}
}
Ça marche pour moi :)
Ceci est un exemple simple d'authentification de webservice à l'aide de 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);
Ce code analyse en interne l'en-tête comme suit
<soap:Header>
<AuthHeader xmlns="http://tempuri.org/">
<UserName>abcusername</UserName>
<Password>xyzpassword</Password>
<UserCode>1991</UserCode>
</AuthHeader>
</soap:Header>
j'ai essayé de résoudre ce problème, mais d'après ce que j'ai compris, les connexions client de savon aux services Web ssl + httpauth sont plus pénibles. J’ai cherché sur Google et, d’après ce que j’ai compris, une fois mon problème résolu, vous pouvez également utiliser l’exemple ci-dessous pour résoudre votre problème (en utilisant les informations HttpAuth dans les configurations url et 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));