2012-11-20 5 views
13

Intestazioni PHP SoapClient. Sto riscontrando un problema nel trovare gli spazi dei nomi nei nodi figlio. Ecco il codice che sto usando:Spazi dei nomi PHP in SoapHeader Nodi secondari

$security = new stdClass; 
$security->UsernameToken->Password = 'MyPassword'; 
$security->UsernameToken->Username = 'MyUsername'; 
$header[] = new SOAPHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', $security); 
$client->__setSoapHeaders($header); 

Ecco il XML che genera:

<ns2:Security> 
    <UsernameToken> 
    <Password>MyPassword</Password> 
    <Username>MyUsername</Username> 
    </UsernameToken> 
</ns2:Security> 

Ecco il XML voglio che generate:

<ns2:Security> 
    <ns2:UsernameToken> 
    <ns2:Password>MyPassword</ns2:Password> 
    <ns2:Username>MyUsername</ns2:Username> 
    </ns2:UsernameToken> 
</ns2:Security> 

ho bisogno di ottenere lo spazio dei nomi riferimento nei nodi UsernameToken, Password e Username. Qualsiasi aiuto sarebbe molto apprezzato.

Grazie.

risposta

9

Capito. Ho usato SoapVars e array annidati.

$ns_s = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; 
$node1 = new SoapVar('MyUsername', XSD_STRING, null, null, 'Username', $ns_s); 
$node2 = new SoapVar('MyPassword', XSD_STRING, null, null, 'Password', $ns_s); 
$token = new SoapVar(array($node1,$node2), SOAP_ENC_OBJECT, null, null, 'UsernameToken', $ns_s); 
$security = new SoapVar(array($token), SOAP_ENC_OBJECT, null, null, 'Security', $ns_s); 
$header[] = new SOAPHeader($ns_s, 'Security', $security, false); 

che ha preso interamente troppo sforzo e di pensiero ...

11

David ha la right answer. Ed ha anche ragione che ci vuole troppo sforzo e si pensa. Ecco una variazione che incapsula la bruttezza per chiunque lavori su questa particolare intestazione di sicurezza di wsse.

Clean codice client

$client = new SoapClient('http://some-domain.com/service.wsdl'); 
$client->__setSoapHeaders(new WSSESecurityHeader('myUsername', 'myPassword')); 

E l'attuazione ...

class WSSESecurityHeader extends SoapHeader { 

    public function __construct($username, $password) 
    { 
     $wsseNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; 
     $security = new SoapVar(
      array(new SoapVar(
       array(
        new SoapVar($username, XSD_STRING, null, null, 'Username', $wsseNamespace), 
        new SoapVar($password, XSD_STRING, null, null, 'Password', $wsseNamespace) 
       ), 
       SOAP_ENC_OBJECT, 
       null, 
       null, 
       'UsernameToken', 
       $wsseNamespace 
      )), 
      SOAP_ENC_OBJECT 
     ); 
     parent::SoapHeader($wsseNamespace, 'Security', $security, false); 
    } 

} 
+0

Grazie ho usato questo, ma ha cambiato la sezione password: nuovi SoapVar ($ password, XSD_STRING, 'tipo', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText', 'Password', $ wsseNamespace)), Che ti dà: yourpassword Craig