Saltar al contenido principal

Integración del SDK de React Native

El SDK de Dodo Payments para React Native te permite crear experiencias de pago seguras en tus aplicaciones nativas de Android e iOS. Nuestro SDK proporciona componentes y pantallas de UI personalizables para recopilar detalles de pago.

Características

Seguridad Simplificada

Recopila datos de pago sensibles de manera segura mientras mantienes la conformidad con PCI

Múltiples Métodos de Pago

Acepta varios métodos de pago para expandir el alcance global

UI Nativa

Pantallas y elementos nativos para Android e iOS
Actualmente, Apple Pay, Google Pay, Cash App y UPI no son compatibles con el SDK de React Native. Estamos trabajando activamente para agregar soporte para estos métodos de pago en futuras versiones.

Instalación

1

Instalar el SDK

Instala el SDK de Dodo Payments usando tu gestor de paquetes preferido:
npm install dodopayments-react-native-sdk
2

Configuración específica de la plataforma

Ejecuta pod install en tu carpeta de iOS:
cd ios && pod install && npm run ios

Configuración del lado del cliente

1

Obtener la clave publicable

Obtén tu clave publicable desde el panel de Dodo Payments. (Distinta para los modos de prueba y en vivo) https://app.dodopayments.com/developer/others
2

Configurar el proveedor de pagos

Envuelve tu aplicación con el DodoPaymentProvider:
App.tsx
import React from 'react';
import { DodoPaymentProvider } from 'dodopayments-react-native-sdk';
import PaymentScreen from './PaymentScreen';

function App() {
  return (
    <DodoPaymentProvider publishableKey="YOUR_PUBLISHABLE_KEY">
      <PaymentScreen />
    </DodoPaymentProvider>
  );
}

export default App;
Necesitarás generar claves API desde tu panel de Dodo Payments. Consulta nuestra guía de generación de claves API para obtener instrucciones detalladas.
3

Crear función de utilidad de pago

Crea una función de utilidad para obtener parámetros de pago desde tu API de backend:
utils/fetchPaymentParams.ts
const API_URL = 'YOUR_BACKEND_URL'; // Replace with your server URL

const fetchPaymentParams = async () => {
  const response = await fetch(`${API_URL}/create-payment`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
  });
  
  if (!response.ok) {
    throw new Error('Failed to fetch payment parameters');
  }
  
  return await response.json();
};

export default fetchPaymentParams;
Esta función asume que tienes un endpoint de API de backend que crea intenciones de pago y devuelve un secreto de cliente. Asegúrate de que tu backend esté correctamente configurado para manejar la creación de pagos. Consulta nuestro Tutorial de Integración de API para ejemplos de configuración de backend.
4

Implementar la pantalla de pago

Crea tu pantalla de pago usando el useCheckout hook. Aquí tienes una implementación completa:
PaymentScreen.tsx
import React from 'react';
import { View, Text, useColorScheme } from 'react-native';
import { useCheckout, type sessionParams } from 'dodopayments-react-native-sdk';
import fetchPaymentParams from './utils/fetchPaymentParams';

const PaymentScreen = () => {
  const { initPaymentSession, presentPaymentSheet } = useCheckout();
  const [error, setError] = React.useState('');
  const [message, setMessage] = React.useState('');
  const [loading, setLoading] = React.useState(false);
  const [showSuccessScreen, setShowSuccessScreen] = React.useState(false);
  const isDarkMode = useColorScheme() === 'dark';

  const processPayment = async () => {
    setLoading(true);
    setMessage('');
    setError('');

    try {
      // 1. Get payment parameters from your backend
      const key = await fetchPaymentParams();
      
      // 2. Initialize payment session
      const paymentSheetParamsResult = await initPaymentSession({
        clientSecret: key.clientSecret,
      });
      
      // 3. Configure and present payment sheet
      const params: sessionParams = {
        ...(paymentSheetParamsResult as sessionParams),
        configuration: {
          appearance: {
            themes: isDarkMode ? 'dark' : 'light',
            primaryButton: {
              colors: {
                light: {
                  background: 'green',
                  componentBorder: 'green',
                  placeholderText: 'yellow',
                },
                dark: {
                  background: 'green',
                  componentBorder: 'green',
                  placeholderText: 'yellow',
                },
              },
              shapes: {
                borderRadius: 30,
                borderWidth: 3,
              },
            },
          },
          mode: 'test', // DEFAULTS TO TEST MODE
        },
      };

      const paymentSheetResponse = await presentPaymentSheet(params);

      // 4. Handle payment result
      switch (paymentSheetResponse?.status) {
        case 'cancelled':
          setError('Payment cancelled by user.');
          break;
        case 'succeeded':
          setMessage('');
          setShowSuccessScreen(true);
          break;
        case 'failed':
          setError('Payment failed : \n' + paymentSheetResponse?.message);
          break;
        default:
          setError(paymentSheetResponse?.message);
          setMessage('');
      }
    } catch (err) {
      setError('Failed to process payment');
    } finally {
      setLoading(false);
    }
  };

  return (
    <View>
      <Button 
        onPress={processPayment}
        disabled={loading}
        title={loading ? 'Processing...' : 'Pay Now'}
      />
      {error && <Text style={{ color: 'red' }}>{error}</Text>}
      {message && <Text style={{ color: 'green' }}>{message}</Text>}
      {showSuccessScreen && (
        <PaymentSuccessScreen
          amount={total}
          onContinue={() => setShowSuccessScreen(false)}
        />
      )}
    </View>
  );
};

export default PaymentScreen;
Para ejemplos completos con estilos, manejo de errores y opciones de personalización, consulta nuestros repositorios de demostración:

Opciones de Configuración

Parámetros de Sesión

clientSecret
string
required
El secreto del cliente de tu intención de pago, obtenido de la API de pago único o suscripción.
mode
string
required
El modo de la sesión de pago (prueba o en vivo).
configuration.appearance
object
Opciones de personalización para la apariencia de la hoja de pago
configuration.appearance.themes
string
Modo de tema: 'light' o 'dark'

Personalización de Apariencia

Puedes personalizar el Checkout Unificado de React Native para que coincida con el diseño de tu aplicación modificando colores, fuentes y más a través del parámetro de apariencia al llamar a initPaymentSession().

Personalización de Color

Cada categoría de color determina el color de uno o más componentes en la UI. Por ejemplo, primary define el color del botón de Pago.
Categoría de ColorUso
primaryColor primario para el botón de Pago y elementos seleccionados
backgroundColor de fondo de la página de pago
componentBackgroundColor de fondo para entradas, pestañas y otros componentes
componentBorderColor del borde externo para entradas, pestañas y otros componentes
componentDividerColor del borde interno (bordes compartidos) para componentes
primaryTextColor del texto del encabezado
secondaryTextColor del texto de etiqueta para campos de entrada
componentTextColor del texto de entrada (por ejemplo, número de tarjeta, código postal)
placeholderTextColor del texto de marcador de posición para campos de entrada
iconColor para íconos (por ejemplo, botón de cerrar)
errorColor para mensajes de error y acciones destructivas
Configuración de ejemplo con soporte para modo claro y oscuro:
const appearance = {
  colors: {
    light: {
      primary: '#F8F8F2',
      background: '#ffffff',
      componentBackground: '#E6DB74',
      componentBorder: '#FD971F',
      componentDivider: '#FD971F',
      primaryText: '#F8F8F2',
      secondaryText: '#75715E',
      componentText: '#AE81FF',
      placeholderText: '#E69F66',
      icon: '#F92672',
      error: '#FF0000',
    },
    dark: {
      primary: '#00ff0099',
      background: '#ff0000',
      componentBackground: '#ff0080',
      componentBorder: '#62ff08',
      componentDivider: '#d6de00',
      primaryText: '#5181fc',
      secondaryText: '#ff7b00',
      componentText: '#00ffff',
      placeholderText: '#00ffff',
      icon: '#f0f0f0',
      error: '#0f0f0f',
    },
  },
};

Personalización de Forma

Puedes personalizar el radio de borde, el ancho de borde y la sombra utilizados en toda la interfaz de pago:
const appearance = {
  shapes: {
    borderRadius: 10, // Border radius for input fields, tabs, and components
    borderWidth: 1,   // Border width for components
  },
};

Personalización Específica de Componentes

Puedes personalizar componentes específicos de la UI como el botón primario (botón de Pago). Estas configuraciones tienen prioridad sobre las configuraciones de apariencia globales:
const appearance = {
  primaryButton: {
    colors: {
      background: '#000000',
      text: '#ffffff',
      border: '#ff00ff',
    },
    shapes: {
      borderRadius: 10,
      borderWidth: 1.5,
    },
  },
};
Para aplicar estas personalizaciones, inclúyelas en la configuración de tu sesión de pago:
const params: sessionParams = {
  ...paymentSheetParams,
  configuration: {
    appearance: {
      themes: isDarkMode ? 'dark' : 'light',
      ...appearance, // Include your custom appearance settings
    },
  },
};

Manejo de Errores

Maneja diferentes estados de pago en tu función de checkout:
const handlePaymentResult = (paymentSheetResponse) => {
  switch (paymentSheetResponse?.status) {
    case 'cancelled':
      // User cancelled the payment
      console.log('Payment cancelled by user');
      break;
    case 'succeeded':
      // Payment completed successfully
      console.log('Payment succeeded');
      // Navigate to success screen or update UI
      break;
    case 'failed':
      // Payment failed
      console.log('Payment failed:', paymentSheetResponse?.message);
      // Show error message to user
      break;
    default:
      console.log('Unknown payment status:', paymentSheetResponse?.status);
  }
};
  • Problemas de conectividad de red: Asegúrate de tener una conexión a internet estable
  • Secreto de cliente inválido: Verifica que el backend esté generando intenciones de pago válidas
  • Dependencias faltantes: Instala todas las dependencias requeridas
  • Configuración específica de la plataforma: Completa los pasos de configuración de iOS y Android
  • Errores de API: Consulta nuestra Referencia de Códigos de Error para un manejo de errores detallado
  • Habilita el registro de depuración en desarrollo
  • Verifica las solicitudes de red a tu backend
  • Asegúrate de que las claves API estén configuradas correctamente
  • Prueba en ambas plataformas, iOS y Android
  • Revisa nuestras Preguntas Frecuentes Técnicas para problemas comunes
  • Usa Modo de Prueba vs Modo en Vivo de manera apropiada

Métodos de Pago de Prueba

Utiliza números de tarjeta de prueba en desarrollo para verificar tu integración sin procesar pagos reales. Aprende más sobre nuestro proceso de prueba y los entornos de prueba disponibles.