نظرة عامة على الفوترة
تعرّف على كيفية إدارة الاشتراكات والفوترة في تطبيقك.
ملاحظة: هذا محتوى تجريبي/مؤقت لأغراض العرض التوضيحي.
يدعم نظام الفوترة التسعير القائم على الاشتراكات مع مستويات متعددة ومزوّدي دفع متعددين.
المزوّدون المدعومون
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'],
},
];
دورة حياة الاشتراك
- يختار العميل الخطة - يختار المستخدم مستوى الاشتراك
- تتم معالجة الدفع - يتولّى المزوّد تحصيل الدفعة
- يُستلَم خطاف الويب - يتلقّى تطبيقك التأكيد
- يُفعَّل الاشتراك - يحصل المستخدم على إمكانية الوصول إلى الميزات
- الفوترة المتكرّرة - تجديد تلقائي في كل فترة
- الإلغاء - يمكن للمستخدم الإلغاء في أي وقت
إدارة الاشتراكات
إنشاء اشتراك
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
ستظهر جميع معاملات الاختبار في لوحة تحكم الاختبار لدى مزوّدك.