Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-01-2019
fmira fmira is offline
Registrado
 
Registrado: ene 2011
Posts: 5
Poder: 0
fmira Va por buen camino
Integracion con pago por tarjeta Redsys: TpvPcImplantado.dll

Buenas tardes,


Estoy intentando integrar el módulo de pago de Redsys con una de nuestras aplicaciones. Para ello utilizamos la librería TpcPcImplantado.dll (que nos facilita Redsys).


La verdad es que nos da muchísimos problemas, si queremos usarla como ActiveX da errores de importación en las versiones 2007 y Rad Studio 10.2,en funciona en Delphi 5 se importa bien pero si en el proyecto usas alguna función de la unidad shlobj de Delphi da errores de “Access violation” en olaut32.dll.


Si la intentamos usar como una DLL, no se carga si el IDE de Delphi está abierto. Si la inicias con fndllIniTpvpcLatente te devuelve respuesta Ok y cuando intentas ejecutar cualquier otra función te diche que no está inicializado

Alguna idea?
Gracias por anticipado.
Responder Con Cita
  #2  
Antiguo 14-01-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Habéis consultado a Redsys?
Responder Con Cita
  #3  
Antiguo 15-01-2019
fmira fmira is offline
Registrado
 
Registrado: ene 2011
Posts: 5
Poder: 0
fmira Va por buen camino
Si. He consultado a Redsys y me dicen que tienen ejemplos en C, Visual Basic, HTML, Java, pero nada en Delphi.
Abro un ejemplo de VB o C, intento hacer lo mismo en Delphi (es relativamente sencillo) y da errores. Yo creo que es la manera de cargar a la libreria o definir las funcones de la dll.
Responder Con Cita
  #4  
Antiguo 15-01-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Difícil ayudarte si no tenemos esa dll ni vemos el código que estás usando, ni el que tienen de ejemplo en redsys
Responder Con Cita
  #5  
Antiguo 28-03-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 123
Poder: 18
APO Va por buen camino
Yo utilizo la dllTpvpcLatente.dll y funciona correctamente. Te pongo el código de la declaración y creación:

Código Delphi [-]
   //Declaración Objeto REDSYS
   Tpvpc: TTpvpc;

   //Creamos el Objeto RedSys
   if Tpvpc=nil then Tpvpc:=TTpvpc.Create(Tpvpc_Comercio,Tpvpc_Terminal,Tpvpc_ClaveFirma);
Responder Con Cita
  #6  
Antiguo 10-05-2019
mqm mqm is offline
Miembro
 
Registrado: nov 2006
Posts: 41
Poder: 0
mqm Va por buen camino
Estoy liado con lo mismo, abrir desde delphi una pasarela de cobro con redsys.
Podrías mostrar un pequeño ejemplo de como realizas el proceso?
Responder Con Cita
  #7  
Antiguo 20-09-2019
RUBEN_SP RUBEN_SP is offline
Miembro
 
Registrado: mar 2008
Posts: 24
Poder: 0
RUBEN_SP Va por buen camino
Hola APO

¿Me puedes indicar como lo haces? y ¿Donde consigues la DLL?

Gracias de antemano y saludos
Responder Con Cita
  #8  
Antiguo 19-02-2020
tec tec is offline
Miembro
 
Registrado: dic 2009
Posts: 37
Poder: 0
tec Va por buen camino
dllTpvpcLatente.dll

Buenos días,


debo implantar la integración con dicha libreria en D6. ¿ Se puede con D6 ?. ¿ Algún ejemplo ?



Muchas gracias,


Saludos
Responder Con Cita
  #9  
Antiguo 30-10-2020
nincillo nincillo is offline
Miembro
 
Registrado: may 2017
Posts: 178
Poder: 8
nincillo Va por buen camino
Conseguir hacer funcionar la OperPinPad

Creo que necesito ayuda para saber como tratar la cadena que me devuelve dicha función en uno de sus parámetros.
La función devuelve un integer, y luego la "chicha" la devuelve en uno de los parámetros, que se supone que es una string con formato xml.

Yo hago la llamada a la función, y en el valor entero que me devuelve al función me viene un 0, con lo cual se supone que todo fue correcto, pero cuando intenten visualizar el contenido que ve viene en el parámetro string o añadirlo a las lineas de un memo, el programa se cierra de pronto sin llegar a sacar ningún mensaje de error.

Voy a poner el formato de llamada que viene en el manual y posteriormente los trozos de código de Delphi2007.

Cita:
Identificador Objeto: DllTpvpcLatente.TpvpImplantado

Para inicializar (que me funciona perfectamente):
int fnDllIniTpvpcLatente(LPCTSTR cComercio, LPCTSTR cTerminal, LPCTSTR cClaveFirma, LPCTSTR cConfPuerto, LPCTSTR cVersion)

Para mandar la petición de pago (que me funciona parcialmente, me aparece en el importe del pinpad el importe a cobrar y todo, pero que me rompe al intentar tratar el parámetro en el que me viene la información "importante" de la operación):
int fnDllOperPinPad(LPCTSTR cImporte, LPCTSTR cFactura, LPCTSTR cTipoOper, LPTSTR cXMLResp, int iTamMaxResp);
Un ejemplo que ponen en .NET
Cita:
[DllImport("dllTpvpcLatente.dll")]
public static extern int fnDllOperPinPad(String cImporte, String cFactura, String cTipoOper, StringBuilder cXMLResp, int iTamMaxResp);

/// <summary>
/// Función que confirma como se quiere realizar una operación que es DCC. Este método sólo debe
/// ser llamado después de fnDllOperPinPad.
/// </summary>
/// <param name="cImporte">Mismo valor que el que se utilizó en fnDllOperPinPad</param>
/// <param name="cFactura">Mismo valor que el que se utilizó en fnDllOperPinPad</param>
/// <param name="cTipoOper">Mismo valor que el que se utilizó en fnDllOperPinPad</param>
/// <param name="cCodDivisa">Código de divisa que debe seleccionar el Titular de la Tarjeta.</param>
/// <param name="cXMLResp">buffer que almacenará la cadena con el XML de respuesta recibido desde el TPV-PC. El XML se describe en detalle en el documento TPVPC WS Consultas 2d1.</param>
/// <param name="iTamMaxResp">tamaño máximo de la cadena que puede almacenar el buffer cXMLResp.</param>
/// <returns>valor = 0, la operación se proceso correctamente. Este resultado no indica que se ha autorizado o denegado, simplemente
/// que la petición se ha realizado con exito. Para ver el resultado de la operación se debe analizar la respuesta
/// recibida en cXMLResp.
///
Y como hago yo la definición en Delphi que seguro que algo estoy haciendo mal en la definición o en el tratamiento de la respuesta:
Cita:
implementation

{$R *.dfm}
// Método dinámico ->
type
TOperPinPad = function(cImporte, cFactura, cTipoOper :string; var cXmlResp :String; iTamMaxResp : integer) : integer;stdcall;

.....

procedure TForm1.BtnEnviarClick(Sender: TObject);
var
err : Integer;
OperPinPad : TOperPinPad;
cImporte, cFactura, cTipoOper:string;
cXmlResp: String;
iTamMaxResp:Integer;
begin
// if Conectado then
begin
{ Intento mandar la orden de pago }
@OperPinPad := GetProcAddress(dllHandleTpvPcLatente, PChar('fnDllOperPinPad'));
if @OperPinPad <> Nil then
begin
iTamMaxResp := 1024;
cImporte:= '0.01';
cFactura:='NF 2222';
cTipoOper:='PAGO';
cXmlResp:='';
err:=OperPinPad(cImporte, cFactura, cTipoOper, cXmlResp, iTamMaxResp);
Memo1.lines.add('Resultado: ' + IntToStr(err));
ShowMessage('Resultado: ' + IntToStr(err));
ShowMessage('cXmlResp: ' + cXmlResp);
Memo1.lines.add('cXmlResp: ' + cXmlResp) // --> Al principio, la llegar a esta línea, rompía. Ahora ya rompe al hacer el ShowMessage de un poco más arriba
end;
end
// else
// Memo1.lines.add('No hay conexión establecida...');
end;
Responder Con Cita
  #10  
Antiguo 24-02-2025
Maska10 Maska10 is offline
Miembro
 
Registrado: abr 2020
Posts: 48
Poder: 0
Maska10 Va por buen camino
Cita:
Empezado por nincillo Ver Mensaje
Creo que necesito ayuda para saber como tratar la cadena que me devuelve dicha función en uno de sus parámetros.
La función devuelve un integer, y luego la "chicha" la devuelve en uno de los parámetros, que se supone que es una string con formato xml.

Yo hago la llamada a la función, y en el valor entero que me devuelve al función me viene un 0, con lo cual se supone que todo fue correcto, pero cuando intenten visualizar el contenido que ve viene en el parámetro string o añadirlo a las lineas de un memo, el programa se cierra de pronto sin llegar a sacar ningún mensaje de error.

Voy a poner el formato de llamada que viene en el manual y posteriormente los trozos de código de Delphi2007.



Un ejemplo que ponen en .NET


Y como hago yo la definición en Delphi que seguro que algo estoy haciendo mal en la definición o en el tratamiento de la respuesta:
Buenas tardes compañero, tengo exactamente el mismo problema con la respuesta ... ¿conseguiste saber cual era el problema?

Saludos.
Responder Con Cita
  #11  
Antiguo 25-02-2025
Maska10 Maska10 is offline
Miembro
 
Registrado: abr 2020
Posts: 48
Poder: 0
Maska10 Va por buen camino
Me contesto yo solo, la solución pasa por usar una variable de array of char en vez de un string.
Responder Con Cita
  #12  
Antiguo 25-02-2025
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Maska10 Ver Mensaje
Me contesto yo solo, la solución pasa por usar una variable de array of char en vez de un string.

Es una norma genérica, en DLL, ActiveX, COM,... nunca usar string, siempre punteros, PChar, PAnsiChar,...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #13  
Antiguo 25-02-2025
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.905
Poder: 22
newtron Va camino a la fama
Buenas.


Este es un tema que me interesa. En su día (hace años) contacté con RedSys para poder usar sus terminales pero me plantearon unas condiciones de "homologación" brutales por lo que al final desistí del tema.


Hace año y pico decidí integrar la plataforma Paytef con lo que el tema fue bastante más llevadero pero claro, tienes que ceñirte a sus condiciones de terminales propios y pagar un mantenimiento, pequeño pero hay que pagar.


Si obtienes resultados te agradecería que comentaras.


Gracias y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #14  
Antiguo 26-02-2025
Maska10 Maska10 is offline
Miembro
 
Registrado: abr 2020
Posts: 48
Poder: 0
Maska10 Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
Buenas.


Este es un tema que me interesa. En su día (hace años) contacté con RedSys para poder usar sus terminales pero me plantearon unas condiciones de "homologación" brutales por lo que al final desistí del tema.


Hace año y pico decidí integrar la plataforma Paytef con lo que el tema fue bastante más llevadero pero claro, tienes que ceñirte a sus condiciones de terminales propios y pagar un mantenimiento, pequeño pero hay que pagar.


Si obtienes resultados te agradecería que comentaras.


Gracias y un saludo.
Exacto, yo estuve en la misma situación, incluso también integré Paytef .... resulta que para esto tienes la librería dllTpvpcLatente.dll que es de Redsys y ya está homologada por lo que solamente tienes que trabajar con ella y solo necesitas el código de comercio, clave de firma y número de terminal.

Notas:

- La documentación es una castaña
- Hasta descubrir que carajo de librería necesitas es navegar, preguntar, que te digan chorradas, que no saben, preguntas a tu banco, preguntas a Redsys ... nadie sabe que carajo le estas diciendo.
- La de tiempo de mi vida que habré perdido con esto y al final era sencillo

Resumen:

1 - Logicamente necesitas el servicio TPV/PC de Redsys (contratado en tu banco)
2 - Para conectar a ese TPV/PC de las narices vas a optar por el método SLIM PACK, que es el que proporciona la librería y por tanto no tienes que homologar tu aplicación (ya que la que interactura con el datafono, pin-pad, ping pong) es la librería
3 - La documentación es cachonda, por ejemplo la función para conectar e inicializar el datafono te pide varios parámetros (codigo de comercio, número de terminal, clave de firma), pero también el puerto com al que está conectado y la versión ... pero luego la documentación te dice que los 2 últimos no los tienes que pasar .. y claro, como la función los espera, no sabes si enviar cadena en blanco, nulo, o que carajo .. así que prueba/error
4 - Respecto al útimo problema que tenía el otro usuario (y yo) que al final era el tipo de variable, pues eso, la documentación te dice que le pases un string, pero te dice que es un "buffer de string", así que creando el puntero pues ha quedado resuelto.

En fin, si necesitas el código de la función me dices.
Responder Con Cita
  #15  
Antiguo 26-02-2025
jakematespain jakematespain is offline
Registrado
 
Registrado: ene 2025
Posts: 8
Poder: 0
jakematespain Va por buen camino
Hola, yo justo también estoy liado con ese tema, si me pudiese pasar un ejemplo de como haces el proceso de la declaracion y llamada te lo agradecería. Como dices, la documentación es muy mala y conseguir las librería es todo un suplicio.
Gracias de antemano.
Responder Con Cita
  #16  
Antiguo 26-02-2025
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.905
Poder: 22
newtron Va camino a la fama
Cita:
Empezado por Maska10 Ver Mensaje
...
En fin, si necesitas el código de la función me dices.

¡¡Pues claro!!


Gracias y un saludo.
__________________
Be water my friend.
Responder Con Cita
  #17  
Antiguo 26-02-2025
Maska10 Maska10 is offline
Miembro
 
Registrado: abr 2020
Posts: 48
Poder: 0
Maska10 Va por buen camino
Aquí os dejo el código, la primera función es solo para pasar el array of char a String, la segunda función es la que creo que buscais:

Código Delphi [-]
function tfrmentradassalidascaja.ArrayToString(const a: array of Char): string;
begin
  if Length(a)>0 then
    SetString(Result, PChar(@a[0]), Length(a))
  else
    Result := '';
end;


procedure tfrmentradassalidascaja.enviadatafono(Sender: TObject);
type
  TIniTpvpcLatente = Function(cComercio,cTerminal,cClaveFirma,cConfPuerto,cVersion: string) : integer;stdcall;
  TOperPinPad = function(cImporte, cFactura, cTipoOper :string; var cXmlResp :array of Char; iTamMaxResp : integer) : integer;stdcall;
var
  DLLHandle: THandle;
  IniTpvpcLatente: TIniTpvpcLatente;
  OperPinPad: TOperPinPad;
  respuesta: integer;
  strrespuesta, codcomercio,terminal,firma,importe,venta: string;
  Str2: array[0..29999] of Char;

begin

  codcomercio:='45465464';
  firma:='assadfsadfasdfsadfsadf';
  terminal:='1';
  importe:='20.50';
  venta:='Fact1001';

  DLLHandle := LoadLibrary('dllTpvpcLatente.dll');
  try
    if DLLHandle <= 0 then
      begin
      ShowMessage('Error, conector dllTpvcLatente.dll no encontrado');
      exit;
      end;


    @IniTpvpcLatente := GetProcAddress(DLLHandle, 'fnDllIniTpvpcLatente');
    @OperPinPad := GetProcAddress(DLLHandle, PChar('fnDllOperPinPad'));

    if Assigned(IniTpvpcLatente) then
    begin
           respuesta:=IniTpvpcLatente(codcomercio,terminal,firma,'','');
           if respuesta < 0 then
              begin
              showmessage('Error de comunicación con el Datafono/Tpv/PinPad, código de error: ' + inttostr(respuesta));
              Exit;
              end;

           strrespuesta:='';
           respuesta:=OperPinPad(importe,venta,'PAGO',Str2,30000);
           if respuesta < 0 then
              begin
              showmessage('Error al enviar la orden al Datafono/Tpv/PinPad, código de error: ' + inttostr(respuesta));
              Exit;
              end;

           strrespuesta:=ArrayToString(Str2);


           if pos('Autorizada',strrespuesta)> 0 then
              begin
              // aceptada
        showmessage('Operación Aceptada');
              end
           else
              begin
              // denegada
              showmessage('Operación Denegada');
              exit;
              end;

    end
    else
      begin
      ShowMessage('Error, procedimiento/Funcion no encontrado');
      end;

  except
     on E : Exception do
     begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
     end;
  end;

end;

Última edición por Casimiro Notevi fecha: 26-02-2025 a las 20:34:39.
Responder Con Cita
  #18  
Antiguo 27-02-2025
jakematespain jakematespain is offline
Registrado
 
Registrado: ene 2025
Posts: 8
Poder: 0
jakematespain Va por buen camino
Muchas gracias Maska10, voy a probarlo.
Gracias
Responder Con Cita
  #19  
Antiguo 27-02-2025
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.905
Poder: 22
newtron Va camino a la fama
Gracias compañero... ahora me toca buscar un datáfono operativo para hacer alguna prueba.



Saludos.
__________________
Be water my friend.
Responder Con Cita
  #20  
Antiguo 28-02-2025
jakematespain jakematespain is offline
Registrado
 
Registrado: ene 2025
Posts: 8
Poder: 0
jakematespain Va por buen camino
Maska10, me ha funcionado el código. Muchas gracias.
Lo único, que como comentaste que la documentación es muy mala, te dice que no tienes que indicar el puerto ni la versión, pero si no lo pones te da un error -18, de datos incorrectos.
El puerto es el que viene en windows y en el panel de Redsys te aparece la versión.
Ojo, hay que indicar en el puerto una configuración del como (el puerto es el que tenga asignado el datáfono en windows)
COM5:,19200,N,8,1
y para la versión yo puse:
6.1

Indicando esos valores me funcionó el mandar el importe.

Muchas gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Integración con una dll externa con COM+ jars Providers 2 08-03-2013 11:09:42
Pago con Tarjeta de Credito OnLine Neeruu Internet 8 24-02-2012 22:33:14
Integración de php y delphi Will PHP 4 10-08-2006 23:13:48
Integración de datos kalimero Firebird e Interbase 3 17-02-2005 22:03:38
Pago con tarjeta de crédito aom PHP 6 30-11-2004 10:16:40


La franja horaria es GMT +2. Ahora son las 13:47:34.


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