2011-03-23 3 views
0

pour un projet J'ai besoin de contacter le service web d'une autre société. Ils ont fait sur Soap, et tout est détaillé etc. J'ai découvert les variables et les types et quelle méthode etc.ws-security et nusoap ne fonctionnent pas

Ils ont également déclaré que je devrais utiliser WS-security avec pwd et nom d'utilisateur dans les en-têtes.

Je fait cela avec nusoap:

require_once('../lib/nusoap.php'); 
$client = new nusoap_client("http://webservice.client.com/cir.asmx?WSDL", 'wsdl'); 
$err = $client->getError(); 
if ($err) { 
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>'; 
} 
$client->soap_defencoding = 'UTF-8'; 

$result = $client->call('GetLastUpdate'); 
// Check for a fault 
if ($client->fault) { 
    echo '<h2>Fault</h2><pre>'; 
    print_r($result); 
    echo '</pre>'; 
} else { 
    // Check for errors 
    $err = $client->getError(); 
    if ($err) { 
     // Display the error 
     echo '<h2>Error</h2><pre>' . $err . '</pre>'; 
    } else { 
     // Display the result 
     echo '<h2>Result</h2><pre>'; 
     print_r($result); 
     echo '</pre>'; 
    } 
} 
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>'; 

j'ajouté:

$client->setCredentials('******','*******','basic'); 

qui ne fonctionne pas, alors j'ai regardé le style et la sécurité-ws ajouté ce qui suit à la place:

$auth='<wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
<wsse:UsernameToken> 
    <wsse:Username>********</wsse:Username> 
    <wsse:Password Type="wsse:PasswordText">*******</wsse:Password> 
    <wsse:Nonce>'.base64_encode(pack('H*',$nonce)).'</wsse:Nonce> 
    <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">'.time().'</wsu:Created> 
    </wsse:UsernameToken> 
</wsse:Security>'; 

$client->setHeaders($auth); 

ce qui ne fonctionne pas non plus ... ils donnent la même erreur .... c'est ce qu'il retourne:

Fault 

Array 
(
    [faultcode] => q0:Security 
    [faultstring] => Header http://schemas.xmlsoap.org/ws/2004/08/addressing:Action for ultimate recipient is required but not present in the message. 
    [faultactor] => http://webservice.client.com/cir.asmx 
) 
Request 

POST /cir.asmx HTTP/1.0 
Host: webservice.client.com 
User-Agent: NuSOAP/0.9.5 (1.123) 
Content-Type: text/xml; charset=UTF-8 
SOAPAction: "http://www.client.com/namespaces/cir01/GetLastUpdate" 
Content-Length: 967 

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2278="http://tempuri.org"><SOAP-ENV:Header><wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
<wsse:UsernameToken> 
    <wsse:Username>*******</wsse:Username> 
    <wsse:Password Type="wsse:PasswordText">********</wsse:Password> 
    <wsse:Nonce></wsse:Nonce> 
    <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">1300862463</wsu:Created> 
    </wsse:UsernameToken> 
</wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body><GetLastUpdate xmlns="http://www.client.com/namespaces/cir01"></GetLastUpdate></SOAP-ENV:Body></SOAP-ENV:Envelope> 
Response 

HTTP/1.1 500 Internal Server Error 
Connection: close 
Date: Wed, 23 Mar 2011 06:39:57 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private 
Content-Type: text/xml; charset=utf-8 
Content-Length: 1421 

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><soap:Header><wsa:Action>http://schemas.xmlsoap.org/ws/2004/08/addressing/fault</wsa:Action><wsa:MessageID>urn:uuid:b8c93511-b6e6-4247-9ab5-65bd4a6aa286</wsa:MessageID><wsa:RelatesTo>urn:uuid:6dfa917b-3163-4ae9-bd84-0855b7a1329e</wsa:RelatesTo><wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To><wsse:Security><wsu:Timestamp wsu:Id="Timestamp-4d37a6a5-9445-40d6-8660-a724999cc3bc"><wsu:Created>2011-03-23T06:39:57Z</wsu:Created><wsu:Expires>2011-03-23T06:44:57Z</wsu:Expires></wsu:Timestamp></wsse:Security></soap:Header><soap:Body><soap:Fault><faultcode xmlns:q0="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">q0:Security</faultcode><faultstring>Header http://schemas.xmlsoap.org/ws/2004/08/addressing:Action for ultimate recipient is required but not present in the message.</faultstring><faultactor>http://webservice.client.com/cir.asmx</faultactor></soap:Fault></soap:Body></soap:Envelope> 
+0

Salut, j'ai le même problème, avec probablement le même webservice. Souhaitez-vous partager votre solution (en supposant que vous ayez trouvé une solution)? –

+0

Je le ferai si j'ai une bonne splution, ce que j'ai fait maintenant était de créer une connexion curl et de créer moi-même tout le XML, puis de l'envoyer au serveur. Cela fonctionne, mais ce n'est pas vraiment sympa. – renevdkooi

Répondre

0

S'il vous plaît essayer de définir l'en-tête en utilisant la méthode suivante:

$client = new SoapClient("Wsdl_URL", array("trace" => 0)); 

$WSHeader = array(
    "UsernameToken"=>array(
     "Username"=>"YourUserName", 
     "Password"=>"YourPassword", 
    ) 
); 

$header[] = new 
SoapHeader("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Security",$WSHeader); 

$client->__setSoapHeaders($header); 

$REsponse = $client->YourRequest(); 
+0

Cela n'a pas fonctionné, il ne cesse de me le dire: L'action pour le destinataire final est requise mais pas présente dans le message. – renevdkooi

+0

s'il vous plaît vérifier vos réponses avant de les poster. –

+0

Facile là champion. Il essayait juste d'aider, c'est tout. –

Questions connexes