2010-11-30 23 views
5

soy muy nuevo en jabón (es decir, ninguna pista!)Problemas de enviar las cabeceras SOAP de autenticación en php

me han preguntado por un cliente para interactuar con un servicio SOAP existente que requiere autenticación hecho a través de mis encabezados SOAP (una simple nombre de usuario y contraseña)

tengo 3 métodos a mi disposición,

IsAlive IsAliveSecure ChangeUserDetails

IsAlive simplemente devuelve cierto y puedo llamarlo sin problema

IsAliveSecure devuelve verdadero con la debida autorización y no puedo conseguirlo para volver realidad.

básicamente necesito enviar la petición siguiente:

POST /ripplecomprovisioning.asmx HTTP/1.1 
Host: provisioning.example.ie 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://www.blueface.ie/provisioning/IsAliveSecure" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
    <SoapAuthHeader xmlns="http://www.example.ie/provisioning/"> 
     <Username>myusername</Username> 
     <Password>mypassword</Password> 
    </SoapAuthHeader> 
    </soap:Header> 
    <soap:Body> 
    <IsAliveSecure xmlns="http://www.example.ie/provisioning/" /> 
    </soap:Body> 
</soap:Envelope> 

Mi pregunta es cómo puedo enviar una solicitud con formato como el de arriba en php?

esto es lo que he intentado pero sin éxito:

$ SoapClient = new SoapClient ("https://provisioning.example.ie/ripplecomprovisioning.asmx?WSDL");

// Prepare SoapHeader parameters 
$sh_param = array( 
      'Username' => 'myusername', 
      'Password' => 'mypassword'); 
$headers = new SoapHeader('ripplecomprovisioning', 'SoapAuthHeaders', $sh_param); 

// Prepare Soap Client 
$soapClient->__setSoapHeaders(array($headers)); 
    $result = $soapClient->isAlive(); 

echo var_dump($result); 

echo "<br /><br />"; 

    $result = $soapClient->IsAliveSecure(); 

echo var_dump($result); 

la salida de lo anterior es como sigue:

object(stdClass)#3 (1) { 
    ["IsAliveResult"]=> 
    bool(true) 
} 
<br /><br /> 
Fatal error: Uncaught SoapFault exception: [soap:Server] System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.UnauthorizedAccessException: Attempted to perform an unauthorized operation. 
    at example.VoIP.Provisioning.RipplecomProvisioningServices.IsAliveSecure() 
    --- End of inner exception stack trace --- in /var/www/ripplecomweb/authentication/soap.php:20 
Stack trace: 
#0 [internal function]: SoapClient->__call('IsAliveSecure', Array) 
#1 /var/www/ripplecomweb/authentication/soap.php(20): SoapClient->IsAliveSecure() 
#2 {main} 
    thrown in /var/www/ripplecomweb/authentication/soap.php on line 20 

Cualquier ayuda con esto sería muy apreciada. ¡No puedo permitirme el lujo de fallar!

Gracias

Kev

Respuesta

1

Bueno, sería mucho más fácil si pudiéramos ver el WSDL del servicio. Pero pruebe estos pasos:

1.Compruebe el WSDL para el método isAliveSecure para ver si tiene que pasarle algo.

2.See lo que la solicitud va a enviar realmente se ve así:

var_dump($soapClient->__getLastRequest()); 
var_dump($soapClient->__getLastRequestHeaders()); 

(asegúrese de que está instanciar $soapClient con la opción 'trace' => TRUE de estos métodos o no funcionarán -> ver PHP manual)

el envío de la solicitud en la forma que usted puede estar seguro debe ser correcta manualmente a través de línea de comandos 3.Try, algo así como:

curl -v -k -d @/path/to/the/file/with/the/request/xml http://service_url