SDK web

Instalar

Opción 1: NPM

npm install @yuno-pagos/sdk-web
import { Yuno } from '@yuno-payments/sdk-web';

Opción 2: CDN

<script src="https://sdk-web.y.uno/v1.5/main.js"></script>

Opción 3: Carga dinámica

const script = document.createElement('script');
script.src = 'https://sdk-web.y.uno/v1.5/main.js';
document.head.appendChild(script);
📘

Compatibilidad con TypeScript

Tipos de instalación: npm install @yuno-payments/sdk-web-types

pago básico de pago

1. Initialize

const yuno = await Yuno.initialize(public-api-key);

2. Crear sesión de pago (backend)

// Your backend endpoint
const session = await fetch('/api/checkout/session', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    customer_id: 'cus_123',
    amount: { currency: 'USD', value: 2500 },
    country: 'US'
  })
}).then(r => r.json());

3. Configurar el proceso de pago

yuno.startCheckout({
  checkoutSession: session.checkout_session,
  elementSelector: '#payment-container',
  countryCode: 'US',
  language: 'en-US',
  async yunoCreatePayment(oneTimeToken) {
    const result = await fetch('/api/payment/create', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        one_time_token: oneTimeToken,
        checkout_session: session.checkout_session
      })
    }).then(r => r.json());
    
    yuno.continuePayment({ showPaymentStatus: true });
  },
  yunoPaymentResult: (data) => {
    console.log('Payment completed:', data.status);
  }
});

4. Monta pago

yunomountCheckout();

5. Iniciar pago

Añade un pago y activa el pago :

const payButton = document.querySelector('#pay-button');

payButton.addEventListener('click', () => {
  yuno.startPayment();
});

6. Añadir HTML

<div id="payment-container"></div>
<button id="pay-button">Pay Now</button>

Ejemplo práctico completo

<!DOCTYPE html>
<html>
<head>
  <title>Yuno Payment</title>
  <script src="https://sdk-web.y.uno/v1.5/main.js"></script>
</head>
<body>
  <div id="payment-container"></div>
  <button id="pay-button">Pay Now</button>
  
  <script>
    async function initPayment() {
      // Initialize
      const yuno = await Yuno.initialize('pk_test_123');
      
      // Create session
      const session = await fetch('/api/checkout/session', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          customer_id: 'cus_123',
          amount: { currency: 'USD', value: 2500 },
          country: 'US'
        })
      }).then(r => r.json());
      
      // Configure checkout
      yuno.startCheckout({
        checkoutSession: session.checkout_session,
        elementSelector: '#payment-container',
        countryCode: 'US',
        async yunoCreatePayment(token) {
          await fetch('/api/payment/create', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ 
              one_time_token: token, 
              checkout_session: session.checkout_session 
            })
          });
          yuno.continuePayment();
        },
        yunoPaymentResult: (data) => {
          if (data.status === 'SUCCEEDED') {
            window.location.href = '/success';
          }
        }
      });
      
      // Mount form
      yuno.mountCheckout();
      
      // Start payment on button click
      document.querySelector('#pay-button').addEventListener('click', () => {
        yuno.startPayment();
      });
    }
    
    initPayment();
  </script>
</body>
</html>

Gestión de pago

yuno.startCheckout({
  // ... other config
  yunoPaymentResult: (data) => {
    switch(data.status) {
      case 'SUCCEEDED':
        window.location.href = '/success';
        break;
      case 'FAILED':
        alert('Payment failed: ' + data.error?.message);
        break;
      case 'PENDING':
        console.log('Payment is being processed');
        break;
      case 'REJECTED':
        alert('Payment was rejected');
        break;
    }
  },
  yunoError: (error) => {
    console.error('Error:', error);
  }
});

Autenticación 3DS

El SDK gestiona automáticamente el 3DS. Para pago asíncronos:

async yunoCreatePayment(token) {
  await createPaymentOnBackend(token);
  
  // Handle redirect if needed
  const result = await yuno.continuePayment();
  
  if (result?.action === 'REDIRECT_URL') {
    window.location.href = result.redirect.init_url;
  }
}

Opciones de configuración

Parámetros esenciales

ParámetroTipoDescripción
checkoutSessionstringID de sesión del backend
elementSelectorstringSelector CSS para contenedor
countryCodestringCódigo ISO del país (por ejemplo, «US»)
languagestringCódigo de idioma (por ejemplo, «en-US»)
yunoCreatePaymentfunciónDevolución de llamada pago

Configuración de la tarjeta

yuno.startCheckout({
  // ... other config
  card: {
    type: 'extends', // or 'only'
    cardSaveEnable: true, // Show save checkbox
    isCreditCardProcessingOnly: false, // Allow debit
    onChange: ({ error, data }) => {
      if (error) {
        console.log('Card validation error:', error);
      }
    }
  }
});

Cargador y estado

yuno.startCheckout({
  // ... other config
  showLoading: true, // Show Yuno's loader
  showPaymentStatus: true, // Show payment result page
  onLoading: (isLoading) => {
    console.log('Loading state:', isLoading);
  }
});

Próximos pasos

¿Estás listo para explorar funciones más avanzadas? Consulta la guía de funciones avanzadas para:

  • Opciones de montaje alternativas - mountCheckoutLite() y mountSeamlessCheckout() para la selección de pago personalizados
  • Inscripción (Guardar tarjetas): guarda pago para usarlos en el futuro.
  • Token almacenados: pagos con un solo clic con tarjetas guardadas.
  • Interfaz de usuario personalizada (integración sin interfaz gráfica): crea pago totalmente personalizados.
  • Campos seguros: formularios de tarjetas personalizados que cumplen con la normativa PCI.
  • Estilo y personalización: adapta el SDK a tu marca
  • Configuración avanzada: vistas dinámicas, modo de renderizado y mucho más.

Véase también