> ## 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.

# GoHighLevel

> يمكنك دمج Dodo Payments مع GoHighLevel (GHL) باستخدام روابط الدفع بدون برمجة، أو الدفع المنبثق، أو الدفع المضمّن، وأتمتة تنفيذ الطلبات باستخدام webhooks.

## مقدمة

‏[GoHighLevel](https://www.gohighlevel.com/)‏ (GHL) عبارة عن منصة CRM وتسويق متكاملة تشمل مسارات التحويل، والمواقع الإلكترونية، والبريد الإلكتروني/SMS، والأتمتة ("Workflows"). لا يدرج GHL‏ Dodo Payments كمعالج دفع مضمّن، لذلك يمكنك ربط الخدمتين بإحدى ثلاث طرق، بناءً على مدى رغبتك في جعل تجربة الدفع مضمّنة ومقدار البرمجة الذي يمكنك تنفيذه.

في كل طريقة، تتم معالجة تنفيذ الطلبات بالطريقة نفسها. يرسل Dodo‏ [أحداث webhook](/developer-resources/webhooks) إلى **Inbound Webhook Workflow** في GHL، الذي يضيف وسمًا إلى جهة الاتصال، ويمنحها الوصول، ويرسل رسائل التأكيد.

## اختر طريقتك

| الطريقة              | البرمجة المطلوبة                          | تجربة الدفع                                              | الأنسب لـ                                                 |
| -------------------- | ----------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------- |
| **A. روابط الدفع**   | لا شيء (بدون برمجة)                       | تتم إعادة توجيه العميل إلى صفحة الدفع المستضافة لدى Dodo | معظم مستخدمي GHL، والأسرع في الإطلاق                      |
| **B. الدفع المنبثق** | تعليمات برمجية مخصصة بالإضافة إلى backend | تُفتح نافذة منبثقة فوق صفحة GHL                          | الفرق التي تريد الدفع داخل الصفحة دون مغادرة مسار التحويل |
| **C. الدفع المضمّن** | تعليمات برمجية مخصصة بالإضافة إلى backend | يتم تضمين نموذج الدفع داخل الصفحة                        | تجربة مستخدم مضمّنة بالكامل وتحمل العلامة التجارية        |

<Info>
  هل هذه أول مرة تستخدم فيها هذا التكامل؟ ابدأ بـ **الطريقة A (روابط الدفع)**. فهي لا تتطلب برمجة، وتعمل مع كل مستخدمي GHL، ولا تستغرق سوى دقائق. تحتاج الطريقتان B وC إلى backend لإنشاء [جلسات الدفع](/api-reference/checkout-sessions/create)، وهما مناسبتان للفرق التي لديها خبرة في البرمجة.
</Info>

## المتطلبات الأساسية

* حساب Dodo Payments يحتوي على **منتج** واحد على الأقل تم إنشاؤه.
* حساب GoHighLevel يحتوي على مسار تحويل أو موقع إلكتروني أو workflow.
* الوصول إلى **Settings → Webhooks** (و**Settings → Developer** للحصول على API key) في لوحة تحكم Dodo.
* للطريقتين B وC: **backend أو endpoint serverless** صغير لإنشاء جلسات الدفع.

<Note>
  يتطلب GHL وجود **نطاق متصل** من أجل *نشر* مسار التحويل. أثناء الإنشاء، استخدم **Preview** الخاص بمسار التحويل للاختبار. تجدر الإشارة إلى أن JavaScript المخصص (الطريقتان B وC) يعمل عمومًا على **الصفحة المنشورة على نطاق حقيقي** فقط، وليس في Preview.
</Note>

## تنفيذ الطلبات باستخدام webhooks (جميع الطرق)

هذه هي طبقة الأتمتة. أعد إعدادها مرة واحدة، وستعمل بغض النظر عن طريقة الدفع التي تختارها.

<Steps>
  <Step title="Create the workflow">
    في **الحساب الفرعي** في GHL، افتح **Automation** من القائمة اليمنى (سينقلك ذلك إلى علامة تبويب **Workflows**). انقر على **Create workflow**، ثم اختر **Start from Scratch**.
  </Step>

  <Step title="Add the Inbound Webhook trigger">
    في المنشئ، انقر على **Add new trigger**. في لوحة **Add trigger**، ابحث عن **webhook** واختر **Inbound webhook** (مدرج ضمن **Triggers → Events**). انسخ **Webhook URL** الذي يتم إنشاؤه.
  </Step>

  <Step title="Register the webhook in Dodo">
    في لوحة تحكم Dodo، انتقل إلى **Settings → Webhooks**، وأضف endpoint جديدًا، ثم الصق عنوان GHL Inbound Webhook URL. أجرِ عملية شراء تجريبية حتى يلتقط GHL عينة من payload، وتتمكن من تعيين الحقول (بريد العميل الإلكتروني، والمنتج، والمبلغ، والحالة).
  </Step>

  <Step title="Add fulfillment actions">
    بالعودة إلى workflow في GHL، أضف إجراءات استنادًا إلى الحدث، مثل **العثور على جهة اتصال أو إنشاؤها باستخدام البريد الإلكتروني**، و**إضافة وسم**، و**منح الوصول إلى الدورة/العضوية**، و**إرسال رسالة تأكيد بالبريد الإلكتروني**. ثم انقر على **Publish** في workflow.
  </Step>
</Steps>

<Warning>
  تتم معالجة المدفوعات على Dodo، ولذلك **لن تظهر** في علامة تبويب Payments في GHL. سوِّها في GHL باستخدام workflow الخاص بـ webhook أعلاه، وتعامل مع **webhook باعتباره مصدر الحقيقة** لمنح الوصول، وليس مع إعادة توجيه المتصفح، إذ يمكن للعميل إغلاق علامة التبويب قبل العودة.
</Warning>

## الطريقة A: روابط الدفع (بدون برمجة)

أضف رابط دفع من Dodo إلى أي زر في GHL، أو CTA في مسار التحويل، أو زر في صفحة الطلب، أو بريد إلكتروني، أو SMS.

<Steps>
  <Step title="Create a product and copy its payment link">
    في لوحة تحكم Dodo، انتقل إلى **Products → Add Product**، وحدد **name** و**price**، واختر **one-time** أو **subscription**، ثم انقر على **Save**. افتح المنتج وانسخ **Payment Link** (التنسيق: `https://checkout.dodopayments.com/buy/{product_id}`).
  </Step>

  <Step title="Add the link to your GHL button">
    حرّر صفحة مسار التحويل أو الموقع الإلكتروني، وحدد **Buy / Checkout button**، واضبط الإجراء على **Open URL / Website**، ثم الصق رابط الدفع من Dodo.
  </Step>

  <Step title="Set a success page (optional)">
    اضبط **return URL** الخاص بالمنتج في Dodo على صفحة شكر في GHL حتى يعود العملاء إلى مسار التحويل بعد الدفع.
  </Step>
</Steps>

<Tip>
  يمكنك تعبئة تفاصيل العميل مسبقًا وقفلها، أو إضافة التتبع، باستخدام [معلمات query لرابط الدفع](/features/checkout). ويفيد ذلك في تمرير معرّف مسار التحويل أو العرض كـ metadata يمكنك قراءته لاحقًا من webhook.
</Tip>

## الطريقة B: الدفع المنبثق (تعليمات برمجية مخصصة)

يفتح Checkout من Dodo كـ **نافذة منبثقة** على صفحة GHL باستخدام [Checkout SDK](/developer-resources/overlay-checkout) عبر CDN. ويتطلب backend لإنشاء [جلسة دفع](/api-reference/checkout-sessions/create) وإرجاع `checkoutUrl`.

<Steps>
  <Step title="Create a backend endpoint that calls the Checkout Sessions API">
    هذه الخطوة **إلزامية**. يحتاج SDK إلى `checkoutUrl` صالح، ويتطلب إنشاء واحد **secret API key** الخاص بك. يستضيف GHL صفحات ثابتة فقط، ولا يمكنه تنفيذ استدعاء الخادم هذا نيابةً عنك، ويجب ألا تستدعي [Create Checkout Session API](/api-reference/checkout-sessions/create) مباشرةً من المتصفح، لأن ذلك سيكشف secret key في مصدر الصفحة. لذلك لا يمكن أن يعمل الدفع المنبثق أو المضمّن **باستخدام GHL وحده**: أنت بحاجة إلى backend تتحكم فيه، ينشئ الجلسة ويعيد URL فقط.

    يعمل أي backend صغير: دالة serverless (مثل Cloudflare Workers وVercel Functions وAWS Lambda وSupabase Edge Functions وما شابهها)، أو endpoint على خادم تقوم بتشغيله بالفعل. المنطق نفسه في جميع الحالات: استلام الطلب، واستدعاء API الخاص بـ Dodo باستخدام secret key، وإرجاع `checkout_url`.

    مثال على منطق المعالج (عدّله بما يتناسب مع النظام الأساسي الذي تختاره):

    ```js theme={null}
    async function createCheckout(env) {
      const res = await fetch("https://test.dodopayments.com/checkouts", {
        method: "POST",
        headers: {
          "Authorization": `Bearer ${env.DODO_API_KEY}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          product_cart: [{ product_id: "pdt_your_product_id", quantity: 1 }],
        }),
      });

      const data = await res.json();
      return { checkoutUrl: data.checkout_url };
    }
    ```

    خزّن API key الخاص بـ Dodo كسر في أي نظام أساسي تنشر عليه (لا تضعه أبدًا في code)، واسمح بالطلبات الواردة من نطاق GHL (CORS)، ووجّه endpoint ضمن نطاق تتحكم فيه، مثل `https://api.example.com/create-checkout`. انتقل إلى `https://live.dodopayments.com/checkouts` عند الانتقال إلى الوضع المباشر.
  </Step>

  <Step title="Add a Custom Code element in the GHL page builder">
    افتح خطوة مسار التحويل أو صفحة الموقع الإلكتروني في منشئ صفحات GHL، ثم:

    1. انقر على أيقونة **+** في أعلى يسار المنشئ لفتح **Quick Add**.
    2. حدد **Elements** من قائمة الفئات اليمنى.
    3. ابحث عن **Custom Code** (يظهر أيضًا باسم HTML) واسحبه إلى الصفحة.
    4. الصق code أدناه في محرر code الخاص بالعنصر، ثم احفظه.

    ```html theme={null}
    <!-- Load the Dodo Checkout SDK -->
    <script src="https://cdn.jsdelivr.net/npm/dodopayments-checkout@latest/dist/index.js"></script>
    <script>
      DodoPaymentsCheckout.DodoPayments.Initialize({
        mode: "test", // change to "live" in production
        displayType: "overlay",
        onEvent: (event) => console.log("Checkout event:", event),
      });

      async function openDodoCheckout() {
        // calls the backend endpoint from the previous step, creating a fresh session per click
        const res = await fetch("https://api.example.com/create-checkout", { method: "POST" });
        const { checkoutUrl } = await res.json();

        DodoPaymentsCheckout.DodoPayments.Checkout.open({ checkoutUrl });
      }
    </script>

    <button onclick="openDodoCheckout()">Pay Now</button>
    ```
  </Step>

  <Step title="Publish and test on your domain">
    يعمل Custom JS على الصفحة **المنشورة** (ذات النطاق المتصل)، وليس دائمًا في Preview. انشر الصفحة، ثم انقر على **Pay Now** للتأكد من فتح النافذة المنبثقة.
  </Step>
</Steps>

## الطريقة C: الدفع المضمّن

تضمّن نموذج الدفع **داخل** صفحة GHL (من دون إعادة توجيه أو نافذة منبثقة) باستخدام SDK نفسه مع حاوية mount. وكما في الطريقة B، يتطلب ذلك backend لإنشاء الجلسة.

<Steps>
  <Step title="Create a backend endpoint that calls the Checkout Sessions API">
    المتطلب نفسه الخاص بالدفع المنبثق، وهو **إلزامي بالقدر نفسه**: يتطلب إنشاء الجلسة secret API key الخاص بك، لذلك يجب أن يحدث ذلك على الخادم. لا يستطيع GHL تنفيذ ذلك بمفرده. أعد استخدام endpoint نفسه الموضح في قسم **الدفع المنبثق** أعلاه (أي دالة serverless صغيرة أو خادم تتحكم فيه) الذي يستدعي [Create Checkout Session API](/api-reference/checkout-sessions/create) ويعيد `{ checkoutUrl }`.
  </Step>

  <Step title="Add a container and SDK via Custom Code">
    في منشئ صفحات GHL:

    1. انقر على أيقونة **+** في أعلى يسار المنشئ لفتح **Quick Add**.
    2. حدد **Elements** من قائمة الفئات اليمنى.
    3. ابحث عن **Custom Code** (يظهر أيضًا باسم HTML) واسحبه إلى الصفحة حيث تريد ظهور نموذج الدفع.
    4. الصق code أدناه في محرر code الخاص بالعنصر، ثم احفظه.

    ```html theme={null}
    <script src="https://cdn.jsdelivr.net/npm/dodopayments-checkout@latest/dist/index.js"></script>

    <div id="dodo-inline-checkout"></div>

    <script>
      DodoPaymentsCheckout.DodoPayments.Initialize({
        mode: "test",
        displayType: "inline",
        onEvent: (event) => console.log("Checkout event:", event),
      });

      async function mountDodoCheckout() {
        // calls the backend endpoint from the previous step
        const res = await fetch("https://api.example.com/create-checkout", { method: "POST" });
        const { checkoutUrl } = await res.json();

        DodoPaymentsCheckout.DodoPayments.Checkout.open({
          checkoutUrl,
          elementId: "dodo-inline-checkout",
        });
      }

      mountDodoCheckout();
    </script>
    ```
  </Step>

  <Step title="Verify your domain for wallets (Apple Pay)">
    لاستخدام Apple Pay مع الدفع المضمّن، [تحقق من نطاقك](/features/payment-methods/digital-wallets#apple-pay). استضف ملف association وسجّل النطاق في لوحة التحكم.
  </Step>
</Steps>

<Warning>
  الدفع المضمّن هو الخيار الأكثر تعقيدًا في GHL. فهو يتطلب code مخصصًا، وbackend، وصفحة منشورة على نطاق حقيقي، و(بالنسبة إلى Apple Pay) التحقق من النطاق. إذا لم تكن بحاجة إلى نموذج مضمّن بالكامل، ففضّل الطريقة A أو B.
</Warning>

## الأحداث التي يجب معالجتها

| حدث Dodo                                          | وقت حدوثه            | إجراء GHL المقترح                                                  |
| ------------------------------------------------- | -------------------- | ------------------------------------------------------------------ |
| `payment.succeeded`                               | عند تسجيل دفعة       | أضف وسمًا إلى جهة الاتصال يفيد بالدفع، وامنح الوصول، وأرسل تأكيدًا |
| `subscription.active`                             | عند تفعيل اشتراك     | امنح العضوية، وابدأ workflow لتهيئة العميل                         |
| `subscription.renewed`                            | عند تحصيل دفعة تجديد | مدّد الوصول للدورة التالية                                         |
| `subscription.on_hold`                            | عند فشل التجديد      | شغّل workflow لمتابعة الدفعات المتأخرة أو التذكير                  |
| `subscription.cancelled` / `subscription.expired` | عند انتهاء الاشتراك  | أزل الوصول، وأضف وسمًا يفيد بتوقف العميل                           |

يتضمن كل webhook **البريد الإلكتروني للعميل**. استخدم إجراء GHL المتمثل في **العثور على جهة اتصال أو إنشائها باستخدام البريد الإلكتروني** لربط الدفعة بجهة الاتصال الصحيحة. للحصول على القائمة الكاملة، راجع [دليل أحداث Webhook](/developer-resources/webhooks/intents/webhook-events-guide).

## الاختبار والانتقال إلى الوضع المباشر

<Steps>
  <Step title="Test in test mode">
    أبقِ Dodo في **Test Mode**، واستخدم بطاقة الاختبار `4242 4242 4242 4242` (أي تاريخ انتهاء مستقبلي وأي CVC)، وأكمل عملية شراء، ثم تأكد من تشغيل workflow في GHL وتطبيق الوسم أو منح الوصول.
  </Step>

  <Step title="Go live">
    بدّل Dodo إلى **Live Mode** وحدّث endpoint الخاص بـ webhook في الوضع المباشر. تعتمد التغييرات الأخرى على طريقتك:

    * **روابط الدفع (A):** استبدل الرابط برابط الدفع **المباشر** الخاص بالمنتج.
    * **الدفع المنبثق (B):** وجّه backend إلى `https://live.dodopayments.com/checkouts` باستخدام API key **المباشر** الخاص بك، واضبط `mode` في SDK على `"live"` ضمن استدعاء `Initialize`.
    * **الدفع المضمّن (C):** اتبع الخطوات نفسها الخاصة بالدفع المنبثق، لأنه يستخدم endpoint وتهيئة SDK نفسيهما.

    ثم أجرِ عملية شراء حقيقية واحدة من البداية إلى النهاية للتأكد.
  </Step>
</Steps>

## نصائح

<Tip>
  تعامل مع **webhook باعتباره مصدر الحقيقة** لمنح الوصول. اتخذ الإجراء بناءً على `payment.succeeded` / `subscription.active`، وليس بناءً على إعادة توجيه المتصفح.
</Tip>

<Tip>
  تحقق من صحة webhook باستخدام ترويسة `webhook-signature` ([Standard Webhooks](/developer-resources/webhooks))، حتى لا تؤدي أحداث Dodo الأصلية فقط إلى تشغيل تنفيذ الطلبات في GHL.
</Tip>

## استكشاف الأخطاء وإصلاحها

<AccordionGroup>
  <Accordion title="Payment succeeded but nothing happened in GHL">
    تحقق من أن endpoint الخاص بـ webhook في Dodo يشير إلى عنوان GHL Inbound Webhook URL الصحيح، وأن workflow **منشور**، وأن trigger التقط عينة من payload حتى يتوفر تعيين الحقول.
  </Accordion>

  <Accordion title="Overlay or inline button does nothing">
    يعمل Custom JS عادةً على **الصفحة المنشورة (ذات النطاق الحقيقي)** فقط، وليس في Preview. تأكد من نشر الصفحة، ومن تحميل SDK‏ `<script>`، ومن أن `checkoutUrl` هو URL جلسة صالحًا من backend الخاص بك.
  </Accordion>

  <Accordion title="Contact not created or not matched">
    تأكد من أن workflow يستخدم إجراء **العثور على جهة اتصال أو إنشائها باستخدام البريد الإلكتروني** وأن حقل البريد الإلكتروني معيّن من payload الخاص بـ webhook.
  </Accordion>

  <Accordion title="Payment isn't showing in GHL's Payments tab">
    هذا متوقع. تتم معالجة المدفوعات على Dodo، لذا سوِّها في GHL باستخدام workflow الخاص بـ webhook.
  </Accordion>
</AccordionGroup>
