Autor Tema: Como hacer una DLL (OCX/COM) con la envoltura de otra DLL  (Leído 185 veces)

Nrvous

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Muy buenas a tod@s:
Este es mi primer post.
Soy un programador del ERP, Dynamics NAV en una versión antigua en una pequeña empresa.
Estoy intentando integrar un TPV-PC de Redsys para que el ERP envie los datos al TPV (Importe) y recoja la respuesta. Redsys proporciona una libreria COM/OCX que a la que puedo llamar a las propiedades y métodos del TPV. Hasta aquí todo bien. El problema es que mi ERP tiene una limitación en la respuesta que devuelve el TPV, ya que devuelve un XML en un string y mi ERP tiene una limitación de 1024 caracteres, y claro no puede con el.
Así que había pensado hacer una envoltura en C# creando una librería que llame a esa librería DLL, procese el XML y devuelva un array o varios strings con los datos que me interesan para que el ERP pueda procesarlo. De esta manera yo llamaría a la nueva DLL/OCX/COM creada y obtendria los datos ya procesados.

El caso es que no tengo ni idea de C# ni de como registrar correctamente luego esa librería creada para que aparezca como un COM/OCX visible por mi ERP.
Para cualquier otro método de llamada de la librería sería un método análogo
Tengo una copia antigua de Visual Studio 2008, y estoy intentando hacerlo con esto
Os detallo el código, que evidentemente no funciona, también detallo el ejemplo de llamada que indica la documentación
Se agradecería cualquier indicación para llegar a buen puerto, Muchas gracias
Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml; 
using DLLTPVPCLATENTELib;

namespace WrapperTPVCSharp{

class WrappTPVPC {
    public string OperTPV(String cImporte, String cFactura, String cTipoOper, String FakeXML, int iTamResp) {
        string ResultadoTPV = new string [6];}
        public static extern int fnDllOperPinPad(String cImporte,
        String cFactura, String cTipoOper, String cXMLResp,
        int iTamMaxResp);
}
        if (fnDllOperPinPad(String cImporte,
        String cFactura, String cTipoOper, String cXMLResp,
        int iTamMaxResp) = 0 ) {
         XmlDocument RespXML =new XmlDocument();
         RespXML.LoadXml(cXMLResp);
         ResultadoTPV[1]:='0'; // Ya he verificado que la operación ha sido procesada
         foreach(XmlNode nodo in RespXML.DocumentElement.ChildNodes{
          if nodo.Name == "pedido" {
            RespXML[2] = nodo.InnerText;
            }
          if nodo.Name == "identificadorRTS" {
            RespXML[3] = nodo.InnerText;
            }
          if nodo.Name == "estado" {
            RespXML[4] = nodo.InnerText;
            }
          if nodo.Name == "resultado" {
            RespXML[5] = nodo.InnerText;
            }
         if nodo.Name == "codigoRespuesta" {
            RespXML[6] = nodo.InnerText;
            }
        ResultadoTPV = RespXML;
    }
        Return ResultadoTPV;

}

Documentación:
 Realizar  un  Pago  o  una  Preautorización  utilizando  un
dispositivo PinPad
Parámetros de entrada/salida:
 
cImporte,  importe  de  la  transacción  en  formato  XXXXXXXXX.XX.
Ejemplo: 1.23, 33.05, 0.01, etc.
cFactura,  referencia  de  compra.  Este  valor  lo  puede  especificar  el
comercio para ayudarle a identificar la transacción.
cTipoOper, indica el tipo de operación a realizar. Valores posibles:
    “PAGO” -> Se realizará un Pago.
    “PREAUTORIZACION” -> Se realizará una preautorización.
 
cXMLResp, buffer, que almacenará una cadena XML con el resultado de
la  operación  de  pago  o  preautorización.  El  formato  de  este  XML  se
encuentra detallado en la documentación "Conexión con TPVPC a través
de WEB SERVICE" versión 6.0.
iTamMaxResp,   indica   el   tamaño   máximo   del   buffer   donde   se
almacenará  la  cadena  XML  con  el  resultado  de  la  operación.  Se
recomienda al menos un tamaño de 1024 bytes.     
 
Valor de retorno:       
Valor  0,    indica  que  la  operación  se  ha  procesado  correctamente.
Muy  importante  resaltar  que  este  resultado  NO  INDICA  QUE  LA
OPERACIÓN  ESTË  AUTORIZADA,  tan  sólo  es  el  resultado  de  su
proceso.
Valor distinto de 0,  Código de error indicando el motivo del fallo. 
En el Anexo III, se detallan estos errores.
Siempre que se devuelva el código -2, es necesario realizar
una consulta de la última operación realizada por el comercio,
para ver si la operación resultó autorizada.
 
 
int    fnDllOperPinPad(LPCTSTR    cImporte,    LPCTSTR    cFactura,
LPCTSTR cTipoOper, LPTSTR cXMLResp, int iTamMaxResp);
Ejemplo de llamada en C#
Código: [Seleccionar]
[DllImport("dllTpvpcLatente.dll")]
public static extern int fnDllOperPinPad(String cImporte,
String cFactura, String cTipoOper, StringBuilder cXMLResp,
int iTamMaxResp);
Ejemplo de respuesta del XML

Código: [Seleccionar]
<Operaciones version="6.0">
<resultadoOperacion>
<tipoPago>PAGO</tipoPago>
<importe>1.01</importe>
<moneda>978</moneda>
<tarjetaComercioRecibo>************0018</tarjetaComercioRecibo>
<tarjetaClienteRecibo>************0018</tarjetaClienteRecibo>
<marcaTarjeta>2</marcaTarjeta>
<caducidad>1210</caducidad>
<comercio>777888991</comercio>
<terminal>1</terminal>
<pedido>10549</pedido>
<tipoTasaAplicada>DEB</tipoTasaAplicada>
<identificadorRTS>070001070319153828378272</identificadorRTS>
<factura>FAC-LATENTE</factura>
<fechaOperacion>2007-03-19 15:38:28.484</fechaOperacion>
<estado>F</estado>
<resultado>Autorizada</resultado>
<codigoRespuesta>080922</codigoRespuesta>
<Literales>
<literal>NO REFUND</literal>
</Literales>
<firma>664AD45F54C3EB4D06A354E3158A17966012A1B8</firma>
<operacionemv>true</operacionemv>
<conttrans>001391</conttrans>
<sectarjeta>00</sectarjeta>
<idapp>A0000000043060</idapp>
<codrespauto>00</codrespauto>
<resverificacion>0800208000</resverificacion>
</resultadoOperacion>
</Operaciones>
« Última modificación: 20 de Mayo 2021, 19:17 por Nrvous »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".