Guía de Integración de BunnyPay

Introducción

¡Bienvenido a BunnyPay! Esta guía le mostrará cómo integrar de forma rápida y segura nuestra pasarela de pagos en su tienda o aplicación web. El modelo de integración de BunnyPay es un flujo de redirección segura. Esto significa que su servidor nunca maneja información sensible del cliente (como PIN o CVC), lo que garantiza la máxima seguridad para usted y sus compradores.

El Flujo de Pago

El proceso se resume en 3 sencillos pasos:

  1. Iniciar la Transacción: Su servidor se comunica con la API de BunnyPay para solicitar un nuevo pago.
  2. Redirección del Cliente: BunnyPay responde con una URL de pago única. Su sitio web redirige al cliente a esta página segura.
  3. Confirmación y Retorno: Una vez completado el pago, BunnyPay redirige al cliente de vuelta a su tienda con la confirmación de la transacción.

Paso 1: Iniciar la Solicitud de Pago

Para comenzar una transacción, debe realizar una llamada POST desde su servidor al endpoint de la API de BunnyPay, enviando los datos en formato JSON.

Endpoint: https://api.bunnypay.me/iniciar_pago.php

Parámetros de la Solicitud

Parámetro Tipo Obligatorio Descripción
api_key String Su clave de API secreta para autenticar la tienda.
monto Float El monto total a cobrar. Use un punto como separador decimal (ej: 10.50).
id_orden_tienda String Un identificador único para esta orden en su sistema (ej: "ORDEN-2025-001").
url_exito String La URL a la que se redirigirá al cliente si el pago es exitoso.
url_fallo String La URL a la que se redirigirá al cliente si el pago falla o es cancelado.

Ejemplo de Código (PHP con cURL)

<?php
// Datos de la orden en su tienda
$datos_pago = [
    'api_key'         => 'SU_API_KEY_SECRETA_AQUI',
    'monto'           => 25.99,
    'id_orden_tienda' => 'ORDEN-' . uniqid(),
    'url_exito'       => 'https://sutienda.com/pago_confirmado.php',
    'url_fallo'       => 'https://sutienda.com/pago_fallido.php'
];

// Iniciar la llamada a la API de BunnyPay
$ch = curl_init('https://api.bunnypay.me/iniciar_pago.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($datos_pago));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json'
]);

$respuesta_json = curl_exec($ch);
curl_close($ch);

$respuesta = json_decode($respuesta_json, true);

// Procesar la respuesta
if (isset($respuesta['status']) && $respuesta['status'] === 'exitoso') {
    // Redirigir al cliente a la pasarela de pago
    header('Location: ' . $respuesta['data']['url_redireccion']);
    exit();
} else {
    // Hubo un error al iniciar el pago
    $mensaje_error = $respuesta['data']['mensaje'] ?? 'Error desconocido al conectar con BunnyPay.';
    echo "Error: " . htmlspecialchars($mensaje_error);
}
?>

Paso 2: Manejar la Respuesta de la API

BunnyPay le responderá con un objeto JSON.

Respuesta Exitosa

{
    "status": "exitoso",
    "data": {
        "url_redireccion": "https://pagos.bunnypay.me/pagar.php?sesion=bpay_sess_xxxxxxxxxxxx"
    }
}

Respuesta Fallida

{
    "status": "fallido",
    "data": {
        "mensaje": "Clave de API no válida."
    }
}

Paso 3: Verificar la Confirmación del Pago

Una vez que el cliente completa el pago, BunnyPay lo redirigirá a su url_exito, incluyendo dos parámetros GET en la URL.

URL de ejemplo: https://sutienda.com/pago_confirmado.php?orden=ORDEN-XXXXX&transaccion_id=bpay_sess_YYYYY

En su página de confirmación, debe buscar la orden en su base de datos usando el parámetro orden y actualizar su estado a "completado". Esto previene que alguien acceda a la página de éxito directamente para obtener un producto sin haber pagado.

Ejemplo de pago_confirmado.php

<?php
// Conectar a la base de datos de su tienda
// require_once 'db_tienda.php';

$id_orden_recibida = $_GET['orden'] ?? '';
$id_transaccion_bunnypay = $_GET['transaccion_id'] ?? '';

if (empty($id_orden_recibida)) {
    die("Error: No se recibió un identificador de orden.");
}

// 1. Buscar la orden en su base de datos y verificar que está "pendiente"
// $stmt = $db_tienda->prepare("SELECT estado FROM ordenes WHERE id_orden = ?");
// $stmt->execute([$id_orden_recibida]);
// $orden = $stmt->fetch();

// 2. Si la orden es válida, actualizar su estado a "completado"
// if ($orden && $orden['estado'] === 'pendiente') {
//     $update_stmt = $db_tienda->prepare("UPDATE ordenes SET estado = 'completado' WHERE id_orden = ?");
//     $update_stmt->execute([$id_orden_recibida]);
    
    // 3. Mostrar mensaje de éxito
    echo "<h1>¡Gracias por su compra!</h1>";
    echo "<p>Su pago ha sido procesado exitosamente.</p>";
    echo "<p>Número de Orden: " . htmlspecialchars($id_orden_recibida) . "</p>";
// } else {
//     echo "<h1>Error de Validación</h1>";
// }
?>