SDK React Native شامل يجمع بين بوابة الدفع WebView وتكامل واجهة برمجة التطبيقات الخلفية لتطبيقات الجوال.
قم بتثبيت إيصالات React Native SDK وتبعيات النظراء الخاصة به. يتطلب SDK إصدار React Native 0.60.0 أو أعلى.
npm install esaalat-react-native
# or
yarn add esaalat-react-nativeيتطلب SDK هذه التبعيات:
npm install react-native-webview axios📱 ملاحظة: يوفر هذا SDK ميزتين رئيسيتين:
استخدم إيصالاتClient للتفاعل مع واجهة برمجة التطبيقات الخلفية لإنشاء الطلبات وجلب الاشتراكات.
import { EsaalatClient } from 'esaalat-react-native';
const client = new EsaalatClient({
clientId: 'your-client-id',
clientSecret: 'your-client-secret',
baseUrl: 'https://api.esaalat.com', // api.sandbox.esaalat.com for sandbox
});// Get all subscriptions
const subscriptions = await client.getSubscriptions();
// Find active subscription
const activeSub = subscriptions.find(s => s.isActive && s.canReceive);
if (activeSub) {
console.log(`Using: ${activeSub.providerName}`);
}const orderId = await client.createOrder({
subscriptionId: activeSub.id,
items: [
{
name: 'Premium T-Shirt',
description: '100% cotton',
price: 29.99,
quantity: 2,
},
],
currency: 'USD',
});
console.log(`Order created: ${orderId}`);const order = await client.getOrder(orderId);
if (order.status === 'COMPLETED') {
console.log('Payment completed!');
} else if (order.status === 'PENDING') {
console.log('Waiting for payment...');
}استخدم مكون PortalController لعرض واجهة الدفع في WebView. يتعامل مع جميع تفاعلات الدفع ويوفر ردود نداء للأحداث.
import { PortalController } from 'esaalat-react-native';
function CheckoutScreen({ orderId }) {
return (
<PortalController
baseUrl="https://checkout.esaalat.com" // api.sandbox.esaalat.com for sandbox
orderId={orderId}
events={{
onComplete: () => {
console.log('Payment completed!');
navigation.goBack();
},
onClose: () => {
console.log('Portal closed');
navigation.goBack();
},
onSuspicious: () => {
console.warn('Suspicious activity detected');
},
}}
/>
);
}onSuccessيتم استدعاؤه عند نجاح الدفع
onCompleteيتم استدعاؤه عند اكتمال الدفع
onCloseيتم استدعاؤه عند إغلاق البوابة
onSuspiciousيتم استدعاؤه عند اكتشاف نشاط مشبوه
اعرض البوابة في نافذة مشروطة لتجربة مستخدم أفضل:
import { Modal } from 'react-native';
import { PortalController } from 'esaalat-react-native';
function App() {
const [showPortal, setShowPortal] = useState(false);
const [orderId, setOrderId] = useState<string | null>(null);
return (
<>
<Button onPress={() => setShowPortal(true)}>
Checkout
</Button>
<Modal visible={showPortal} animationType="slide">
{orderId && (
<PortalController
baseUrl="https://checkout.esaalat.com" // api.sandbox.esaalat.com for sandbox
orderId={orderId}
events={{
onComplete: () => setShowPortal(false),
onClose: () => setShowPortal(false),
}}
/>
)}
</Modal>
</>
);
}إليك مثال كامل يوضح تدفق الدفع الكامل من إنشاء الطلب إلى التحقق من الدفع:
import React, { useState } from 'react';
import { View, Button, Modal, Alert } from 'react-native';
import { EsaalatClient, PortalController } from 'esaalat-react-native';
const client = new EsaalatClient({
clientId: 'your-id',
clientSecret: 'your-secret',
baseUrl: 'https://api.esaalat.com', // api.sandbox.esaalat.com for sandbox
});
export function CheckoutFlow() {
const [showPortal, setShowPortal] = useState(false);
const [orderId, setOrderId] = useState<string | null>(null);
const handleCheckout = async () => {
try {
// 1. Get subscriptions
const subs = await client.getSubscriptions();
const activeSub = subs.find(s => s.isActive && s.canReceive);
if (!activeSub) {
Alert.alert('Error', 'No active subscriptions');
return;
}
// 2. Create order
const id = await client.createOrder({
subscriptionId: activeSub.id,
items: [
{
name: 'Premium T-Shirt',
description: '100% cotton',
price: 29.99,
quantity: 2,
},
],
currency: 'USD',
});
setOrderId(id);
setShowPortal(true);
} catch (error) {
Alert.alert('Error', error.message);
}
};
const handleComplete = async () => {
if (!orderId) return;
try {
// 3. Verify order status
const order = await client.getOrder(orderId);
if (order.status === 'COMPLETED') {
Alert.alert('Success', 'Payment completed!');
setShowPortal(false);
}
} catch (error) {
Alert.alert('Error', error.message);
}
};
return (
<View>
<Button title="Checkout" onPress={handleCheckout} />
<Modal visible={showPortal} animationType="slide">
{orderId && (
<PortalController
baseUrl="https://checkout.esaalat.com" // api.sandbox.esaalat.com for sandbox
orderId={orderId}
events={{
onComplete: handleComplete,
onClose: () => setShowPortal(false),
}}
/>
)}
</Modal>
</View>
);
}يوفر SDK فئات خطأ محددة لسيناريوهات مختلفة:
import {
EsaalatClient,
EsaalatError,
AuthenticationError,
ValidationError,
APIError,
OrderNotFoundError,
NetworkError,
} from 'esaalat-react-native';
const client = new EsaalatClient({
clientId: 'your-id',
clientSecret: 'your-secret',
baseUrl: 'https://api.esaalat.com', // api.sandbox.esaalat.com for sandbox
});
try {
await client.createOrder(params);
} catch (error) {
if (error instanceof ValidationError) {
console.error('Validation failed:', error.message);
// Show validation error to user
} else if (error instanceof AuthenticationError) {
console.error('Auth failed:', error.message);
// Handle authentication failure
} else if (error instanceof OrderNotFoundError) {
console.error('Order not found');
// Handle missing order
} else if (error instanceof NetworkError) {
console.error('Network error:', error.message);
// Show network error to user
} else if (error instanceof APIError) {
console.error('API error:', error.message);
// Handle API errors
}
}يرمي AuthenticationError. تحقق من صحة معرف العميل والسر الخاص بك.
يرمي ValidationError. تحقق من أن الأسعار إيجابية، والكميات أعداد صحيحة، والسلاسل ليست فارغة.
يرمي NetworkError. تحقق من اتصال الإنترنت وتوفر واجهة برمجة التطبيقات.