Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-11-2023
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
Petición HTTP

Hola a tod@s.


Estoy intentando comunicarme con un "PinPad" (lector de tarjetas de crédito) y para eso me dicen que tengo que hacer una llamada con el siguiente formato:



El tema es que estoy un poco liado porque para esto imagino que tendría que usar un objeto HTTPClient insertando un JSONObject con el cuerpo del mensaje y tengo un par de problemas:


- No sé cómo crearlo teniendo en cuenta de que hay en medio una especie de array en el elemento "executeOptions".
- De todas formas he hecho una llamada de pruebas con un json que seguramente no valdrá, pero por si acaso, y el "PinPad" ni se inmuta y ya no sé si es que estoy haciendo algo mal o me estoy equivocando al poner ip o puerto o qué pasa.


El código que estoy usando es uno que he pillado de un ejemplo que puso nuestro compañero Keys y lo he tuneado:
Código Delphi [-]
procedure TForm2.Button2Click(Sender: TObject);var
  sAux,Enviar: String;
  LRequest: THTTPClient;

  LResponse: TStringStream;
  JSONData: TJSONObject;
  StringStream: TStringStream;
  valido : Boolean;
  vJSONArray: TJSONArray;
  JSONDataArray: TJSONObject;
begin

  LRequest := THTTPClient.Create;
  LResponse := TStringStream.Create;

  vJSONArray := TJSONArray.Create;
  JSONDataArray := TJSONObject.Create;
  JSONDataArray.AddPair('method','polling');
  vJSONArray.AddElement(JSONDataArray);

  //Objeto JSON para enviar los datos
  JSONData := TJSONObject.Create;
  JSONData.AddPair('pinpad', '*');
  JSONData.AddPair('opType','sale');
  JSONData.AddPair('cardNumberHashDomain','branch');
  JSONData.AddPair('createReceipt',TJSONFalse.Create);
  JSONData.AddPair('executeOptions', vJSONArray);
  JSONData.AddPair('language','es');
  JSONData.AddPair('requestedAmount',TJSONNumber.Create(200));
  JSONData.AddPair('requireConfirmation',TJSONFalse.Create);
  JSONData.AddPair('transactionReference','Operación N 256498');

  try

    Lrequest.ContentType := 'application/json';

    StringStream := TStringStream.Create(JSONData.ToString, TEncoding.UTF8);

    LRequest.Post('http://192.168.1.34:8887/transaction/start', StringStream , LResponse);

    JSONData := TJSONObject.ParseJSONValue(LResponse.DataString) as TJSONObject;

    if Assigned(JSONData) then begin

    end;

    JsonData.destroy;
    LResponse.Free;
    LRequest.Free;
    StringStream.Destroy;
  except
    JsonData.destroy;
    LResponse.Free;
    LRequest.Free;
    StringStream.Destroy;
  end;


end;


A ver si algún amable forero me pueda dar luz.


Gracias y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #2  
Antiguo 30-11-2023
lucho6007 lucho6007 is offline
Miembro
 
Registrado: ene 2009
Ubicación: Junín, pcia de BsAs, Argentina
Posts: 74
Poder: 16
lucho6007 Va por buen camino
Ejemplo con Indy

Hola!
No se qué versión de Delphi usas, pero este ejemplo sirve para versiones viejitas y nuevas:
En el uses de la unidad agregás:
Código Delphi [-]
IdServerIOHandler, IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, McJson,

McJSon es una unidad de manejo de JSON, descargable desde https://github.com/hydrobyte/McJSON

En la implementación agregás:
Código Delphi [-]
function TForm1.GetResponse(Verb, URL: String; AText: String): String;
var
  AHTTP: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;

  JsonToSend: TStringStream;
begin
  AHTTP:= TIdHTTP.Create(nil);
  SSL:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  AHTTP.IOHandler:= SSL;
  AHTTP.AllowCookies:= True;
  AHTTP.HTTPOptions:= [hoForceEncodeParams];

  AHTTP.Request.BasicAuthentication:= True;

  AHTTP.Request.Accept:= 'application/json';
  AHTTP.Request.AcceptCharSet := 'utf-8';
  AHTTP.Request.ContentType:= 'application/json';
  AHTTP.Request.UserAgent:= 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0';
  AHTTP.Request.CharSet:= 'utf-8';

  SSL.SSLOptions.Method:= sslvSSLv23;
  SSL.SSLOptions.Mode:= sslmUnassigned;
  SSL.SSLOptions.VerifyMode:= [];
  SSL.SSLOptions.VerifyDepth:= 0;
  SSL.SSLOptions.SSLVersions := [sslvSSLv23, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];

  if AText <> '' then begin
    JsonToSend := TStringStream.Create(Utf8Encode(AText));
  end;

  Result:= '';
  if (URL <> '') then begin
    if UpperCase(Verb) = 'GET' then begin
      try
        Result:= AHTTP.Get(URL);
      except
        on E: Exception do begin
          Result:= '{"Error":"' +  E.Message + '"}';
        end;
      end;
    end
    else begin
      if UpperCase(Verb) = 'PUT' then begin
        try
          Result:= AHTTP.Put(URL, JsonToSend);
        except
          on E: Exception do begin
            Result:= '{"Error":"' +  E.Message + '"}';
          end;
        end;
      end
      else begin
        if UpperCase(Verb) = 'POST' then begin
          try
            Result:= AHTTP.Post(URL, JsonToSend);
          except
            on E: Exception do begin
              Result:= '{"Error":"' +  E.Message + '"}';
            end;
          end;
        end;
      end;
    end;
  end;

  SSL.Free;
  AHTTP.Free;
end;

Un ejemplo de llamada y creación del JSON:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var AJSonStr: String;
    AJSon: TMcJsonItem;
begin
  AJSon:= TMcJsonItem.Create;
  AJSon.Clear;
  AJSon.Add('pinpad').AsString:= '*';
  AJSon.Add('opType').AsString:= 'sale';
  AJSon.Add('cardNumberHashDomain').AsString:= 'branch';
  AJSon.Add('createReceipt').AsBoolean:= false;
  AJSon.Add('executeOptions', jitObject);
  AJSon.O['executeOptions'].Add('method').AsString:= 'pooling';
  AJSon.Add('language').AsString:= 'es';
  AJSon.Add('requestedAmount').AsNumber:= 200;
  AJSon.Add('requireConfirmation').AsBoolean:= false;
  AJSon.Add('transactionReference').AsString:= 'Operation N 45664';

  AJSonStr:= AJSon.AsJSON;

  AJSon.Free;
  Caption:= GetResponse('POST', 'http://192.168.1.34:8887/transaction/start', AJSonStr);
end;
En el Caption del form tendrás la respuesta del equipo.

Espero te ayude!
Saludos
Lucho

Última edición por lucho6007 fecha: 30-11-2023 a las 14:27:08. Razón: salian mal las etiquetas
Responder Con Cita
  #3  
Antiguo 30-11-2023
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
Lucho. Gracias por tu respuesta y tu código.


Estoy montándolo y me da error en la linea:


Código Delphi [-]
 AJSon.Add['executeOptions'].Add('method').AsString:= 'pooling';


Me dice: Object reference is nil: get item by key "executeOptions"


¿Alguna idea de qué puede ser?


Gracias de nuevo y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #4  
Antiguo 30-11-2023
lucho6007 lucho6007 is offline
Miembro
 
Registrado: ene 2009
Ubicación: Junín, pcia de BsAs, Argentina
Posts: 74
Poder: 16
lucho6007 Va por buen camino
Hola!
Fijate que el código que te envié es
Código Delphi [-]
  AJSon.Add('executeOptions', jitObject);   AJSon.O['executeOptions'].Add('method').AsString:= 'pooling';


y vos estás ejecutando


Código Delphi [-]
AJSon.Add['executeOptions'].Add('method').AsString:= 'pooling';


Primero tenés que agregar el objecto y luego el contenido.


SAludos
Responder Con Cita
  #5  
Antiguo 30-11-2023
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
Buenas de nuevo.


Tienes razón, no estaba poniendo bien el código. Infeliz de mi pensaba que la parte .. AJSon.O[' ... por lo que fuera no estaba bien escrita y la había corregido cambiando la O por Add



Muchas gracias. Me ha servido muchísimo.


Saludos.
__________________
Be water my friend.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Petición web http con error IOHandler 8051 C++ Builder 1 30-01-2010 13:47:01
HTTP GET y HTTP POST utilizando WinInet dec Trucos 6 08-09-2008 11:52:03
Petición de contenido chico_bds Varios 0 04-04-2007 18:57:23
Una petición extraña Arcioneo La Taberna 11 03-10-2006 15:43:30
Como hacer petición HTTP Bauhaus1975 Varios 2 13-06-2005 21:12:38


La franja horaria es GMT +2. Ahora son las 08:51:19.


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
Copyright 1996-2007 Club Delphi