نظرة عامة على الفوترة

تعرّف على كيفية إدارة الاشتراكات والفوترة في تطبيقك.

ملاحظة: هذا محتوى تجريبي/مؤقت لأغراض العرض التوضيحي.

يدعم نظام الفوترة التسعير القائم على الاشتراكات مع مستويات متعددة ومزوّدي دفع متعددين.

المزوّدون المدعومون

Stripe

معالجة مدفوعات وفق معايير الصناعة مع ميزات شاملة:

  • مدفوعات بطاقات الائتمان
  • إدارة الاشتراكات
  • إنشاء الفواتير
  • حساب الضرائب
  • بوابة العملاء

Paddle

حلّ يعمل بصفته التاجر المسجَّل (Merchant of Record) ويتولّى ما يلي:

  • الامتثال الضريبي العالمي
  • معالجة المدفوعات
  • فوترة الاشتراكات
  • استرداد الإيرادات

مستويات الاشتراك

عرّف مستويات الاشتراك في إعدادات الفوترة:

export const plans = [
  {
    id: 'free',
    name: 'Free',
    price: 0,
    features: ['Feature 1', 'Feature 2'],
  },
  {
    id: 'pro',
    name: 'Professional',
    price: 29,
    interval: 'month',
    features: ['All Free features', 'Feature 3', 'Feature 4'],
  },
  {
    id: 'enterprise',
    name: 'Enterprise',
    price: 99,
    interval: 'month',
    features: ['All Pro features', 'Feature 5', 'Priority support'],
  },
];

دورة حياة الاشتراك

  1. يختار العميل الخطة - يختار المستخدم مستوى الاشتراك
  2. تتم معالجة الدفع - يتولّى المزوّد تحصيل الدفعة
  3. يُستلَم خطاف الويب - يتلقّى تطبيقك التأكيد
  4. يُفعَّل الاشتراك - يحصل المستخدم على إمكانية الوصول إلى الميزات
  5. الفوترة المتكرّرة - تجديد تلقائي في كل فترة
  6. الإلغاء - يمكن للمستخدم الإلغاء في أي وقت

إدارة الاشتراكات

إنشاء اشتراك

import { createCheckoutSession } from '~/lib/billing/checkout';

const session = await createCheckoutSession({
  accountId: user.accountId,
  planId: 'pro',
  returnUrl: '/dashboard',
});

// Redirect user to payment page
redirect(session.url);

التحقق من حالة الاشتراك

import { getSubscription } from '~/lib/billing/subscription';

const subscription = await getSubscription(accountId);

if (subscription.status === 'active') {
  // User has active subscription
}

إلغاء اشتراك

import { cancelSubscription } from '~/lib/billing/subscription';

await cancelSubscription(subscriptionId);

التعامل مع خطافات الويب

تُخطِر خطافات الويب تطبيقك بأحداث الفوترة:

export async function POST(request: Request) {
  const signature = request.headers.get('stripe-signature');
  const payload = await request.text();

  const event = stripe.webhooks.constructEvent(
    payload,
    signature,
    process.env.STRIPE_WEBHOOK_SECRET
  );

  switch (event.type) {
    case 'customer.subscription.created':
      await handleSubscriptionCreated(event.data.object);
      break;
    case 'customer.subscription.updated':
      await handleSubscriptionUpdated(event.data.object);
      break;
    case 'customer.subscription.deleted':
      await handleSubscriptionCanceled(event.data.object);
      break;
  }

  return new Response('OK');
}

الاختبار

استخدم بيانات اعتماد وضع الاختبار أثناء التطوير:

  • بطاقة الاختبار: 4242 4242 4242 4242
  • أي تاريخ انتهاء صلاحية في المستقبل
  • أي رمز CVC

ستظهر جميع معاملات الاختبار في لوحة تحكم الاختبار لدى مزوّدك.