# Inicio rápido: Tu primera transacción

Esta guía te ayuda a crear tu primera transacción de pago con éxito utilizando la integración Get Smart App2App. Crearás un Intent, enviarás una solicitud de pago y gestionarás el resultado de la transacción, todo ello en pocos minutos.

## Qué va a construir

En este tutorial, crearás un método sencillo de Android que genera un intent de pago, añade los parámetros de transacción requeridos, lanza la aplicación Get Smart y gestiona el resultado de la transacción.

## Requisitos

Antes de comenzar, asegúrate de tener:

- La aplicación Get Smart instalada en tu dispositivo de prueba
- Un proyecto de Android configurado con una Activity funcional
- Familiaridad básica con el desarrollo de Android e Intents

<Callout type="tip">

Asegúrate de que la aplicación Get Smart esté actualizada a la última versión para garantizar la compatibilidad.

</Callout>

## Paso 1: Definir el código de solicitud

En primer lugar, añade una constante a tu Activity para identificar esta solicitud de pago:

```java
public class MainActivity extends AppCompatActivity {
    // Request code to identify the payment transaction
    private static final int REQUEST_CODE_PAYMENT = 1001;

    // ... rest of your Activity code
}
```

## Paso 2: Crear el método de pago

Añade un método para iniciar la transacción de pago:

```java
private void startPayment(double amount, String invoice) {
    // 1. Create the Intent with the specific action name
    Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");

    // 2. Add the required parameters
    intent.putExtra("amount", amount);
    intent.putExtra("invoice", invoice);
    intent.putExtra("type", 1); // 1 = Sale transaction

    // 3. Launch the Get Smart app with error handling
    try {
        startActivityForResult(intent, REQUEST_CODE_PAYMENT);
    } catch (ActivityNotFoundException e) {
        // The Get Smart app is not installed
        showErrorDialog();
    }
}

private void showErrorDialog() {
    new AlertDialog.Builder(this)
        .setTitle("Payment App Not Found")
        .setMessage("Please ensure the Get Smart application is installed and updated.")
        .setPositiveButton("OK", null)
        .show();
}
```

<Callout type="note">

El código de solicitud `REQUEST_CODE_PAYMENT` es una constante entera definida por ti. Utilizarás este mismo código en el método `onActivityResult` para identificar qué solicitud está retornando.

</Callout>

## Paso 3: Gestionar el resultado de la transacción

Sobrescribe el método `onActivityResult` para recibir el desenlace de la transacción:

```java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE_PAYMENT) {
        if (resultCode == RESULT_OK && data != null) {
            // Transaction completed - check if it was authorized
            String result = data.getStringExtra("RESULT");

            if ("AUTORIZADA".equals(result)) {
                // Payment successful!
                String authNumber = data.getStringExtra("AUTORIZATION_NUMBER");
                String orderNumber = data.getStringExtra("ORDER");

                showSuccessMessage("Payment approved! Auth: " + authNumber);
            } else {
                // Payment denied
                String errorMsg = data.getStringExtra("ERROR_MSG");
                showErrorMessage("Payment denied: " + errorMsg);
            }
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the transaction
            showInfoMessage("Transaction cancelled by user");
        }
    }
}

private void showSuccessMessage(String message) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}

private void showErrorMessage(String message) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}

private void showInfoMessage(String message) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
```

<Callout type="warning">

`RESULT_OK` no significa que el pago haya sido autorizado. Solo significa que la aplicación Get Smart completó su proceso. Debes comprobar el extra `RESULT` para determinar si el pago fue realmente aprobado.

</Callout>

## Paso 4: Activar el pago

Añade un manejador de clic de botón (o método de activación) para iniciar el pago:

```java
// Example: Button click handler
public void onPayButtonClick(View view) {
    // Process a payment of 10.50 euros
    startPayment(10.50, "ORDER-001");
}
```

<Callout type="tip">

Sustituye el importe fijo por el importe real de tu transacción basado en el pedido del cliente.

</Callout>

Aquí tienes el código completo en un solo lugar:

```java
public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_PAYMENT = 1001;

    private void startPayment(double amount, String invoice) {
        Intent intent = new Intent("es.android.redsys.mPOS.movil.tpvAndroid_PAYMENT_REQUEST");
        intent.putExtra("amount", amount);
        intent.putExtra("invoice", invoice);
        intent.putExtra("type", 1); // Sale

        try {
            startActivityForResult(intent, REQUEST_CODE_PAYMENT);
        } catch (ActivityNotFoundException e) {
            new AlertDialog.Builder(this)
                .setTitle("Payment App Not Found")
                .setMessage("Please install the Get Smart application.")
                .setPositiveButton("OK", null)
                .show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_PAYMENT) {
            if (resultCode == RESULT_OK && data != null) {
                String result = data.getStringExtra("RESULT");

                if ("AUTORIZADA".equals(result)) {
                    String authNumber = data.getStringExtra("AUTORIZATION_NUMBER");
                    Toast.makeText(this, "Payment approved! Auth: " + authNumber,
                                   Toast.LENGTH_LONG).show();
                } else {
                    String errorMsg = data.getStringExtra("ERROR_MSG");
                    Toast.makeText(this, "Payment denied: " + errorMsg,
                                   Toast.LENGTH_LONG).show();
                }
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "Transaction cancelled", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
```

¡Enhorabuena! Has creado con éxito tu primera transacción de pago utilizando la integración Get Smart App2App. Este ejemplo completo demuestra los componentes esenciales necesarios para procesar pagos: la creación del Intent, la gestión de respuestas y el control de escenarios de error. Ahora puedes partir de esta base para añadir funciones de pago más sofisticadas a tu aplicación.

## Resolución de problemas

Si encuentra problemas durante la integración o en tiempo de ejecución, consulta la siguiente tabla:

| Problema / Excepción | Descripción y posibles causas | Acción recomendada |
| :--- | :--- | :--- |
| **`ActivityNotFoundException`** | La aplicación **Get Smart** no está instalada en el dispositivo. | Instala la aplicación a través de tu sistema de gestión de dispositivos o ponte en contacto con un representante de Get Smart. |
| **`RESULT_CANCELED`** | El usuario salió manualmente de la interfaz o pulsó el botón de retroceso. | Gestiona esto como una cancelación estándar del usuario; asegúrate de que tu interfaz de usuario vuelva a un estado neutro. |
| **Sin datos en `onActivityResult`** | Los datos del Intent son `null`. Esto ocurre si la aplicación se bloqueó, el dispositivo se quedó sin memoria o el sistema cerró el proceso. | Registra los detalles del error y pide al usuario que intente la transacción de nuevo. |
| **Pago "DENEGADA"** | La transacción fue rechazada (p. ej., fondos insuficientes, tarjeta caducada o cuenta bloqueada). | Analiza el campo `ERROR_MSG` y muéstralo al usuario para que sepa por qué se rechazó la tarjeta. |

## Qué ha aprendido

En este tutorial, has aprendido a:

- Crear y configurar un Intent de pago
- Lanzar la aplicación Get Smart
- Gestionar los resultados de la transacción
- Implementar un control de errores adecuado

## Próximos pasos

Ahora que tienes una integración funcional:

- Aprende a procesar devoluciones en [Procesar una transacción de devolución](/es/get-smart/get-smart-app2app/transaction-guides/transactions/refund-a-payment)
- Explora todos los parámetros disponibles en la [Referencia de parámetros de solicitud](https://docs.globalgetnet.com/es/products/local-processor-spain/get-smart-app2app?doc=getsmart-app2app-request-reference)
- Comprende el flujo completo de la transacción en [Flujo de la transacción](/es/get-smart/get-smart-app2app/core-concepts/transaction-flow)