Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   Ayuda con un servicio SOAP de impuestos en Bolivia con TOKEN en delphi (https://www.clubdelphi.com/foros/showthread.php?t=95586)

CrazySoft 24-02-2022 18:06:54

Ayuda con un servicio SOAP de impuestos en Bolivia con TOKEN en delphi
 
Buen día, de ante mano muchas gracias por la ayuda
no logro establecer la conexion para poder usar el servicio
https://pilotosiatservicios.impuesto...utarizada?wsdl
no se como añadir el encabezado al html para poder enviar
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var Peticion: verificarComunicacion;
    Respuesta: verificarComunicacionResponse;
    Token: String;
begin
     Token:='ePyJ0eXwiOiJKV1QiLwthbGciOiJIUzUx...........elTokenEsUnaCadenaLarga';
     
     Peticion:= Nil;
     HTTPRIO1:= THTTPRIO.Create(self);
     HTTPRIO1.HTTPWebNode.Password:=Token;
     Try
         Respuesta:= GetServicioFacturacionCodigos(False,'',HTTPRIO1).verificarComunicacion(Peticion);
         ShowMessage(IntToStr(Respuesta.return));
     Except
          on E : Exception do
               ShowMessage('Error generado : '+E.Message);
     end;
 
end;

CrazySoft 01-03-2022 04:12:02

les solicito una vez más ayuda, no puedo consumir el servicio, este es un ejemplo en PHP
gracias por su colaboración

Código PHP:

<?php
 
/** Ejemplo de manejo de SOAP con libreria de PHP php-soap */
 
$wsdl "https://pilotosiatservicios.impuestos.gob.bo/v2/FacturacionCodigos?wsdl";
 
$token 'VALOR_TOKEN';
 
$opts = array(
      
'http' => array(
           
'header' => "Authorization: Token $token"
      
)
);
 
$context stream_context_create($opts);
 
$client = new \SoapClient($wsdl, [
      
'stream_context' => $context,
      
'cache_wsdl' => WSDL_CACHE_NONE,
      
'compression' => SOAP_COMPRESSION_ACCEPT SOAP_COMPRESSION_GZIP SOAP_COMPRESSION_DEFLATE
 
      
// other options
]);
 
$respons $client->verificarComunicacion();
?>

este es código en Delphi pero da el siguiente error "EL SERVICIO REQUIERE API KEY", supongo que es por el encabezado

Código Delphi [-]
procedure TForm1.Button5Click(Sender: TObject);
 const   Token = 'VALOR_TOKEN';
 type   TAuthHeader = class(TSOAPHeader)
 private     Tokey: WideString;   
published   
end;   
var  
  Peticion: respuestaComunicacion;   
  Respuesta: ServicioFacturacionCodigos;   
  Headers: ISOAPHeaders;   
  key: TAuthHeader;   
  HTTPRio: THTTPRio; 
begin    
  HTTPRio := THTTPRio.Create(self);   
  try     
    key := TAuthHeader.Create;     
    key.Tokey := 'Authorization: Token ' + Token;      
    Headers := HTTPRIO as ISoapHeaders;      
    Respuesta := GetServicioFacturacionCodigos(False, '', HTTPRIO);      
    (Respuesta as ISOAPHeaders).Send(key);      
    try       
      Respuesta.verificarComunicacion;  //sale error: EL SERVICIO REQUIERE API KEY     
    except       
      on E: Exception do         
        ShowMessage('Error : ' + E.Message);     
    end;    
  finally     
  key.Free;   
end;  
end;

Casimiro Notevi 01-03-2022 10:43:15

Seguramente la "key" debas indicarlo en la cabecera, mira este enlace a ver si te sirve.

CrazySoft 01-03-2022 13:26:37

Gracias Casimiro, por la ayuda pero añadi el evento y sigue dando el mismo error, probe cambiando la autentificacion y codificando en base64 el token



Código Delphi [-]
procedure TForm1.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  auth: string;

begin

  auth := 'Authorization: Basic ' + token;
//  auth := 'Authorization: Token ' + token;
//  auth := 'Authorization: Basic ' + idEncoderMIME1.EncodeString(token);
//  auth := 'Authorization: Token ' + idEncoderMIME1.EncodeString(token);

  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);

end;

Casimiro Notevi 01-03-2022 15:12:13

Cita:

Empezado por CrazySoft (Mensaje 545723)
Gracias Casimiro, por la ayuda pero añadi el evento y sigue dando el mismo error, probe cambiando la autentificacion y codificando en base64 el token

Es que no se trata de que pruebes y pruebes y pruebes distintas cosas, sino de hacer lo que digan los requisitos de ese servicio. ¿No tienes la documentación?

CrazySoft 01-03-2022 23:06:06

Gracias Casimiro, si deberia de estar en la documentación que sería lo ideal, pero lastimosamente ya no la encuentro la documentación o el ejemplo de conexión, porque volivieron a actualizar la pagina https://siatinfo.impuestos.gob.bo/in...cion-fact-comp

Casimiro Notevi 02-03-2022 10:02:34

Ahí hay mucho que mirar, y efectivamente, en el menú han quitado la opción donde en teoría explican lo que necesitas.
Pregunto, ¿es obligatorio usar ese sistema?

CrazySoft 02-03-2022 13:17:35

Cita:

Empezado por Casimiro Notevi (Mensaje 545736)
Ahí hay mucho que mirar, y efectivamente, en el menú han quitado la opción donde en teoría explican lo que necesitas.
Pregunto, ¿es obligatorio usar ese sistema?


Si, es obligatorio pero lo estan hacendo de manera incrementa

egostar 02-03-2022 17:48:32

Ahí te dice donde va el token y como se arma



Código:

headers.put("apikey", Arrays.asList("TokenApi " + pToken));
Lo que entiendo es que en el header del REQUEST debes agregar esta línea (entre otras que deberían ir)

Código PHP:

apiKeyTokenApi ePyJ0eXwiOiJKV1QiLwthbGciOiJIUzUx...........elTokenEsUnaCadenaLarga 

Eso lo podrías ver si usas soapUI o Postman, ahí te permite agregar las cabeceras que necesites

Saludos

egostar 02-03-2022 18:04:22

Continúo

En lo personal se me ha complicado usar HTTPRIO para el asunto de Headers "personalizados" por lo que he acudido a cURL para generar el REQUEST y enviarlo, la pega es que el proceso de armado del XML es artesanal, sin embargo, es una solución que me ha sacado de problemas siempre.

Hace poco hice una pequeña aplicación que usa cURL para Delphi y puedes descargarla desde mi bitácora en la sección de descargas


Saludos

CrazySoft 03-03-2022 00:04:52

Muchas gracias Egostar, hice el cambio que dijite para el envio de la cabecera pero ahora me da el siguente error: "Token no es valido", pese a que volvi a generar el toque nuevamente


realizare las pruebas con soapUI o Postman, como sugieres


estoy revisando la aplicacion que hiciste y vere de hacer los cambios que sugieres, estare comentando como me va



Cita:

Empezado por egostar (Mensaje 545753)
Continúo

En lo personal se me ha complicado usar HTTPRIO para el asunto de Headers "personalizados" por lo que he acudido a cURL para generar el REQUEST y enviarlo, la pega es que el proceso de armado del XML es artesanal, sin embargo, es una solución que me ha sacado de problemas siempre.

Hace poco hice una pequeña aplicación que usa cURL para Delphi y puedes descargarla desde mi bitácora en la sección de descargas


Saludos


gracias

egostar 03-03-2022 00:15:23

Cita:

Empezado por CrazySoft (Mensaje 545766)
Muchas gracias Egostar, hice el cambio que dijite para el envio de la cabecera pero ahora me da el siguente error: "Token no es valido", pese a que volvi a generar el toque nuevamente

realizare las pruebas con soapUI o Postman, como sugieres

estoy revisando la aplicacion que hiciste y vere de hacer los cambios que sugieres, estare comentando como me va

gracias


Te recomiendo que ya tengas un XML formado lo pases a la función DoSendRequest, y claro, las dll que se requieren de cURL en el directorio de la aplicación

Si abres la unidad uSOAP verás la parte donde se agregan los Headers; yo haría algo así

Código Delphi [-]
      ApiKey := 'ePyJ0eXwiOiJKV1QiLwthbGciOiJIUzUx...........elTokenEsUnaCadenaLarga';

      Header := nil;
      Header := curl_slist_append(Header, 'Accept-Encoding: gzip,deflate');
      Header := curl_slist_append(Header, 'SOAPAction: ""');
      Header := curl_slist_append(Header, PAnsiChar('apiKey: TokenApi ' + ApiKey));
      Header := curl_slist_append(Header, 'Content-Type: text/xml;charset=UTF-8;');
      Header := curl_slist_append(Header, 'User-Agent: Apache-HttpClient/4.5.5 (Java/12.0.1)');

Saludos

CrazySoft 03-03-2022 16:50:57

Gracias pude concecta con el cURL, pero estoy en problemas con el XML para enviar estoy revisando como hacer, use muy poco XML, ahora estoy aprendiendo




Cita:

Empezado por egostar (Mensaje 545768)
Te recomiendo que ya tengas un XML formado lo pases a la función DoSendRequest, y claro, las dll que se requieren de cURL en el directorio de la aplicación

Si abres la unidad uSOAP verás la parte donde se agregan los Headers; yo haría algo así

Código Delphi [-] ApiKey := 'ePyJ0eXwiOiJKV1QiLwthbGciOiJIUzUx...........elTokenEsUnaCadenaLarga'; Header := nil; Header := curl_slist_append(Header, 'Accept-Encoding: gzip,deflate'); Header := curl_slist_append(Header, 'SOAPAction: ""'); Header := curl_slist_append(Header, PAnsiChar('apiKey: TokenApi ' + ApiKey)); Header := curl_slist_append(Header, 'Content-Type: text/xml;charset=UTF-8;'); Header := curl_slist_append(Header, 'User-Agent: Apache-HttpClient/4.5.5 (Java/12.0.1)');


Saludos


egostar 03-03-2022 17:01:59

Cita:

Empezado por CrazySoft (Mensaje 545787)
Gracias pude concecta con el cURL,

Excelente ^\||/

Cita:

Empezado por CrazySoft (Mensaje 545787)
pero estoy en problemas con el XML para enviar estoy revisando como hacer, use muy poco XML, ahora estoy aprendiendo

Para hacer el XML hay varias formas, te recomiendo mires el XML Data Binding.

Saludos

CrazySoft 03-03-2022 17:02:46

Al añadir todo esto al HEAD, también dejo de dar error al usar HTTPRIO y valido el token correctamente



pero aun tengo problemas en consumo del servicio con HTTPRIO y cURL por causa del XML, que estoy aprendiendo



Gracias por toda la ayuda brindada hasta el momento y seguiré en el proceso



Código Delphi [-]
procedure TForm1.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  auth: string;

begin

  auth := 'Accept-Encoding: gzip,deflate';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := 'SOAPAction: ""';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := PAnsiChar('apiKey: TokenApi ' + Token);
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := 'Content-Type: text/xml;charset=UTF-8;';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := 'User-Agent: Apache-HttpClient/4.5.5 (Java/12.0.1)';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);

end;

egostar 03-03-2022 17:07:21

Cita:

Empezado por CrazySoft (Mensaje 545789)
Al añadir todo esto al HEAD, también dejo de dar error al usar HTTPRIO y valido el token correctamente



pero aun tengo problemas en consumo del servicio con HTTPRIO y cURL por causa del XML, que estoy aprendiendo



Gracias por toda la ayuda brindada hasta el momento y seguiré en el proceso



Código Delphi [-]
procedure TForm1.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  auth: string;

begin

  auth := 'Accept-Encoding: gzip,deflate';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := 'SOAPAction: ""';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := PAnsiChar('apiKey: TokenApi ' + Token);
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := 'Content-Type: text/xml;charset=UTF-8;';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
  auth := 'User-Agent: Apache-HttpClient/4.5.5 (Java/12.0.1)';
  HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);

end;


Muy bien, ya aprendimos todos algo nuevo. ^\||/

Saludos

CrazySoft 04-03-2022 01:13:55

Cita:

Empezado por egostar (Mensaje 545788)
Excelente ^\||/



Para hacer el XML hay varias formas, te recomiendo mires el XML Data Binding.

Saludos




^\||/ Gracias, saludos


La franja horaria es GMT +2. Ahora son las 21:02:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi