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

Simplified Security

Recopila datos de pago sensibles de forma segura mientras cumples con PCI

Multiple Payment Methods

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

Native UI

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 añadir soporte para estos métodos de pago en futuras versiones.

Instalación

1

Install the SDK

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

Platform-specific setup

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

Configuración del lado del cliente

1

Get Publishable Key

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

Setup Payment Provider

Envuelve tu app 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 instrucciones detalladas.
3

Create payment utility function

Crea una función auxiliar para obtener parámetros de pago desde tu API 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 backend que crea intents de pago y devuelve un client secret. 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 del backend.
4

Implement the payment screen

Crea tu pantalla de pago usando el hook useCheckout. 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 estilo, 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
requerido
El client secret de tu payment intent, obtenido de la API de pago único o suscripción.
mode
string
requerido
El modo de la sesión de pago (prueba o producción).
configuration.appearance
object
Opciones de personalización para la apariencia del payment sheet
configuration.appearance.themes
string
Modo de tema: 'light' o 'dark'

Personalización de Apariencia

Puedes personalizar el React Native Unified Checkout para que coincida con el diseño de tu app modificando colores, fuentes y más mediante el parámetro appearance 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 Pay.
Categoría de colorUso
primaryColor primario para el botón Pay y elementos seleccionados
backgroundColor de fondo de la página de pago
componentBackgroundColor de fondo para campos de entrada, pestañas y otros componentes
componentBorderColor del borde externo para campos de entrada, pestañas y otros componentes
componentDividerColor del borde interno (bordes compartidos) para componentes
primaryTextColor del texto del encabezado
secondaryTextColor del texto de etiquetas para campos de entrada
componentTextColor del texto del campo (por ejemplo, número de tarjeta, código postal)
placeholderTextColor del texto de marcador para campos de entrada
iconColor para iconos (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: Asegura una conexión a Internet estable
  • Client secret inválido: Verifica que el backend esté generando payment intents válidos
  • Dependencias peer faltantes: Instala todas las dependencias requeridas
  • Configuración específica por plataforma: Completa los pasos de configuración para iOS y Android
  • Errores de API: Revisa nuestra Referencia de códigos de error para manejo detallado
  • Activa el registro de depuración en desarrollo
  • Revisa las peticiones de red a tu backend
  • Verifica que las claves API estén configuradas correctamente
  • Prueba en ambas plataformas iOS y Android
  • Consulta nuestras Preguntas frecuentes técnicas para problemas comunes
  • Utiliza correctamente el modo de Prueba vs Producción

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 pruebas y los entornos de prueba disponibles.