> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# React Native

> افتح hosted checkout الخاص بـ Dodo Payments من تطبيق React Native في علامة تبويب متصفح النظام، واحصل على نتيجة مكتوبة النوع في استدعاء واحد.

<Info>
  هذا هو React Native checkout SDK الرسمي من Dodo Payments، `@dodopayments/react-native-checkout`. يفتح hosted checkout الخاص بـ Dodo في عرض متصفح أصلي ويُعيد نتيجة مكتوبة النوع. ملاحظة: توجد حزمة قديمة وغير مرتبطة باسم `dodopayments-react-native-sdk` (غير محددة النطاق) بواجهة API مختلفة تمامًا. توثّق هذه الصفحة الحزمة الرسمية الحالية المحددة النطاق فقط.
</Info>

<CardGroup cols={2}>
  <Card title="Checkout Sessions API" icon="cart-shopping" href="/developer-resources/checkout-session">
    أنشئ checkout\_url الذي يفتحه هذا SDK من الواجهة الخلفية لديك.
  </Card>

  <Card title="Mobile Integration Guide" icon="mobile" href="/developer-resources/mobile-integration">
    تعرّف على كيفية اندماج ذلك ضمن تدفق الدفع الكامل على الأجهزة المحمولة.
  </Card>
</CardGroup>

إن React Native SDK عبارة عن غلاف Turbo Module رفيع فوق نواتَي Swift وKotlin الأصليتين نفسيهما. يفتح `SFSafariViewController` على iOS وعلامة تبويب Chrome Custom Tab على Android، ولا يحتفظ بأي مفتاح API، ولا يستدعي Dodo API مباشرةً. تُنفَّذ كل منطقية checkout في المتصفح؛ بينما يدير SDK دورة حياة العرض فقط ويلتقط return URL.

<Warning>
  يتطلب هذا SDK **New Architecture فقط**، وReact Native 0.76 أو أحدث، وiOS 16 أو أحدث، وAndroid `minSdk` 24.
</Warning>

## التثبيت

<Steps>
  <Step title="Install the Package">
    <Tabs>
      <Tab title="Android">
        تتم إضافة الحزمة تلقائيًا وتستجلب `com.dodopayments.api:checkout-android` من Maven.

        ```sh theme={null}
        npm i @dodopayments/react-native-checkout
        ```

        لا حاجة إلى إعداد إضافي؛ إذ يتم حل التبعية الأصلية تلقائيًا.
      </Tab>

      <Tab title="iOS">
        ```sh theme={null}
        npm i @dodopayments/react-native-checkout
        cd ios && pod install
        ```

        تأتي نواة Swift مضمنةً في الحزمة ويتم تثبيتها عبر CocoaPods.
      </Tab>

      <Tab title="Expo">
        لإصدارات التطوير فقط (وليس Expo Go).

        ```sh theme={null}
        npm i @dodopayments/react-native-checkout
        npx expo install expo-build-properties
        ```

        بعد ذلك، اضبط `app.json` لديك (راجع تسجيل مخطط URL لاستدعاء callback أدناه).
      </Tab>
    </Tabs>
  </Step>

  <Step title="Register a Callback URL Scheme">
    يجب أن يسجّل تطبيقك مخطط URL لاستقبال return URL من checkout.

    <Tabs>
      <Tab title="Android (Gradle)">
        في `android/app/build.gradle`:

        ```kotlin android/app/build.gradle theme={null}
        android {
            defaultConfig {
                manifestPlaceholders["dodoCallbackScheme"] = "myapp"
            }
        }
        ```

        استبدل `"myapp"` بمخطط تطبيقك.
      </Tab>

      <Tab title="iOS (Info.plist)">
        في `ios/YourApp/Info.plist`:

        ```xml Info.plist theme={null}
        <key>CFBundleURLTypes</key>
        <array>
          <dict>
            <key>CFBundleURLName</key>
            <string>myapp</string>
            <key>CFBundleURLSchemes</key>
            <array>
              <string>myapp</string>
            </array>
          </dict>
        </array>
        ```

        يمكنك أيضًا إضافة ذلك عبر واجهة **Info → URL Types** في Xcode.
      </Tab>

      <Tab title="Expo (both platforms)">
        في `app.json`:

        ```json app.json theme={null}
        {
          "expo": {
            "plugins": [
              [
                "expo-build-properties",
                {
                  "android": {
                    "manifestPlaceholders": {
                      "dodoCallbackScheme": "myapp"
                    }
                  }
                }
              ]
            ],
            "ios": {
              "infoPlist": {
                "CFBundleURLTypes": [
                  {
                    "CFBundleURLSchemes": ["myapp"]
                  }
                ]
              }
            }
          }
        }
        ```

        <Warning>
          تتضمن الحزمة أيضًا Expo config
          plugin باسم `@dodopayments/react-native-checkout`، لكنه لا يكتب حاليًا أي مخطط URL أو أي manifest placeholder.
          إن إضافته وحدها **لن** تسجّل مخطط callback لديك — استخدم إعداد `expo-build-properties` و`infoPlist` أعلاه.
        </Warning>

        <Note>
          أعد إنشاء native project بعد تعديل `app.json`:

          ```sh theme={null}
          npx expo prebuild --clean
          ```

          يعمل هذا مع إصدارات التطوير فقط، وليس Expo Go.
        </Note>
      </Tab>
    </Tabs>
  </Step>
</Steps>

## الاستخدام

```typescript theme={null}
import { Linking } from 'react-native';
import { DodoCheckout } from '@dodopayments/react-native-checkout';

// Required for iOS's return-URL handling.
Linking.addEventListener('url', ({ url }) => DodoCheckout.handleOpenURL(url));

const result = await DodoCheckout.start({
  checkoutUrl,                          // from your backend's checkout session
  returnUrl: 'myapp://checkout/return', // scheme must be registered (see Installation)
  onEvent: (e) => console.log(e.type),  // logging only
});

switch (result.status) {
  case 'succeeded': showSuccess(result.paymentId); break;
  case 'failed':    showFailure(); break;
  case 'cancelled': dismiss(); break;
  case 'pending':   showPending(); break;
  case 'expired':   showExpired(); break;
}
```

## إعادة توجيه Return URL

يُعد مستمع `Linking` مطلوبًا لمعالجة return URL في iOS. أما على Android، فإن `handleOpenURL` لا ينفذ أي إجراء ويحل `false`، لأن نواة Android تتعامل مع إعادة التوجيه أصليًا. من الآمن تسجيل المستمع دون شروط على كلا النظامين الأساسيين.

```typescript theme={null}
import { Linking } from 'react-native';
import { DodoCheckout } from '@dodopayments/react-native-checkout';

Linking.addEventListener('url', ({ url }) => {
  DodoCheckout.handleOpenURL(url);
});
```

## ما الذي تعنيه النتيجة

<Warning>
  `result.status` هو تلميح لواجهة المستخدم، وليس دليلًا على الدفع. أكّد كل عملية دفع من الواجهة الخلفية لديك، عبر webhook `payment.succeeded` / `subscription.active`.
</Warning>

<ParamField body="status" type="CheckoutStatus" required>
  واحد من `succeeded` أو `failed` أو `cancelled` أو `pending` أو `expired`.
</ParamField>

<ParamField body="paymentId" type="string">
  يُحدَّد عند تضمين أحدها في return URL. اعرضه في واجهة المستخدم، ولا تستخدمه لمنح الوصول. راجع التحقق من الدفع أدناه.
</ParamField>

<ParamField body="subscriptionId" type="string">
  يُحدَّد لعمليات checkout الخاصة بالاشتراكات.
</ParamField>

<ParamField body="licenseKeys" type="string[]">
  يُحدَّد عند تضمين منتجات تتطلب license keys في checkout.
</ParamField>

<ParamField body="customerEmail" type="string">
  يُحدَّد عند التقاط بريد إلكتروني في checkout.
</ParamField>

<ParamField body="raw" type="Record<string, string>">
  كل query parameter من return URL، حرفيًا.
</ParamField>

## التحقق من الدفع

<CardGroup cols={2}>
  <Card title="Webhooks" icon="webhook" href="/developer-resources/webhooks">
    يستدعي Dodo Payments الواجهة الخلفية لديك عند نجاح الدفع أو تفعيل الاشتراك.
  </Card>

  <Card title="Get Payment Detail" icon="magnifying-glass" href="/api-reference/payments/get-payments-1">
    ابحث عن `paymentId` باستخدام مفتاحك السري للتحقق من حالته مباشرةً.
  </Card>
</CardGroup>

امنح الوصول بعد أن يؤكد أحد هذه العناصر الدفع، وليس اعتمادًا على `result.status` وحده.

## الأخطاء

يرفض `start` الطلب مع `CheckoutError` فقط عند إساءة الاستخدام أو حدوث فشل في المنصة. أما الدفع الملغى أو المرفوض فهو دائمًا نتيجة، وليس استثناءً.

* `INVALID_CHECKOUT_URL`: ليس عنوان جلسة `checkout.dodopayments.com` صالحًا.
* `INVALID_RETURN_URL`: ليس عنوان URL مطلقًا صالحًا.
* `ALREADY_IN_PROGRESS`: توجد عملية checkout قيد التشغيل بالفعل.
* `PLATFORM_ERROR`: فشل غير متوقع في المنصة.

## الجلسات المتروكة

إذا أُغلق التطبيق أو حزمة JS أثناء checkout، فستُفقد promise، لكن الطبقة الأصلية تحتفظ بالجلسة. استعدها عند عملية mount التالية وسوِّها مع الواجهة الخلفية لديك.

```typescript theme={null}
import { DodoCheckout } from '@dodopayments/react-native-checkout';

const abandoned = await DodoCheckout.getAbandonedSession();
if (abandoned) {
  // reconcile abandoned.sessionId with your backend, then:
  await DodoCheckout.clearAbandonedSession();
}
```

## ذات صلة

<CardGroup cols={2}>
  <Card title="Mobile Integration Guide" icon="mobile" href="/developer-resources/mobile-integration">
    العقد نفسه لأنظمة Android وiOS وFlutter.
  </Card>

  <Card title="Expo Boilerplate" icon="layer-group" href="/developer-resources/expo-boilerplate">
    مثال Expo كامل مع تكامل checkout.
  </Card>
</CardGroup>
