# Slim Pack: Integración C

La integración de Get Central en un entorno .NET se realiza a través de **Platform Invocation Services (P/Invoke)**, lo que permite que el código C# administrado llame a la biblioteca nativa de Get Central. Esta guía explica cómo configurar tu proyecto, declarar las funciones nativas y ejecutar una operación de pago básica utilizando el modelo de integración Slim Pack.

Esta guía se aplica a **Slim Pack**.

## Requisitos

Antes de comenzar, asegúrate de tener:

* **dllTpvpcLatente.dll** disponible en tiempo de ejecución
* Todas las dependencias nativas requeridas presentes en el mismo directorio
* **Visual Studio** u otro IDE compatible con .NET
* **Plataforma de Destino del proyecto establecida en x86** (la biblioteca es de 32 bits)

Si no se compila o ejecuta en modo x86, se producirá una `BadImageFormatException`.

## Proceso de integración C-Sharp

El proceso de integración consiste en mapear las funciones de la biblioteca nativa e invocarlas desde el código administrado. No se envía XML como solicitud; los parámetros se pasan posicionalmente, y el XML se devuelve como respuesta.

### Paso 1: Declarar funciones nativas

Las funciones nativas se declaran utilizando el atributo `DllImport`. La biblioteca expone un conjunto fijo de puntos de entrada que deben mapearse exactamente.

**Inicialización de la Biblioteca**

Las siguientes funciones se utilizan para inicializar la biblioteca:

| Parámetro     | Tipo   | Descripción                                                                                   |
| ------------- | ------ | --------------------------------------------------------------------------------------------- |
| `cComercio`   | string | Número de comercio. Este dato es facilitado por la entidad.                        |
| `cTerminal`   | string | Número de terminal. Este dato es facilitado por la entidad.                        |
| `cClaveFirma` | string | Clave de firma del comercio. Este dato es facilitado por la entidad.              |
| `cConfPuerto` | string | Configuración de puerto. Déjalo en blanco para usar la configuración local.       |
| `cVersion`    | string | Versión del protocolo: `5.1`, `6.1` u `8.1`. Déjalo en blanco para usar la configurada. |

```csharp
[DllImport("dllTpvpcLatente.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern int fnDllIniTpvpcLatente(
    string cComercio,
    string cTerminal,
    string cClaveFirma,
    string cConfPuerto,
    string cVersion
);
```

**Ejecución de Pago**

Las siguientes funciones se utilizan para ejecutar una operación de pago:

| Parámetro     | Tipo          | Descripción                                                           |
| ------------- | ------------- | --------------------------------------------------------------------- |
| `cImporte`    | string        | Importe de la transacción en formato `XXXXXXXXX.XX`.                  |
| `cFactura`    | string        | Referencia de compra. Este valor lo puede especificar el comercio. |
| `cTipoOper`   | string        | Tipo de operación. Para pagos estándar, use `PAGO`.                   |
| `cXMLResp`    | StringBuilder | Buffer que recibe la respuesta XML.                                    |
| `iTamMaxResp` | int           | Tamaño máximo del buffer de respuesta.                                 |

```csharp
[DllImport("dllTpvpcLatente.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern int fnDllOperPinPad(
    string cImporte,
    string cFactura,
    string cTipoOper,
    StringBuilder cXMLResp,
    int iTamMaxResp
);
```

**Finalización de la Biblioteca**

Las siguientes funciones se utilizan para finalizar la biblioteca:

| Parámetro | Tipo | Descripción                        |
| --------- | ---- | ---------------------------------- |
| —         | —    | Esta función no recibe parámetros. |

```csharp
[DllImport("dllTpvpcLatente.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int fnDllParaTpvpcLatente();
```

### Paso 2: Inicializar la biblioteca

Antes de ejecutar cualquier transacción, la biblioteca debe inicializarse una vez por ciclo de vida de la aplicación.

```csharp
int result = fnDllIniTpvpcLatente(
    "99999999",
    "00000001",
    "CLAVE123456",
    "",
    ""
);

if (result != 0)
{
    // Initialization failed. Do not proceed.
}
```

Un valor de retorno de `0` indica una inicialización exitosa.

### Paso 3: Ejecutar una operación de pago

Una vez inicializada, se puede ejecutar un pago estándar con tarjeta presente utilizando `cTipoOper = "PAGO"`.

```csharp
StringBuilder xmlResponse = new StringBuilder(8192);

int result = fnDllOperPinPad(
    "1.00",
    "TEST0001",
    "PAGO",
    xmlResponse,
    xmlResponse.Capacity
);
```

Cuando la función devuelve el control, el buffer de respuesta XML se rellena con el resultado de la transacción.

### Paso 4: Procesar la respuesta

El valor de retorno entero indica solo el estado de la ejecución técnica. El resultado financiero debe determinarse analizando la respuesta XML.

Una transacción se autoriza solo si la respuesta contiene:

```xml
<estado>F</estado>
<resultado>Autorizada</resultado>
```

Cualquier otra combinación debe tratarse como una transacción denegada.

### Paso 5: Finalizar la biblioteca

Cuando la aplicación ya no necesite realizar operaciones, la biblioteca debe finalizarse para liberar los recursos del sistema.

```csharp
fnDllParaTpvpcLatente();
```

## Próximos pasos

Después de completar la integración en C#, puede continuar con implementaciones adicionales:

* Para procesar pagos estándar, consulta la guía [Procesar un Pago en un Solo Paso](/es/get-central/slim-pack-payment-guides/process-a-single-step-payment).
* Para obtener detalles sobre cómo generar e imprimir recibos, consulta la documentación [Generar e Imprimir Recibos](/es/get-central/slim-pack-payment-guides/generate-and-print-receipts).
* Para implementar modelos de suscripción, consulta la guía [Gestionar Pagos Recurrentes](/es/get-central/slim-pack-payment-guides/handle-recurring-payments).
* Para obtener una referencia completa de los códigos de salida técnicos y los errores del host, consulta la documentación de [Códigos de Resultado y Errores](/es/get-central/slim-pack-reference/result-codes-and-errors).