الانتقال إلى المحتوى الرئيسي
في هذا الدليل، ستتعلم كيفية تنفيذ تسعير قائم على المقاعد باستخدام إضافات Dodo Payments. سنقوم بإنشاء منتج اشتراك مع إضافات لمقاعد إضافية وسنوضح لك كيفية توليد روابط دفع مع كميات إضافات مخصصة.
يقدم هذا البرنامج التعليمي نموذجًا لشفرة تنفيذ لتطبيق Node.js/Express. يمكنك تعديل هذه الشفرة لإطار العمل الذي تستخدمه (Next.js، React، Vue، إلخ) وتخصيص واجهة المستخدم حسب احتياجات تطبيقك.
بنهاية هذا الدليل، ستعرف كيفية:
  • إنشاء منتجات اشتراك مع تسعير قائم على المقاعد
  • إعداد إضافات لمقاعد إضافية
  • توليد روابط دفع مع كميات إضافات مخصصة
  • التعامل مع جلسات الدفع مع عدد مقاعد ديناميكي

ما الذي نبنيه

لنقم بإنشاء نموذج تسعير قائم على المقاعد:
  • الخطة الأساسية: 49 دولارًا شهريًا لما يصل إلى 5 أعضاء في الفريق
  • إضافة مقعد: 2 دولار شهريًا لكل مقعد إضافي
  • روابط الدفع: دفع ديناميكي مع كميات مقاعد مخصصة
قبل أن نبدأ، تأكد من أن لديك:
  • حساب في Dodo Payments
  • معرفة أساسية بـ TypeScript/Node.js

الخطوة 1: إنشاء إضافة المقعد الخاصة بك

الآن نحتاج إلى إنشاء إضافة تمثل المقاعد الإضافية. ستُرفق هذه الإضافة باشتراكنا الأساسي وتسمح للعملاء بشراء مقاعد إضافية.
إنشاء منتج اشتراك أساسي
ما نبنيه: إضافة تكلف 2 دولار شهريًا لكل مقعد ويمكن إضافتها إلى أي اشتراك أساسي.
1

Navigate to Add-Ons

  1. في لوحة تحكم Dodo Payments الخاص بك، ابق في قسم المنتجات
  2. انقر على علامة التبويب الإضافات
  3. انقر على إنشاء إضافة
سيؤدي هذا إلى فتح نموذج إنشاء الإضافة.
2

Enter add-on details

املأ القيم التالية لإضافة المقاعد الخاصة بنا:اسم الإضافة: Additional Team Seatالوصف: Add extra team members to your workspace with full access to all featuresالسعر: أدخل → 2.00العملة: يجب أن تتطابق مع عملة الاشتراك الأساسي الخاص بكفئة الضريبة: اختر الفئة المناسبة لمنتجك.
3

Save your add-on

  1. راجع جميع الإعدادات:
    • الاسم: مقعد فريق إضافي
    • السعر: 2.00 دولار/شهريًا
  2. انقر على إنشاء إضافة
تم إنشاء الإضافة! أصبحت إضافة المقاعد متاحة الآن لربطها بالاشتراكات.

الخطوة 2: إنشاء منتج الاشتراك الأساسي الخاص بك

سنبدأ بإنشاء منتج اشتراك أساسي يتضمن 5 أعضاء في الفريق. سيكون هذا هو الأساس لنموذج التسعير القائم على المقاعد لدينا.
إنشاء منتج اشتراك أساسي
1

Navigate to Products

  1. سجّل الدخول إلى لوحة تحكم Dodo Payments الخاصة بك
  2. انقر على المنتجات في الشريط الجانبي الأيسر
  3. انقر على زر إنشاء منتج
  4. اختر اشتراك كنوع المنتج
سيظهر لك نموذج سنقوم من خلاله بتكوين اشتراكنا الأساسي.
2

Fill in the subscription details

الآن سندخل التفاصيل المحددة لخطة الأساس لدينا:اسم المنتج: Motionالوصف: Where your team's documentation lives.السعر الدوري: أدخل → 49.00دورة الفوترة: اختر → Monthlyالعملة: اختر العملة المفضلة لديك (مثلاً USD)

الخطوة 3: ربط الإضافة بالاشتراك

الآن نحتاج إلى ربط إضافة المقعد الخاصة بنا بالاشتراك الأساسي حتى يتمكن العملاء من شراء مقاعد إضافية أثناء الدفع.
1

Attach the seat add-on

ربط الإضافة بالاشتراك
  1. قم بالتمرير لأسفل إلى قسم الإضافات
  2. انقر إضافة إضافات
  3. من القائمة المنسدلة، اختر إضافة المقعد الخاصة بك
  4. تأكد من أنها تظهر في تكوين اشتراكك
2

Save subscription changes

  1. راجع إعدادات الاشتراك بالكامل:
    • الخطة الأساسية: 49 دولار/شهريًا مقابل 5 مقاعد
    • الإضافة: 2 دولار/شهريًا لكل مقعد إضافي
    • الفترة التجريبية المجانية: 14 يومًا
  2. انقر على حفظ التغييرات
تم تكوين التسعير المعتمد على المقاعد! يمكن للعملاء الآن شراء خطتك الأساسية وإضافة مقاعد إضافية عند الحاجة.

الخطوة 4: توليد روابط الدفع مع كميات إضافات مخصصة

الآن دعنا ننشئ تطبيق Express.js يقوم بتوليد روابط دفع مع كميات إضافات مخصصة. هنا تأتي القوة الحقيقية للتسعير القائم على المقاعد - يمكنك إنشاء جلسات دفع ديناميكية مع أي عدد من المقاعد الإضافية.
1

Set up your project

أنشئ مشروع Node.js جديدًا وقم بتثبيت التبعيات المطلوبة:
mkdir seat-based-pricing
cd seat-based-pricing
npm init -y
npm install dodopayments express dotenv
npm install -D @types/node @types/express typescript ts-node
أنشئ ملف tsconfig.json:
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}
2

Create your environment file

أنشئ ملف .env يحتوي على مفتاح واجهة برمجة تطبيقات Dodo Payments الخاص بك:
DODO_PAYMENTS_API_KEY=your_actual_dodo_api_key_here
لا تدرج مفتاح واجهة برمجة التطبيقات في نظام التحكم بالإصدارات. أضف .env إلى ملف .gitignore.
3

Implement the checkout session creation

أنشئ ملف src/server.ts مع الشفرة التالية:
// Add this new endpoint for dynamic seat quantities
import 'dotenv/config';
import DodoPayments from 'dodopayments';
import express, { Request, Response } from 'express';

const app = express();

// Initialize the Dodo Payments client
const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode'
});

async function createCheckoutSession(seatCount: number) {
  try {
    const session = await client.checkoutSessions.create({
      // Products to sell - use IDs from your Dodo Payments dashboard
      product_cart: [
        {
          product_id: 'pdt_7Rl9OWT2Mz4wwUTKz74iZ', // Replace with your actual product ID
          quantity: 1,
          addons: [
            {
              addon_id: 'adn_eKQbNakKrivDpaxmI8wKI', // Replace with your actual addon ID
              quantity: seatCount
            }
          ]
        }
      ],
      
      // Pre-fill customer information to reduce friction
      customer: {
        email: 'steve@example.com',
        name: 'Steve Irwin',
      },
      // Where to redirect after successful payment
      return_url: 'https://example.com/checkout/success',
    });

    // Redirect your customer to this URL to complete payment
    console.log('Checkout URL:', session.checkout_url);
    console.log('Session ID:', session.session_id);
    
    return session;
    
  } catch (error) {
    console.error('Failed to create checkout session:', error);
    throw error;
  }
}

// Example usage in an Express.js route
app.post('/create-checkout/:seatCount', async (req: Request, res: Response) => {
  try {
    const seatCount = parseInt(req.params.seatCount);
    const session = await createCheckoutSession(seatCount);
    res.json({ checkout_url: session.checkout_url });
  } catch (error) {
    res.status(500).json({ error: 'Failed to create checkout session' });
  }
});

// Add this line after your other middleware
app.use(express.static('public'));

// Add this route to serve the demo page
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/../public/index.html');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
4

Add a simple web interface

أنشئ ملف public/index.html لاختبار بسيط:
<!DOCTYPE html>
<html>
<head>
    <title>Seat-Based Pricing Demo</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; }
        .form-group { margin: 20px 0; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; }
        button { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; }
        button:hover { background: #0056b3; }
        .result { margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 4px; }
    </style>
</head>
<body>
    <h1>Seat-Based Pricing Demo</h1>
    <p>Generate checkout links with custom seat quantities:</p>
    
    <div class="form-group">
        <label for="seatCount">Number of Additional Seats:</label>
        <input type="number" id="seatCount" value="3" min="0" max="50">
    </div>
    
    <button onclick="createCheckout()">Generate Checkout Link</button>
    
    <div id="result" class="result" style="display: none;">
        <h3>Checkout Link Generated!</h3>
        <p><strong>Seat Count:</strong> <span id="seatCountDisplay"></span></p>
        <p><strong>Total Cost:</strong> $<span id="totalCost"></span>/month</p>
        <p><strong>Checkout URL:</strong></p>
        <a id="checkoutUrl" href="#" target="_blank">Click here to checkout</a>
    </div>

    <script>
        async function createCheckout() {
            const seatCount = document.getElementById('seatCount').value;
            
            try {
                const response = await fetch(`/create-checkout/${seatCount}`, {
                    method: 'POST'
                });
                
                const data = await response.json();
                
                if (response.ok) {
                    document.getElementById('seatCountDisplay').textContent = seatCount;
                    document.getElementById('totalCost').textContent = data.total_cost;
                    document.getElementById('checkoutUrl').href = data.checkout_url;
                    document.getElementById('result').style.display = 'block';
                } else {
                    alert('Error: ' + data.error);
                }
            } catch (error) {
                alert('Error creating checkout session');
            }
        }
    </script>
</body>
</html>
تم إنشاء واجهة الويب! لديك الآن واجهة بسيطة لاختبار كميات المقاعد المختلفة.
5

Serve static files

أضف هذا إلى src/server.ts لتقديم ملف HTML:
// Add this line after your other middleware
app.use(express.static('public'));

// Add this route to serve the demo page
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/../public/index.html');
});
تم ضبط الملفات الثابتة! زر http://localhost:3000 لرؤية واجهة العرض التوضيحية.

الخطوة 5: اختبار تنفيذك

دعنا نختبر تنفيذ التسعير القائم على المقاعد لدينا للتأكد من أن كل شيء يعمل بشكل صحيح.
1

Start your server

  1. تأكد من أن ملف .env يحتوي على مفتاح API الصحيح
  2. حدّث معرّفات المنتج والإضافة في الشفرة بالقيم الفعلية من لوحة تحكم Dodo Payments
  3. شغّل الخادم الخاص بك:
npm run dev
يجب أن يبدأ خادمك بنجاح ويعرض “Server running on http://localhost:3000
2

Test the web interface

إنشاء منتج اشتراك أساسي
  1. افتح المتصفح وانتقل إلى http://localhost:3000
  2. ينبغي أن ترى واجهة عرض أسعار المقعد
  3. جرّب كميات مختلفة من المقاعد (0، 3، 10، إلخ)
  4. انقر “إنشاء رابط الدفع” لكل كمية
  5. تحقق من توليد روابط الدفع بشكل صحيح
3

Test a checkout session

  1. أنشئ رابط دفع مع 3 مقاعد إضافية
  2. انقر على رابط الدفع لفتح صفحة الدفع الخاصة بـ Dodo Payments
  3. تحقق من أن الصفحة تعرض:
    • الخطة الأساسية: 49 دولار/شهريًا
    • المقاعد الإضافية: 3 × 2 دولار = 6 دولارات/شهريًا
  4. أكمل عملية الشراء التجريبية
يجب أن تعرض صفحة الدفع التفصيل الصحيح للأسعار وتتيح لك إكمال الشراء.
4

Listen for webhooks and update your DB

للحفاظ على تزامن قاعدة البيانات مع تغييرات الاشتراك والمقاعد، تحتاج إلى الاستماع إلى أحداث الويب هوك من Dodo Payments. تقوم الويب هوك بإخطار الخادم الخلفي عند إتمام العميل للدفع، أو تحديث اشتراكه، أو تغيير عدد المقاعد.اتبع دليل الويب هوكس الرسمي من Dodo Payments للحصول على تعليمات خطوة بخطوة حول إعداد نقاط نهاية الويب هوك ومعالجة الأحداث:

Dodo Payments Webhooks Documentation

تعلّم كيفية استقبال ومعالجة أحداث الويب هوك بأمان لإدارة الاشتراكات والمقاعد.

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

المشاكل الشائعة وحلولها:
الأسباب المحتملة:
  • معرّف منتج أو إضافة غير صالح
  • مفتاح API لا يملك الأذونات الكافية
  • الإضافة غير مرتبطة بالاشتراك بشكل صحيح
  • مشكلات في الاتصال بالشبكة
الحلول:
  1. تحقق من وجود معرّفات المنتج والإضافة في لوحة تحكم Dodo Payments
  2. تأكد من أن الإضافة مرتبطة بالاشتراك بشكل صحيح
  3. تأكد من أن مفتاح API يمتلك أذونات إنشاء جلسة الدفع
  4. اختبر الاتصال بواجهة برمجة التطبيقات بطلب GET بسيط

تهانينا! لقد نفذت تسعير قائم على المقاعد

لقد أنشأت بنجاح نظام تسعير قائم على المقاعد باستخدام Dodo Payments! إليك ما أنجزته:

Base Subscription

تم إنشاء منتج اشتراك يتضمن 5 مقاعد بسعر 49 دولار/شهريًا

Seat Add-ons

تم تكوين الإضافات للمقاعد الإضافية بسعر 2 دولار/شهريًا لكل مقعد

Checkout

تم بناء واجهة برمجة تطبيقات تولّد جلسات دفع بكميات مقاعد مخصصة

Web Interface

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