🚧 La documentacion de Bloque está en desarrollo

Comenzando

Comienza a usar Bloque Payments en minutos. Esta guía te llevará a través de la configuración tanto del componente React en el frontend como del SDK en el backend.

Instalación

Frontend (React)

Instala el paquete de componentes React:

npm
yarn
pnpm
bun
deno
npm add @bloque/payments-react

Backend (Node.js/Bun)

Instala el SDK de backend:

npm
yarn
pnpm
bun
deno
npm add @bloque/payments

Claves API

Para usar Bloque Payments, necesitarás claves API. Puedes obtenerlas desde el Panel de Bloque.

Bloque usa un modelo de tres credenciales:

CredencialPrefijoDóndePropósito
Secret keysk_test_ / sk_live_Solo servidorSe intercambia por un JWT de corta duración vía /origins/api-keys/exchange
Publishable keypk_test_ / pk_live_NavegadorIdentifica al comercio; seguro para exponer en código del cliente
Client secretJWTNavegadorJWT con alcance de checkout, devuelto al crear un checkout con secret key
Seguridad del Secret Key

Tu secret key (sk_live_...) nunca debe exponerse en código del lado del cliente. Solo debe usarse en el servidor.

Cómo Funciona

1. Tu backend crea una sesión de checkout usando @bloque/payments (secret key)

2. Backend recibe checkout_id + client_secret

3. Pasa checkout_id y client_secret al componente React

4. El componente renderiza iframe con el checkout (publishable key + client secret)

5. Usuario completa el pago (con 3D Secure si es requerido)

6. Se disparan callbacks onSuccess/onError/onPending

Inicio Rápido: Integración Completa

Aquí hay un ejemplo completo que muestra cómo integrar Bloque Payments con React en el frontend y Node.js/Bun en el backend.

Configuración Backend (Node.js/Bun)

Primero, crea un endpoint para generar sesiones de checkout:

import { Bloque } from '@bloque/payments';
import express from 'express';

const app = express();
app.use(express.json());

// Inicializar SDK de Bloque con tu secret key
const bloque = new Bloque({
  secretKey: process.env.BLOQUE_SECRET_KEY!,
  mode: 'production', // o 'sandbox' para pruebas
});

// Endpoint de checkout
app.post('/api/create-checkout', async (req, res) => {
  try {
    const checkout = await bloque.checkout.create({
      name: 'Mi Producto',
      description: 'Descripción del producto',
      items: [
        {
          name: 'Producto',
          amount: 2999, // Monto en la unidad más pequeña (ej: centavos)
          quantity: 1,
        },
      ],
      success_url: 'https://tuapp.com/success',
    });

    // Devolver checkout id y client secret al frontend
    res.json({
      id: checkout.id,
      url: checkout.url,
      clientSecret: checkout.client_secret,
    });
  } catch (error) {
    console.error('Error de checkout:', error);
    res.status(500).json({
      success: false,
      error: error.message,
    });
  }
});

app.listen(3000, () => {
  console.log('Servidor corriendo en http://localhost:3000');
});

Configuración Frontend (React)

import { init, BloqueCheckout } from '@bloque/payments-react';

// Inicializar SDK (hacer esto una vez al inicio de la app)
init({
  publishableKey: 'pk_live_...',
  mode: 'production',
});

interface CheckoutPageProps {
  checkoutId: string;
  clientSecret: string;
}

function CheckoutPage({ checkoutId, clientSecret }: CheckoutPageProps) {
  return (
    <BloqueCheckout
      checkoutId={checkoutId}
      clientSecret={clientSecret}
      appearance={{
        primaryColor: '#10b981',
        borderRadius: '12px',
      }}
      onSuccess={(data) => {
        console.log('¡Pago exitoso!', data.payment_id);
        window.location.href = '/success';
      }}
      onError={(error) => {
        console.error('Pago fallido:', error);
      }}
    />
  );
}

export default CheckoutPage;

Variables de Entorno

Crea un archivo .env en tu proyecto backend:

# .env
BLOQUE_SECRET_KEY=sk_live_tu_secret_key_aqui
BLOQUE_WEBHOOK_SECRET=tu_webhook_secret_aqui

Y para tu frontend:

# .env
NEXT_PUBLIC_BLOQUE_PUBLISHABLE_KEY=pk_live_tu_publishable_key_aqui

Cárgalas en tu aplicación:

import 'dotenv/config';

const bloque = new Bloque({
  secretKey: process.env.BLOQUE_SECRET_KEY!,
  mode: 'production',
});

Opciones de Configuración

Configuración del SDK (Backend)

OpciónTipoRequeridoPor DefectoDescripción
secretKeystringSí*-Tu secret key de Bloque (sk_test_... / sk_live_...)
mode'production' | 'sandbox'-Modo de entorno
webhookSecretstringNo-Secreto para verificación de webhooks
timeoutnumberNo-Timeout de request en milisegundos
maxRetriesnumberNo-Número máximo de reintentos

* Se requiere secretKey (recomendado) o el legacy accessToken.

Modos

  • sandbox: Para pruebas y desarrollo. Sin transacciones reales. Usa claves sk_test_ / pk_test_.
  • production: Para operaciones en vivo con pagos reales. Usa claves sk_live_ / pk_live_.

Props del Componente React

PropTipoRequeridoDescripción
checkoutIdstringID de sesión de checkout de tu backend
clientSecretstringNoJWT con alcance de checkout de la respuesta de crear checkout
onSuccessfunctionNoLlamado en pago exitoso
onErrorfunctionNoLlamado en error de pago
onPendingfunctionNoLlamado cuando el pago está pendiente
onReadyfunctionNoLlamado cuando el iframe está listo
onThreeDSChallengefunctionNoLlamado cuando inicia un challenge 3D Secure
appearanceAppearanceConfigNoPersonalización de UI
iframeStylesRecord<string, string>NoEstilos personalizados del iframe

Configuración de Apariencia

Personaliza el look and feel:

const appearance = {
  primaryColor: '#10b981',     // Color de marca
  borderRadius: '12px',        // Radio de borde para inputs
  fontFamily: 'Inter, system-ui, sans-serif', // Familia de fuente
};

Soporte TypeScript

El SDK está completamente tipado con TypeScript. Importa tipos para mejor experiencia de desarrollo:

import { BloqueCheckout, init } from '@bloque/payments-react';
import type {
  BloqueCheckoutProps,
  AppearanceConfig,
  PaymentResult,
} from '@bloque/payments-react';

const handleSuccess = (result: PaymentResult) => {
  console.log('ID de Pago:', result.payment_id);
  console.log('Estado:', result.status);
};

Pruebas en Modo Sandbox

Usa modo sandbox para pruebas sin transacciones reales:

// Backend
const bloque = new Bloque({
  secretKey: process.env.BLOQUE_SECRET_KEY!, // sk_test_...
  mode: 'sandbox',
});
// Frontend
init({
  publishableKey: 'pk_test_...',
  mode: 'sandbox',
});

Números de Tarjeta de Prueba

Usa estos números de tarjeta de prueba en modo sandbox:

Número de TarjetaResultado
4111111111111111Éxito
4000000000000002Rechazada
4000000000000259Fondos insuficientes

Próximos Pasos

Ahora que tienes la integración básica funcionando, explora más características:

¿Necesitas Ayuda?