SDK da Web

Instalar

Opção 1: NPM

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

Opção 2: CDN

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

Opção 3: Carga dinâmica

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

Suporte a TypeScript

Tipos de instalação: npm install @yuno-payments/sdk-web-types

Fluxo básico de pagamentos

1. Initialize

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

2. Criar sessão de checkout (back-end)

// 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 checkout

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. Formulário de pagamento de montagem

yunomountCheckout();

5. Iniciar fluxo de pagamento

Adicione um botão de pagamento e acione o fluxo de pagamento:

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

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

6. Adicione HTML

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

Exemplo prático 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>

Tratamento dos resultados de pagamento

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);
  }
});

Autenticação 3DS

O 3DS é tratado automaticamente pelo SDK. Para métodos de pagamento assí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;
  }
}

Opções de configuração

Parâmetros essenciais

ParâmetroTipoDescrição
checkoutSessionstringID da sessão do backend
elementSelectorstringSeletor CSS para contêiner
countryCodestringCódigo ISO do país (por exemplo, “US”)
languagestringCódigo do idioma (por exemplo, “en-US”)
yunoCreatePaymentfunçãoRetorno de chamada para criação de pagamento

Configuração do cartão

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);
      }
    }
  }
});

Carregador e status

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 passos

Pronto para explorar recursos mais avançados? Confira o guia Recursos avançados para:

  • Opções alternativas de montagem - mountCheckoutLite() e mountSeamlessCheckout() para seleção de método de pagamento personalizado
  • Inscrição (Salvar cartões) - Salve métodos de pagamento para uso futuro
  • Token armazenados - Pagamentos com um clique com cartões salvos
  • IU personalizada (integração sem interface) - Crie formulários de pagamento totalmente personalizados
  • Campos seguros - Formulários de cartão personalizados em conformidade com a norma PCI
  • Estilo e personalização - Adapte o SDK à sua marca
  • Configuração avançada - Visualizações dinâmicas, modo de renderização e muito mais

Veja também: