Cómo autenticar usuarios en WebServices SOAP usando PHP

Muchas organizaciones (Especialmente gubernamentales) optan por exponer sus servicios web mediante el protocolo SOAP.

Para hacer uso de dichos servicios es necesario consumirlos.

Existen algunas ocasiones en las que no basta con conocer la URL del servicio, también es necesario realizar algún tipo de autenticación para obtener el resultado buscado.

Autenticación HTTP en WebServices SOAP

El método más simple de autenticación es el propio de HTTP.

Si este es el caso, basta con generar una URL del estilo http://usuario@password:dominio/web_service para poder acceder.

El principal problema de este método es su poca seguridad, ya que las credenciales viajan en cada pedido, por lo tanto, es bastante poco frecuente su uso en servicios web.

En aplicaciones web normales podrías llegar a encontrártelo (o incluso podrías querer implementarlo).

API-Key en WebServices SOAP

Una segunda forma de realizar autenticación es aquella basada en las API-Keys.

En este escenario, el proveedor del servicio debe decirte cuál es tu clave, la cual deberás enviar mediante algún encabezado como parte de tu petición.

Para ello, asumiendo que utilices la clase SoapClient, deberás crear un nuevo contexto en el que basar tus peticiones, algo como:

$soapclient = new SoapClient($wsdl, [ 
    'stream_context' => stream_context_create([ 
     'http'=> [ 
      'header' => "X-Api-Key: 1234abcd"    
     ] 
    ]) 
]); 

Este esquema es algo más seguro, siempre y cuando se realice la comunicación a través de SSL.

Autenticación via encabezados SOAP

Otro esquema que suele utilizarse es el de la autenticación mediante encabezados SOAP.

Este método permite que las credenciales viajen como parte del mensaje enviado lo cual puede ser deseable para evitar depender del protocolo subyacente (HTTP en la mayoría de los casos).

Para lograrlo debes usar el método __setSoapHeaders y la clase SoapHeader.

Ejemplo:

$header = new SoapHeader(
                   $namespace,
                   'UserCredentials'
                   [
                         $UserID,
                         $Pwd
                   ]
);

$client->__setSoapHeaders($header);

Claro que tanto el namespace como el nombre y estructura exacta del encabezado deberás validarlo contra el archivo WSDL del servicio al que te quieras conectar, pero la adaptación es simple.

Autenticación vía WSSE

Por último hay que mencionar un protocolo especial de seguridad para servicios web: WSSE (o WS-Security).

Este protocolo es bastante complejo ya que incluye, entre otros, firmas digitales.

Desafortunadamente, a la fecha no existe una implementación nativa de PHP para este tipo de autenticación, con lo cual no queda mucha opción que crear la nuestra o usar alguna desarrollada por un tercero.

El punto clave aquí es hacer algunos toques a los encabezados que enviaremos.

Para ello una buena opción es extender la clase SoapHeader de esta forma:

class WsseAuthHeader extends SoapHeader 
{
    private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';

    function __construct($user, $pass, $ns = null) 
    {
        if ($ns) {
            $this->wss_ns = $ns;
        }

       $auth = new stdClass();
       $auth->Username = new SoapVar($user, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); 
       $auth->Password = new SoapVar($pass, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns);

       $username_token = new stdClass();
       $username_token->UsernameToken = new SoapVar($auth, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns); 

       $security_sv = new SoapVar(
           new SoapVar($username_token, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns),
           SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'Security', $this->wss_ns);
       parent::__construct($this->wss_ns, 'Security', $security_sv, true);
    }
}

Y luego simplemente se trata de agregar este nuevo encabezado a nuestro cliente:

$client->__setSoapHeaders(new WsseAuthHeader( $UserID, $PWD));

Y a partir de aquí ya es posible consumir los servicios con normalidad.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

7 comentarios

  1. Cordial saludo Mchojrin

    Gracias por su respuesta.

    Tiene razón cuando dice que puede ser un tema en la codificación.

    La persona encargade de recibir el XML del lado del servidor me indica, que el XML debe tener formato Windows(CR LF). Es decir: una vez realizado el XML, cuando inicialmente se abre en el editor (NotePad++), se ve como UNIX(LF). No tengo mucha idea en el asunto, me puede colaborar, para lograr hacer esta conversión desde la «creación» del archivo ?

    Por otro lado, estoy utilizando SimpleXMLElement para formar el XML, donde se extiende la clase SoapHeader (atendiendo al comentario de este artículo en donde usted propone la autenticación via WSSE)

    Dejo por aqui las lineas, por si acaso encuentra algo curioso.

    Le quedo altamente agradecida,porque es un problema de dias.

    function soapClientWSSecurityHeader($user, $password,$nonce)
    {
    // Creating date using yyyy-mm-ddThh:mm:ssZ format
    $tm_created = date(‘Y-m-d\TH:i:s’).».123-05:00″;
    $tm_expires = gmdate(‘Y-m-d\TH:i:s’, gmdate(‘U’) + 180); //only necessary if using the timestamp element

    // Generating and encoding a random number
    $simple_nonce = mt_Rand();
    $encoded_nonce =$nonce; //base64_encode($simple_nonce);

    // Compiling WSS string
    $passdigest = base64_encode(sha1($simple_nonce . $tm_created . $password, true));
    $passdigest = $password;

    // Initializing namespaces
    $ns_wsse = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
    $ns_wsu = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
    $password_type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
    $encoding_type = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary';

    // Creating WSS identification header using SimpleXML
    $root = new SimpleXMLElement('<root/>');

    $security = $root->addChild('wsse:Security', null, $ns_wsse);

    $usernameToken = $security->addChild('wsse:UsernameToken', null, $ns_wsse);
    $usernameToken->addChild('wsse:Username', $user, $ns_wsse);
    $usernameToken->addChild('wsse:Password', $passdigest, $ns_wsse)->addAttribute('Type', $password_type);
    $usernameToken->addChild('wsse:Nonce', $encoded_nonce, $ns_wsse)->addAttribute('EncodingType', $encoding_type);
    $usernameToken->addChild('wsu:Created', $tm_created, $ns_wsu);

    // Recovering XML value from that object
    $root->registerXPathNamespace('wsse', $ns_wsse);
    $full = $root->xpath('/root/wsse:Security');
    $auth = $full[0]->asXML();

    return new SoapHeader($ns_wsse, 'Security', new SoapVar($auth, XSD_ANYXML), true);

    }

    Mil gracias, Un abrazo!

    1. Hola Katty!

      Pues lo primero que se me ocurre sugerirte es que trates de desarrollar en el mismo entorno en el que despliegas tus aplicaciones (En tu caso parece que desarrollas en Linux y despliegas en Windows, ¿puede ser?).

      Respecto de la codificación, nota que en el SoapClient tienes la posibilidad de definir la codificación de caracteres mediante una opción en el constructor (encoding).

      Aquí tienes más información que puede ayudarte: https://www.php.net/manual/en/soapclient.construct.php

      Exitos!

      1. Hoola Mauro!!,

        Había parado esto por una contingencia… Creo que el asunto es por allí, probaré y le estaré contando..

        Muchas gracias por su tiempo!

        Un abrazo!!

  2. Hola! mchojrin

    Gracias por tu respuesta.

    Retomé el tema, lo de la clase que me indica, fué util porque hace la tranmisión, pero lo hace con intermitencia, es decir a veces se conecta usando un try …. sin él no hace nada.

    Cuando se logra conectar el SOAP Fault trae esto:: (faultcode: Client, faultstring: looks like we got no XML document) pero aún asi envia los datos al WS… Otras veces no hace nada, es decir no hay response, ni envía los datos, pero el SOAP Fault: responde con esto:: (faultcode: HTTP, faultstring: )

    Que puede estar pasando? Cuando funciona he observado que lo hace luego de un buen momento de espera (como un reposo en la ejecución ej: 5 min), en una ejecución continuada no funciona.

    Muchas gracias por tu valioso tiempo.
    Un abrazo!

    1. Hola Katty!

      Por lo que comentas parece que hay un problema en el servidor al que te estás conectando (Por lo de la intermitencia).

      Otra cosa que puede estar fallando es la codificación del XML que estás enviando.

      Este artículo te puede dar alguna pista.

      Saludos!

  3. Hola mchojrin

    Entiendo que la solución a mi problema está en la implementación de: «Autenticación vía WSSE», pero no comprendo como hacerlo. El caso es que desde sopaUI,, envío este xml y genera la entrega de un documento xml.

    facturacionelectronica@homifundacion.org.co
    2cf427e012e8f89b330c0a572d31b856df98bfc8bdb49c3978d906ba36d5066b
    DMedinakattyxDAdasddadadVXCadasDSADAsadwddassddsdsaasaeqwqwddsaadaadassDdasdasSdasdadassdasddAadsAdsdaasdeDSsddsadasDSAadaddasddasdasdddasddasdaa323sda1DSAssadsdddsarwqrdsddDasdadsdsadasdasdaadadasdddadsadsdsadsadasasdasadsadassxxdddasdadassddddasdasdasdadsdasddeqdsawasdd312asddasddFsaasxxasaxxxxeqwddddddsadasddddddddeqwedasdaqasddasdsadadsadwexxxdasdsadadasadsdaaaaaaxdadasdas225
    2021-09-08T16:14:43.123-05:00

    factura.xml
    PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxGYWN0dXJhPjxFTkM+PEVOQ18xPklOVk9JQzwvRU5DXzE+PEVOQ18yPjkwMDAyNDk3MzwvRU5DXzI+PEVOQ18zPjkwMDg1NTIyMTwvRU5DXzM+PEVOQ180PlVCTCAyLjE8L0VOQ180PjxFTkNfNT5ESUFOIDIuMTogRmFjdHVyYSBFbGVjdHImI3hGMztuaWNhIGRlIFZlbnRhPC9FTkNfNT48RU5DXzY+U0VUVC0xPC9FTkNfNj48RU5DXzc+U0VUVFBSQzAwMDA1OTQ8L0VOQ183PjxFTkNfOD4yMDIwLTAyLTI3IDA3OjMyOjAwPC9FTkNfOD48RU5DXzk+MDE8L0VOQ185PjxFTkNfMTA+Q09QPC9FTkNfMTA+PEVOQ18xMT4yMDIwLTAyLTI3PC9FTkNfMTE+PEVOQ18xMj4yMDIwLTAyLTI3PC9FTkNfMTI+PEVOQ18xMz5DQ09TVE9TPC9FTkNfMTM+PEVOQ18xND5OT01CUkUgQ0NPU1RPUzwvRU5DXzE0PjxFTkNfMTU+MzwvRU5DXzE1PjxFTkNfMTY+MjAyMC0wMi0yNyAwMDowMDowMDwvRU5DXzE2PjxFTkNfMTcvPjxFTkNfMTgvPjxFTkNfMTkvPjxFTkNfMjA+MjwvRU5DXzIwPjxFTkNfMjE+U1MtQ1VGRTwvRU5DXzIxPjxFTkNfMjI+U1MtQ1VGRTwvRU5DXzIyPjwvRU5DPjxFTUk+PEVNSV8xPjE8L0VNSV8xPjxFTUlfMj44NjAwNjk4NzA8L0VNSV8yPjxFTUlfMz4zMTwvRU1JXzM+PEVNSV80Pk5vIGFwbGljYTwvRU1JXzQ+PEVNSV81PjExMzwvRU1JXzU+PEVNSV82PlNPQ0lFREFEIElOVEVSRElTQ0lQTElOQVJJQSBQQVJBIExBIFNBTFVEIFMuQS4gU0lQTEFTPC9FTUlfNj48RU1JXzc+U09DSUVEQUQgSU5URVJESVNDSVBMSU5BUklBIFBBUkEgTEEgU0FMVUQgUy5BLiBTSVBMQVM8L0VNSV83PjxFTUlfOC8+PEVNSV85Lz48RU1JXzEwPkNhbGxlIDk0IE5vLiAxNS00NSA8L0VNSV8xMD48RU1JXzExPjExPC9FTUlfMTE+PEVNSV8xMi8+PEVNSV8xMz5CT0dPVEE8L0VNSV8xMz48RU1JXzE0PjExMDAyMjE8L0VNSV8xND48RU1JXzE1PkNPPC9FTUlfMTU+PEVNSV8xNi8+PEVNSV8xNy8+PEVNSV8xOC8+PEVNSV8xOT5CT0dPVEE8L0VNSV8xOT48RU1JXzIwLz48RU1JXzIxPkNPTE9NQklBPC9FTUlfMjE+PEVNSV8yMj45PC9FTUlfMjI+PEVNSV8yMz4xMTAwMTwvRU1JXzIzPjxFTUlfMjQ+U09DSUVEQUQgSU5URVJESVNDSVBMSU5BUklBIFBBUkEgTEEgU0FMVUQgUy5BLiBTSVBMQVM8L0VNSV8yND48RU1JXzI1Lz48VEFDPjxUQUNfMT5PLTE1PC9UQUNfMT48L1RBQz48REZFPjxERkVfMT4xMTAwMTwvREZFXzE+PERGRV8yPjExPC9ERkVfMj48REZFXzM+Q088L0RGRV8zPjxERkVfND4wPC9ERkVfND48REZFXzU+Q09MT01CSUE8L0RGRV81PjxERkVfNj5CT0dPVEE8L0RGRV82PjxERkVfNz5CT0dPVEE8L0RGRV83PjxERkVfOC8+PC9ERkU+PElDQz48SUNDXzE+MTIzMDQ1PC9JQ0NfMT48SUNDXzk+U0VUVDwvSUNDXzk+PC9JQ0M+PEdURT48R1RFXzE+SVZBPC9HVEVfMT48L0dURT48L0VNST48QURRPjxBRFFfMT4xPC9BRFFfMT48QURRXzI+OTAwODU1MjIxPC9BRFFfMj48QURRXzM+MzE8L0FEUV8zPjxBRFFfND5ObyBhcGxpY2E8L0FEUV80PjxBRFFfNj5DT0ZGRUUgVFJBRElORyBDT01QQU5ZIFNBUzwvQURRXzY+PEFEUV83PkNPRkZFRSBUUkFESU5HIENPTVBBTlkgU0FTPC9BRFFfNz48QURRXzg+Q09GRkVFIFRSQURJTkcgQ09NUEFOWSBTQVM8L0FEUV84PjxBRFFfOT5DT0ZGRUUgVFJBRElORyBDT01QQU5ZIFNBUzwvQURRXzk+PEFEUV8xMD5DUiA5NCBCIDEzMCBBIDIxPC9BRFFfMTA+PEFEUV8xMT4xMTwvQURRXzExPjxBRFFfMTIvPjxBRFFfMTMvPjxBRFFfMTQ+MTExMDExPC9BRFFfMTQ+PEFEUV8xNT5DTzwvQURRXzE1PjxBRFFfMTYvPjxBRFFfMTcvPjxBRFFfMTgvPjxBRFFfMTk+Qm9nb3QmI3hFMTssIEQuQy48L0FEUV8xOT48QURRXzIwLz48QURRXzIxPkNvbG9tYmlhPC9BRFFfMjE+PEFEUV8yMj41PC9BRFFfMjI+PEFEUV8yMz4xMTAwMTwvQURRXzIzPjxBRFFfMjQ+OTAwODU1MjIxPC9BRFFfMjQ+PEFEUV8yNT4zMTwvQURRXzI1PjxBRFFfMjY+NTwvQURRXzI2PjxUUkM+PFRSQ18xLz48L1RSQz48Q0RBPjxDREFfMT4xPC9DREFfMT48Q0RBXzI+Q09GRkVFIFRSQURJTkcgQ09NUEFOWSBTQVM8L0NEQV8yPjxDREFfMy8+PENEQV80Pm1hbmFnZXJAY2FmZXhpZWxvLmNvbTwvQ0RBXzQ+PC9DREE+PEdUQT48R1RBXzE+MDE8L0dUQV8xPjxHVEFfMj5JVkE8L0dUQV8yPjwvR1RBPjwvQURRPjxJRU4+PElFTl8xPkNSIDk0IEIgMTMwIEEgMjE8L0lFTl8xPjxJRU5fMj5DTzwvSUVOXzI+PElFTl8zLz48SUVOXzQvPjxJRU5fNT4xMTEwMTE8L0lFTl81PjxJRU5fMTI+MTEwMDE8L0lFTl8xMj48SUVOXzIyPkJvZ290JiN4RTE7LCBELkMuPC9JRU5fMjI+PElFTl8yND5lczwvSUVOXzI0PjwvSUVOPjxNRVA+PE1FUF8xPjEwPC9NRVBfMT48TUVQXzI+MTwvTUVQXzI+PE1FUF8zPjIwMjAtMDItMjcgMDA6MDA6MDA8L01FUF8zPjxNRVBfND4xMjwvTUVQXzQ+PC9NRVA+PFRPVD48VE9UXzE+MjUwMDE8L1RPVF8xPjxUT1RfMj5DT1A8L1RPVF8yPjxUT1RfMz4wPC9UT1RfMz48VE9UXzQ+Q09QPC9UT1RfND48VE9UXzU+MjUwMDE8L1RPVF81PjxUT1RfNj5DT1A8L1RPVF82PjxUT1RfNz4yNTAwMTwvVE9UXzc+PFRPVF84PkNPUDwvVE9UXzg+PFRPVF85PjA8L1RPVF85PjxUT1RfMTA+Q09QPC9UT1RfMTA+PFRPVF8xMz4wPC9UT1RfMTM+PFRPVF8xND5DT1A8L1RPVF8xND48VE9UXzE1PjAuMDA8L1RPVF8xNT48VE9UXzE2PkNPUDwvVE9UXzE2PjwvVE9UPjxEUkY+PERSRl8xPjUwMDAwMDA8L0RSRl8xPjxEUkZfMj4yMDE5LTAxLTE5PC9EUkZfMj48L0RSRj48SVRFPjxJVEVfMT48SVRFXzE+MTwvSVRFXzE+PElURV8yLz48SVRFXzM+MTwvSVRFXzM+PElURV80PkM1PC9JVEVfND48SVRFXzU+MjUwMDA8L0lURV81PjxJVEVfNj5DT1A8L0lURV82PjxJVEVfNz4yNTAwMDwvSVRFXzc+PElURV84PkNPUDwvSVRFXzg+PElURV85Lz48SVRFXzEwLz48SVRFXzExPkVYQU1FTiBNRURJQ08gT0NVUEFDSU9OQUwgREUgUFJFIElOR1JFU088L0lURV8xMT48SVRFXzEyLz48SVRFXzEzLz48SVRFXzE0Lz48SVRFXzE1PjE8L0lURV8xNT48SVRFXzE2Lz48SVRFXzE3Pjg5MDI2Mi0xNDwvSVRFXzE3PjxJVEVfMTgvPjxJVEVfMTk+MjUwMDA8L0lURV8xOT48SVRFXzIwPkNPUDwvSVRFXzIwPjxJVEVfMjE+MjUwMDA8L0lURV8yMT48SVRFXzIyPkNPUDwvSVRFXzIyPjxJVEVfMjMvPjxJVEVfMjQvPjxJVEVfMjUvPjxJVEVfMjc+MTwvSVRFXzI3PjxJVEVfMjg+QzU8L0lURV8yOD48SVRFXzI5Lz48SVRFXzMwPjI1MDAwPC9JVEVfMzA+PElBRT48SUFFXzEvPjxJQUVfMi8+PElBRV8zLz48SUFFXzQvPjwvSUFFPjwvSVRFXzE+PFNBRV8xPjxTQUVfMS8+PFNBRV8yPkF1dG9yaXphIElELUVSUC9FUFM8L1NBRV8yPjwvU0FFXzE+PElURV8yPjxJVEVfMT4yPC9JVEVfMT48SVRFXzIvPjxJVEVfMz4xPC9JVEVfMz48SVRFXzQ+QzU8L0lURV80PjxJVEVfNT4xPC9JVEVfNT48SVRFXzY+Q09QPC9JVEVfNj48SVRFXzc+MTwvSVRFXzc+PElURV84PkNPUDwvSVRFXzg+PElURV85Lz48SVRFXzEwLz48SVRFXzExPlRPTUEgREUgREFUT1M8L0lURV8xMT48SVRFXzEyLz48SVRFXzEzLz48SVRFXzE0Lz48SVRFXzE1PjE8L0lURV8xNT48SVRFXzE2Lz48SVRFXzE3PlREMDE8L0lURV8xNz48SVRFXzE4Lz48SVRFXzE5PjE8L0lURV8xOT48SVRFXzIwPkNPUDwvSVRFXzIwPjxJVEVfMjE+MTwvSVRFXzIxPjxJVEVfMjI+Q09QPC9JVEVfMjI+PElURV8yMy8+PElURV8yNC8+PElURV8yNS8+PElURV8yNz4xPC9JVEVfMjc+PElURV8yOD5DNTwvSVRFXzI4PjxJVEVfMjkvPjxJVEVfMzA+MTwvSVRFXzMwPjxJQUU+PElBRV8xLz48SUFFXzIvPjxJQUVfMy8+PElBRV80Lz48L0lBRT48L0lURV8yPjxTQUVfMj48U0FFXzEvPjxTQUVfMj5BdXRvcml6YSBJRC1FUlAvRVBTPC9TQUVfMj48L1NBRV8yPjwvSVRFPjxTQUE+PFNBQV8xPlJlc29sdWNpJiN4RjM7biA1MDY6MjAyMTwvU0FBXzE+PC9TQUE+PFNFVD48U0VUXzE+U2VjdG9yIFNhbHVkPC9TRVRfMT48L1NFVD48U0VHPjxTRUdfMT5Vc3VhcmlvPC9TRUdfMT48U0VDPjxTRUdfMT5DT0RJR09fUFJFU1RBRE9SPC9TRUdfMT48U0VHXzI+MTEwMDAwMDAwMDAwPC9TRUdfMj48L1NFQz48U0VDPjxTRUdfMT5USVBPX0RPQ1VNRU5UT19JREVOVElGSUNBQ0lPTjwvU0VHXzE+PFNFR18yPkNFRFVMQSBDSVVEQURBTklBPC9TRUdfMj48U0VHXzM+c2FsdWRfaWRlbnRpZmljYWNpJiN4RjM7bi5nYzwvU0VHXzM+PFNFR180PkNDPC9TRUdfND48L1NFQz48U0VDPjxTRUdfMT5OVU1FUk9fIERPQ1VNRU5UTyBfSURFTlRJRklDQUNJT048L1NFR18xPjxTRUdfMj4xMDAxMTE0Nzk1PC9TRUdfMj48L1NFQz48U0VDPjxTRUdfMT5QUklNRVJfQSBQRUxMSURPPC9TRUdfMT48U0VHXzI+UEFUSU5PPC9TRUdfMj48L1NFQz48U0VDPjxTRUdfMT5TRUdVTkRPX0FQRUxMSURPPC9TRUdfMT48U0VHXzI+Uk9KQVM8L1NFR18yPjwvU0VDPjxTRUM+PFNFR18xPlBSSU1FUl9OT01CUkU8L1NFR18xPjxTRUdfMj5KRUZGUkVZPC9TRUdfMj48L1NFQz48U0VDPjxTRUdfMT5TRUdVTkRPX05PTUJSRTwvU0VHXzE+PFNFR18yPlNUSVZFTjwvU0VHXzI+PC9TRUM+PFNFQz48U0VHXzE+VElQT19VU1VBUklPPC9TRUdfMT48U0VHXzI+NTE8L1NFR18yPjxTRUdfMz5zYWx1ZF90aXBvX3VzdWFyaW8uZ2M8L1NFR18zPjxTRUdfND41MTwvU0VHXzQ+PC9TRUM+PFNFQz48U0VHXzE+TU9EQUxJREFEX0NPTlRSQVRBQ0lPTjwvU0VHXzE+PFNFR18yLz48U0VHXzM+c2FsdWRfbW9kYWxpZGFkX3BhZ28uZ2M8L1NFR18zPjxTRUdfNC8+PC9TRUM+PFNFQz48U0VHXzE+Q09CRVJUVVJBX1BMQU5fQkVORUZJQ0lPUzwvU0VHXzE+PFNFR18yLz48U0VHXzM+c2FsdWRfY29iZXJ0dXJhLmdjPC9TRUdfMz48U0VHXzQvPjwvU0VDPjxTRUM+PFNFR18xPk5VTUVST19BVVRPUklaQUNJJiN4RDM7TjwvU0VHXzE+PFNFR18yLz48L1NFQz48U0VDPjxTRUdfMT5OVU1FUk9fTUlQUkVTPC9TRUdfMT48U0VHXzIvPjwvU0VDPjxTRUM+PFNFR18xPk5VTUVST19FTlRSRUdBX01JUFJFUzwvU0VHXzE+PFNFR18yLz48L1NFQz48U0VDPjxTRUdfMT5OVU1FUk9fQ09OVFJBVE88L1NFR18xPjxTRUdfMi8+PC9TRUM+PFNFQz48U0VHXzE+TlVNRVJPX1BPTElaQTwvU0VHXzE+PFNFR18yLz48L1NFQz48U0VDPjxTRUdfMT5GRUNIQV9JTklDSU9fRkFDVFVSQUNJJiN4RDM7Tl9VU1VBUklPPC9TRUdfMT48U0VHXzI+MjAyMC0wMi0yNzwvU0VHXzI+PC9TRUM+PFNFQz48U0VHXzE+RkVDSEFfRklOX0ZBQ1RVUkFDSSYjeEQzO05fVVNVQVJJTzwvU0VHXzE+PFNFR18yPjIwMjAtMDItMjc8L1NFR18yPjwvU0VDPjxTRUM+PFNFR18xPkNPUEFHTzwvU0VHXzE+PFNFR18yPjA8L1NFR18yPjwvU0VDPjxTRUM+PFNFR18xPkNVT1RBX01PREVSQURPUkE8L1NFR18xPjxTRUdfMj4wLjA8L1NFR18yPjwvU0VDPjxTRUM+PFNFR18xPkNVT1RBX1JFQ1VQRVJBQ0lPTjwvU0VHXzE+PFNFR18yPjA8L1NFR18yPjwvU0VDPjxTRUM+PFNFR18xPlBBR09TX0NPTVBBUlRJRE9TPC9TRUdfMT48U0VHXzI+MDwvU0VHXzI+PC9TRUM+PC9TRUc+PC9GYWN0dXJhPgo=
    899999123
    899999123_01

    Pero no sé como implementarlo desde php, para incluir la información del segmento es decir las variables de autenticación que las describo:
    Username, Password(sha256), Nonce(cadena de unicidad de petición base64), Created

    Para el body… las variables que permiten consumir el método Upload:
    fileName, fileData,companyId,accountId

    Me podrías ayudar?

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.