SDK de React Native
Instalar
npm install @yuno-payments/yuno-sdk-react-nativeConfiguración de iOS:
cd ios && pod installConfiguración de Android:
No se requieren pasos adicionales.
RequisitosReact Native 0.70+, Node.js 16+, Android Min SDK 21, iOS 14.0+
Compatibilidad con TypeScriptEl SDK incluye definiciones TypeScript listas para usar.
Initialize
App.tsx:
import { YunoSdk } from '@yuno-payments/yuno-sdk-react-native';
export default function App() {
useEffect(() => {
YunoSdk.initialize({
apiKey: 'your-public-api-key',
countryCode: 'US',
});
}, []);
return <NavigationContainer>{/* your app */}</NavigationContainer>;
}pago básico de pago
import React, { useState, useEffect } from 'react';
import { View, Button, Text, StyleSheet, ScrollView } from 'react-native';
import { YunoSdk, YunoPaymentMethods } from '@yuno-payments/yuno-sdk-react-native';
export default function PaymentScreen() {
const [checkoutSession, setCheckoutSession] = useState<string | null>(null);
const [isReady, setIsReady] = useState(false);
const [paymentMethodSelected, setPaymentMethodSelected] = useState(false);
useEffect(() => {
initializeCheckout();
// Subscribe to payment events
const paymentSubscription = YunoSdk.onPaymentStatus((state) => {
switch (state.status) {
case 'SUCCEEDED':
navigateToSuccess();
break;
case 'FAILED':
showError(state.error?.message);
break;
case 'PROCESSING':
console.log('Payment is being processed');
break;
default:
break;
}
});
const tokenSubscription = YunoSdk.onOneTimeToken((token) => {
console.log('OTT received:', token);
// Send to backend for payment processing
});
return () => {
paymentSubscription.remove();
tokenSubscription.remove();
};
}, []);
const initializeCheckout = async () => {
try {
// Create checkout session on backend
const session = await createCheckoutSession();
setCheckoutSession(session.checkoutSession);
setIsReady(true);
} catch (error) {
console.error('Checkout initialization failed:', error);
}
};
const handlePayment = async () => {
try {
// Start payment flow
await YunoSdk.startPayment(true); // true = show payment status screen
} catch (error) {
console.error('Payment start failed:', error);
}
};
return (
<ScrollView style={styles.container}>
<Text style={styles.amount}>$25.00</Text>
{/* Display payment methods */}
{checkoutSession && (
<YunoPaymentMethods
checkoutSession={checkoutSession}
countryCode="US"
onPaymentMethodSelected={(selected) => {
setPaymentMethodSelected(selected);
}}
/>
)}
<Button
title="Pay Now"
onPress={handlePayment}
disabled={!isReady || !paymentMethodSelected}
/>
</ScrollView>
);
}
async function createCheckoutSession() {
const response = await fetch('https://api.example.com/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
amount: { currency: 'USD', value: 2500 },
customer_id: 'cus_123',
country: 'US',
}),
});
return response.json();
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
padding: 20,
},
amount: {
fontSize: 32,
fontWeight: 'bold',
marginBottom: 24,
},
});Ejemplo completo de TypeScript
import React, { useState, useEffect } from 'react';
import { View, Button, Text, ActivityIndicator, Alert, ScrollView } from 'react-native';
import { YunoSdk, YunoPaymentMethods, YunoPaymentState } from '@yuno-payments/yuno-sdk-react-native';
interface CheckoutSession {
checkoutSession: string;
id: string;
}
export default function CheckoutScreen() {
const [isLoading, setIsLoading] = useState(true);
const [isProcessing, setIsProcessing] = useState(false);
const [checkoutSession, setCheckoutSession] = useState<string | null>(null);
const [paymentMethodSelected, setPaymentMethodSelected] = useState(false);
useEffect(() => {
loadCheckout();
// Subscribe to payment status
const paymentSubscription = YunoSdk.onPaymentStatus((state: YunoPaymentState) => {
setIsProcessing(false);
switch (state.status) {
case 'SUCCEEDED':
Alert.alert('Success', 'Payment completed successfully!');
// Navigate to success screen
break;
case 'FAILED':
Alert.alert('Failed', state.error?.message || 'Payment failed');
break;
case 'PROCESSING':
Alert.alert('Processing', 'Your payment is being processed');
break;
default:
break;
}
});
return () => {
paymentSubscription.remove();
};
}, []);
const loadCheckout = async () => {
try {
const session = await createCheckoutSession();
setCheckoutSession(session.checkoutSession);
setIsLoading(false);
} catch (error) {
Alert.alert('Error', 'Failed to load checkout');
setIsLoading(false);
}
};
const processPayment = async () => {
setIsProcessing(true);
try {
await YunoSdk.startPayment(true); // Show status screen
} catch (error) {
setIsProcessing(false);
Alert.alert('Error', 'Failed to start payment');
}
};
if (isLoading) {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<ActivityIndicator size="large" />
<Text style={{ marginTop: 16 }}>Loading checkout...</Text>
</View>
);
}
return (
<ScrollView style={{ flex: 1, padding: 20 }}>
<Text style={{ fontSize: 24, fontWeight: 'bold', marginBottom: 20 }}>
Total: $25.00
</Text>
{/* Display payment methods */}
{checkoutSession && (
<YunoPaymentMethods
checkoutSession={checkoutSession}
countryCode="US"
onPaymentMethodSelected={(selected) => {
setPaymentMethodSelected(selected);
}}
style={{ marginBottom: 20 }}
/>
)}
<Button
title={isProcessing ? 'Processing...' : 'Pay Now'}
onPress={processPayment}
disabled={isProcessing || !paymentMethodSelected}
/>
</ScrollView>
);
}
async function createCheckoutSession(): Promise<CheckoutSession> {
const response = await fetch('https://api.example.com/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
amount: { currency: 'USD', value: 2500 },
customer_id: 'cus_123',
country: 'US',
}),
});
if (!response.ok) {
throw new Error('Failed to create checkout session');
}
return response.json();
}Gestión de pago
const paymentSubscription = YunoSdk.onPaymentStatus((state) => {
switch (state.status) {
case 'SUCCEEDED':
navigation.navigate('Success');
break;
case 'FAILED':
Alert.alert('Payment Failed', state.error?.message);
break;
case 'PROCESSING':
Alert.alert('Processing', 'Your payment is being processed');
break;
case 'REJECTED':
Alert.alert('Rejected', 'Payment was rejected');
break;
default:
break;
}
});
// Remember to remove listener when done
// paymentSubscription.remove();Autenticación 3DS
El SDK gestiona automáticamente el 3DS. El SDK presentará el desafío 3DS cuando sea necesario.
Opciones de configuración
Parámetros esenciales
| Parámetro | Tipo | Descripción |
|---|---|---|
checkoutSession | string | ID de sesión del backend |
countryCode | string | Código ISO del país (por ejemplo, «US») |
showPaymentStatus | boolean | Mostrar pantalla pago |
Escuchas de eventos
// Payment status
const paymentSubscription = YunoSdk.onPaymentStatus((state) => {
console.log('Payment status:', state.status);
console.log('Token:', state.token);
});
// One-time token
const tokenSubscription = YunoSdk.onOneTimeToken((token) => {
console.log('Token:', token);
// Send to backend
});
// Enrollment status
const enrollmentSubscription = YunoSdk.onEnrollmentStatus((state) => {
console.log('Enrollment status:', state.status);
});
// Remove listeners individually (in cleanup)
paymentSubscription.remove();
tokenSubscription.remove();
enrollmentSubscription.remove();Próximos pasos
¿Estás listo para explorar funciones más avanzadas? Consulta la guía de funciones avanzadas para:
- Opciones de montaje alternativas -
startPaymentLite()ystartPaymentSeamlessLite()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.
- Configuración específica de la plataforma: gestionar las diferencias entre iOS y Android.
- Estilo: personaliza la apariencia del SDK.
Véase también
- Ejemplos de código: ejemplos para copiar y pegar en situaciones habituales.
Actualizado hace 1 día