الانتقال إلى المحتوى الرئيسي
السعر الديناميكي يتيح لك تقديم أسعار متغيرة لمنتجاتك دون الحاجة إلى إنشاء إدخالات متعددة للمنتجات. من خلال تمكين الدفع كما تريد (PWYW) على منتج واحد، يمكنك تحديد حدود سعر دنيا وعليا، ثم تمرير مبالغ ديناميكية عند إنشاء روابط جلسات الدفع. هذه الطريقة مثالية عندما تحتاج إلى:
  • أسعار متغيرة دون إدارة منتجات متعددة
  • أسعار مدفوعة من قبل العملاء حيث يختار المشترون المبلغ
  • تحكم برمجي في الأسعار حيث تحدد المبلغ ديناميكيًا عبر API
  • نماذج تسعير مرنة للمنتجات الرقمية، التبرعات، أو الإطلاقات التجريبية
الدفع كما تريد متاح فقط لمنتجات الدفع لمرة واحدة. لا يمكن استخدامه مع منتجات الاشتراك.

كيف يعمل

مع تمكين الدفع كما تريد، يمكنك:
  1. تحديد حدود الأسعار: تحديد سعر أدنى (مطلوب) وخيار سعر أقصى
  2. تمرير مبالغ ديناميكية: تضمين حقل amount في سلة المنتج عند إنشاء جلسات الدفع
  3. السماح للعملاء بالاختيار: إذا لم يتم تقديم أي مبلغ، يمكن للعملاء إدخال سعرهم الخاص (ضمن حدودك)
عند تمرير حقل amount في سلة المنتج، يتم استخدام هذا المبلغ للدفع. إذا قمت بإغفال حقل amount، يمكن للعملاء اختيار سعرهم الخاص أثناء الدفع (وفقًا لإعدادات الحد الأدنى/الأقصى الخاصة بك).

الخطوة 1: إنشاء منتج مع الدفع كما تريد

أولاً، قم بإنشاء منتج لمرة واحدة في لوحة تحكم Dodo Payments وتمكين تسعير الدفع كما تريد.
1

إنشاء منتج جديد

انتقل إلى المنتجات في لوحة تحكم Dodo Payments وانقر على إضافة منتج.
2

تكوين تفاصيل المنتج

املأ المعلومات المطلوبة للمنتج:
  • اسم المنتج: الاسم المعروض لمنتجك
  • وصف المنتج: وصف واضح لما يشتريه العملاء
  • صورة المنتج: قم بتحميل صورة (PNG/JPG/WebP، حتى 3 ميغابايت)
  • فئة الضريبة: اختر فئة الضريبة المناسبة
3

تحديد نوع التسعير

اختر نوع التسعير كـ دفع لمرة واحدة (دفع لمرة واحدة).
4

تمكين الدفع كما تريد

في قسم التسعير، قم بتمكين مفتاح الدفع كما تريد.
5

تحديد السعر الأدنى

أدخل السعر الأدنى الذي يجب على العملاء دفعه. هذا مطلوب ويضمن لك الحفاظ على حد أدنى للإيرادات.مثال: إذا كان الحد الأدنى لديك هو 5.00 دولارات، أدخل 5.00 (أو 500 سنتات).
6

تحديد السعر الأقصى (اختياري)

اختياريًا، حدد سعر أقصى لتحديد الحد الأقصى الذي يمكن للعملاء دفعه.
7

تحديد السعر المقترح (اختياري)

اختياريًا، أدخل سعر مقترح سيتم عرضه لتوجيه العملاء. يساعد ذلك في تحديد التوقعات ويمكن أن يحسن متوسط قيمة الطلب.
8

حفظ المنتج

انقر على إضافة منتج للحفظ. لاحظ معرف المنتج الخاص بك (مثل pdt_123abc456def) لاستخدامه في جلسات الدفع.
يمكنك العثور على معرف المنتج الخاص بك في لوحة التحكم تحت المنتجاتعرض التفاصيل، أو باستخدام API قائمة المنتجات.

الخطوة 2: إنشاء جلسات دفع مع تسعير ديناميكي

بمجرد تكوين منتجك مع الدفع كما تريد، يمكنك إنشاء جلسات دفع بمبالغ ديناميكية. يسمح حقل amount في سلة المنتج بتحديد السعر برمجيًا لكل جلسة دفع.

فهم حقل المبلغ

عند إنشاء جلسة دفع، يمكنك تضمين حقل amount في كل عنصر من عناصر سلة المنتج:
  • إذا تم تقديم amount: تستخدم جلسة الدفع هذا المبلغ بالضبط (يجب أن يكون ضمن حدودك الدنيا/العليا)
  • إذا تم إغفال amount: يمكن للعملاء إدخال سعرهم الخاص أثناء الدفع (ضمن حدودك)
حقل amount ينطبق فقط على منتجات الدفع كما تريد. بالنسبة للمنتجات العادية، يتم تجاهل هذا الحقل.

أمثلة على الكود

import DodoPayments from 'dodopayments';

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

async function createDynamicPricingCheckout(
  productId: string,
  amountInCents: number,
  returnUrl: string
) {
  try {
    const session = await client.checkoutSessions.create({
      product_cart: [
        {
          product_id: productId,
          quantity: 1,
          // Dynamic amount in cents (e.g., 1500 = $15.00)
          amount: amountInCents
        }
      ],
      return_url: returnUrl,
      // Optional: Pre-fill customer information
      customer: {
        email: '[email protected]',
        name: 'John Doe'
      },
      // Optional: Add metadata for tracking
      metadata: {
        order_id: 'order_123',
        pricing_tier: 'custom'
      }
    });

    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: Create checkout with $25.00 (2500 cents)
const session = await createDynamicPricingCheckout(
  'prod_123abc456def',
  2500, // $25.00 in cents
  'https://yoursite.com/checkout/success'
);

// Example: Create checkout with $10.00 (1000 cents)
const session2 = await createDynamicPricingCheckout(
  'prod_123abc456def',
  1000, // $10.00 in cents
  'https://yoursite.com/checkout/success'
);
تنسيق المبلغ: يجب أن يكون حقل amount في أدنى فئة من العملة. بالنسبة للدولار الأمريكي، يعني ذلك السنتات (مثل، 25.00 دولار = 2500). بالنسبة للعملات الأخرى، استخدم أصغر وحدة (مثل، بايسه للروبية الهندية).

الخطوة 3: السماح للعملاء باختيار سعرهم

إذا كنت تريد من العملاء اختيار سعرهم الخاص أثناء الدفع، ببساطة أغفل حقل amount من سلة المنتج. ستعرض صفحة الدفع حقل إدخال حيث يمكن للعملاء إدخال أي مبلغ ضمن حدودك الدنيا والعليا.
async function createCustomerChoiceCheckout(
  productId: string,
  returnUrl: string
) {
  try {
    const session = await client.checkoutSessions.create({
      product_cart: [
        {
          product_id: productId,
          quantity: 1
          // No amount field - customer will choose their price
        }
      ],
      return_url: returnUrl,
      customer: {
        email: '[email protected]',
        name: 'John Doe'
      }
    });

    return session;
  } catch (error) {
    console.error('Failed to create checkout session:', error);
    throw error;
  }
}

حالات الاستخدام الشائعة

حالة الاستخدام 1: تسعير متدرج بناءً على نوع المستخدم

قدم أسعارًا مختلفة لشرائح العملاء المختلفة باستخدام نفس المنتج:
// Student discount: $10.00
const studentSession = await createDynamicPricingCheckout(
  'prod_123abc456def',
  1000, // $10.00
  'https://yoursite.com/success'
);

// Regular price: $25.00
const regularSession = await createDynamicPricingCheckout(
  'prod_123abc456def',
  2500, // $25.00
  'https://yoursite.com/success'
);

// Premium price: $50.00
const premiumSession = await createDynamicPricingCheckout(
  'prod_123abc456def',
  5000, // $50.00
  'https://yoursite.com/success'
);

حالة الاستخدام 2: تسعير ديناميكي بناءً على الكمية

تعديل السعر بناءً على الكمية المشتراة:
async function createQuantityBasedCheckout(
  productId: string,
  quantity: number
) {
  // Base price: $20.00 per unit
  // Discount: 10% for 2+ items, 20% for 5+ items
  const basePrice = 2000; // $20.00 in cents
  let discount = 0;
  
  if (quantity >= 5) {
    discount = 0.20; // 20% off
  } else if (quantity >= 2) {
    discount = 0.10; // 10% off
  }
  
  const totalAmount = Math.round(basePrice * quantity * (1 - discount));
  
  const session = await client.checkoutSessions.create({
    product_cart: [
      {
        product_id: productId,
        quantity: quantity,
        amount: totalAmount
      }
    ],
    return_url: 'https://yoursite.com/success'
  });
  
  return session;
}

حالة الاستخدام 3: تسعير قائم على الوقت أو ترويجي

تطبيق تسعير ترويجي خلال فترات محددة:
async function createPromotionalCheckout(productId: string) {
  const isPromoActive = checkIfPromotionActive(); // Your logic
  const regularPrice = 3000; // $30.00
  const promoPrice = 2000; // $20.00
  
  const amount = isPromoActive ? promoPrice : regularPrice;
  
  const session = await client.checkoutSessions.create({
    product_cart: [
      {
        product_id: productId,
        quantity: 1,
        amount: amount
      }
    ],
    return_url: 'https://yoursite.com/success',
    metadata: {
      pricing_type: isPromoActive ? 'promotional' : 'regular'
    }
  });
  
  return session;
}

أفضل الممارسات

تحديد حدود معقولة

اختر سعرًا أدنى يغطي تكاليفك مع البقاء في متناول اليد. استخدم سعرًا مقترحًا لتوجيه توقعات العملاء.

التحقق من المبالغ

تحقق دائمًا من أن المبالغ الديناميكية تقع ضمن حدود الحد الأدنى والأقصى لمنتجك قبل إنشاء جلسات الدفع.

تتبع قرارات التسعير

استخدم البيانات الوصفية لتتبع سبب اختيار مبالغ معينة (مثل، pricing_tier، discount_code، user_segment).

التعامل مع الحالات الشاذة

تأكد من أن تطبيقك يتعامل مع الحالات التي تتجاوز فيها المبالغ الحدود القصوى أو تقل عن الحدود الدنيا بشكل سلس.

التحقق ومعالجة الأخطاء

تحقق دائمًا من المبالغ مقابل إعدادات الحد الأدنى والأقصى لمنتجك:
async function createValidatedCheckout(
  productId: string,
  amountInCents: number,
  minAmount: number,
  maxAmount: number | null
) {
  // Validate minimum
  if (amountInCents < minAmount) {
    throw new Error(
      `Amount ${amountInCents} is below minimum ${minAmount}`
    );
  }
  
  // Validate maximum (if set)
  if (maxAmount !== null && amountInCents > maxAmount) {
    throw new Error(
      `Amount ${amountInCents} exceeds maximum ${maxAmount}`
    );
  }
  
  // Create checkout session
  return await client.checkoutSessions.create({
    product_cart: [
      {
        product_id: productId,
        quantity: 1,
        amount: amountInCents
      }
    ],
    return_url: 'https://yoursite.com/success'
  });
}

مرجع API

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

إذا كان حقل amount يتم تجاهله، تحقق من:
  • أن المنتج لديه الدفع كما تريد مفعل في لوحة التحكم
  • أن المنتج هو دفع لمرة واحدة، وليس اشتراك
  • أن المبلغ في التنسيق الصحيح (أدنى فئة من العملة، مثل السنتات للدولار الأمريكي)
سيرفض API جلسات الدفع حيث ينتهك المبلغ حدود سعر منتجك. تحقق دائمًا من المبالغ قبل إنشاء جلسات الدفع، أو دع العملاء يختارون سعرهم من خلال إغفال حقل amount.
إذا لم ير العملاء حقل إدخال السعر، تأكد من أنك قد أغفلت حقل amount من سلة المنتج. عندما يتم تقديم amount، تستخدم جلسة الدفع هذا المبلغ بالضبط.