2010-10-14 50 views
5

Necesito conectarme a un servicio web que requiere credenciales de autenticación en forma de un nombre de usuario y contraseña de texto sin formato.Autenticación SOAP con PHP

Tengo un conocimiento básico de SOAP y he logrado conectarme a otros servicios web abiertos que no requieren un nombre de usuario o contraseña usando NuSOAP.

Lo siguiente fue enviado a mí:

<?php 

// Set up security options 
$security_options = array("useUsernameToken" => TRUE); 
$policy = new WSPolicy(array("security" => $security_options)); 

$security_token = new WSSecurityToken(array(
    "user" => "xxx", 
    "password" => "xxx", 
    "passwordType" => "basic")); 

// Create client with options 
$client = new WSClient(array("wsdl" => "https://xxx.asmx?wsdl", 
    "action" => "http://xxx", 
    "to" => "https://xxx", 
    "useWSA" => 'submission', 
    "CACert" => "cert.pem", 
    "useSOAP" => 1.1, 
    "policy" => $policy, 
    "securityToken" => $security_token)); 

// Send request and capture response 
$proxy = $client->getProxy(); 

$input_array = array("From" => "2010-01-01 00:00:00", 
    "To" => "2010-01-31 00:00:00"); 

$resMessage = $proxy->xxx($input_array); 
?> 

Después de algunas investigaciones que entiendo que la aplicación anterior utiliza WSO2. Necesito poder hacer esto sin usar wso2.

He intentado hacer todo lo posible para buscar recursos (Google, foros, etc.) sobre lo anterior pero no he podido encontrar nada. He leído algunos tutoriales en SOAP y he podido configurar un cliente SOAP utilizando PHP, pero no puedo entender todas las autenticaciones y las "políticas".

¡Una explicación de cómo lograr esto y tal vez algunos enlaces para leer más acerca de esto sería muy apreciada ya que me estoy arrancando los pelos! Idealmente, quisiera algunos enlaces a recursos para un principiante absoluto de la autenticación SOAP.

Gracias. P.S. algunos de los enlaces/credenciales en los anteriores podrían haber sido xxx para la privacidad.

Respuesta

9

Si tiene habilitada la extensión SOAP en php (versión php> = 5.0.1), puede usar la clase SoapClient para procesar su solicitud. Para autenticar, puede pasar el nombre de usuario y contraseña para la clase con la dirección URL de destino:

$soapURL = "https://www.example.com/soapapi.asmx?wsdl" ; 
$soapParameters = Array('login' => "myusername", 'password' => "mypassword") ; 
$soapFunction = "someFunction" ; 
$soapFunctionParameters = Array('param1' => 42, 'param2' => "Search") ; 

$soapClient = new SoapClient($soapURL, $soapParameters); 

$soapResult = $soapClient->__soapCall($soapFunction, $soapFunctionParameters) ; 

if(is_array($soapResult) && isset($soapResult['someFunctionResult'])) { 
    // Process result. 
} else { 
    // Unexpected result 
    if(function_exists("debug_message")) { 
     debug_message("Unexpected soapResult for {$soapFunction}: ".print_r($soapResult, TRUE)) ; 
    } 
} 

Si no está seguro acerca de las funciones que puede llamar, puede ver la URL de destino (por ejemplo, que termina en". asmx? wsdl ") en su navegador. Debería obtener una respuesta XML que le indique las funciones de SOAP disponibles a las que puede llamar y los parámetros esperados de esas funciones.

+0

he intentado todo lo anterior y también incluyó los parámetros extra de mi código original en $ soapFunctionParameters pero estoy consiguiendo la excepción "Acción para el destinatario final es necesaria, pero no está presente en el mensaje". ¿Qué crees que hacen la función Token de WSPolicy y WSSecurity? Nuevamente, soy un completo principiante en esto realmente. –

+0

FYI- $ soapFunctionParameters en $ soapResult = ... soapCall() se deletrea incorrectamente. Me encontré con esto mientras buscaba esta información y estaba usando tu código para probar. Puede ser irrelevante ya que es de 2010. – Travis

+0

@guss ¿Cómo autentica el servidor soap los datos de inicio de sesión pasados ​​con la matriz '$ soapParameters' al soapclient? En mi script de PHP soap server, '$ _SERVER ['PHP_AUTH_USER']' no está configurado, entonces, ¿cómo debo validar? –