prepare("SELECT s.monto, s.concepto, s.estado, c.titular_nombre FROM solicitudes_pago s JOIN cuentas c ON s.id_cuenta_destino = c.id WHERE s.id_pago_unico = ?"); $stmt->execute([$id_pago_unico]); $solicitud = $stmt->fetch(); if (!$solicitud) { die("La solicitud de pago no existe o ha expirado."); } } catch (PDOException $e) { die("Error al consultar la solicitud de pago."); } $qr_api_url = "https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=" . urlencode($id_pago_unico); ?> Guía de Integración para Desarrolladores - BunnyPay

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).
moneda String La moneda de la transacción. Debe ser 'USD' o 'CUP'.
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,
    'moneda'          => 'USD', // <-- ¡NUEVO Y OBLIGATORIO! ('USD' o 'CUP')
    '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>";
// }
?>

Plugin de WordPress (WooCommerce)

¿Usas WordPress y WooCommerce? ¡Integrar Bunny Pay es más fácil que nunca! Hemos desarrollado un plugin oficial que te permite conectar tu tienda en minutos, sin necesidad de escribir una sola línea de código.

  • Instalación rápida y sencilla.
  • Configuración simple: solo añade tu API Key y tu ID de Tienda.
  • Flujo de pago seguro y automático integrado con el checkout de WooCommerce.
  • Redirección automática a tu página de "Gracias" o "Pedido fallido".

Para ambas integraciones (API Pura o WordPress), necesitarás tu API Key y tu ID de Tienda. Puedes generar estos datos desde tu panel de administrador o solicitarlos directamente a nuestro equipo de soporte.