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

كيف يعمل

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

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

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

Create a new product

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

Configure product details

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

Set pricing type

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

Enable Pay What You Want

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

Set minimum price

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

Set maximum price (optional)

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

Set suggested price (optional)

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

Save the product

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

الخطوة 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: 'customer@example.com',
        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). بالنسبة للعملات الأخرى، استخدم أصغر وحدة (مثل البايس للهند rupيا الهندية).

الخطوة 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: 'customer@example.com',
        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;
}

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

Set Reasonable Bounds

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

Validate Amounts

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

Track Pricing Decisions

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

Handle Edge Cases

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

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

تحقق دائمًا من المبالغ مقابل إعدادات الحد الأدنى والأقصى لمنتجك:
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، يستخدم الدفع ذلك المبلغ بالضبط.