ابدأ بتثبيت محلي، واربط المدفوعات والخدمات الخارجية، وانشر على بنيتك التحتية، وحافظ على تحديث المنصة. تتضمن أدلة المبتدئين النقرات على لوحة تحكم كل مزوّد، وليس متغيرات البيئة فقط.
27 دليلًا6 مساراتAR المصدر
ابدأ من هناقراءة 8 دقائق
نظرة عامة على المنصة
FastRestful منصة منتجات API موجهة للإنتاج. تجمع سوقًا عامًا وإصدارات API مُصدّرة وبوابة محدودة الاستخدام واشتراكات وفوترة ووثائق ووحدة تحكم للمستهلك واستوديو للمورّد ومستوى تحكم للموظفين في نظام واحد مبني على Django + الواجهة الأمامية.
FastRestful ليس API واحدة. إنه البنية التحتية للمنتجات حول واجهات API: واجهة المتجر، وحدود العقد، ومسار الطلب، والمال، والمحتوى، والعمليات. يمكن لفريق تشغيل API واحدة أو سوق متعدد المورّدين من التثبيت نفسه.
الواجهة
من يستخدمها
ما تملكه
الموقع العام
الزوار والمشترون
السوق وصفحات تفاصيل API والوثائق والأسعار والمدونة والحالة وملفات المورّدين والصفحات القانونية.
المنتجات والإصدارات ونقاط النهاية والخطط والمستهلكون وتحقيق الدخل والدفعات والبوابة والدعم.
مستوى تحكم الموظفين
مشغلو المنصة
حركة المرور والمورّدون والفوترة والدفعات والدعم والإشراف و CMS والإعلانات واللغات والتدقيق.
أوضاع المورّد الواحد وتعدد المورّدين
تبدأ المنصة في وضع المورّد الواحد. لا يمكن إلا للمؤسسة المحددة كمورّد المنصة نشر واجهات API عامة. يمكن للمستخدم الخارق تفعيل وضع تعدد المورّدين في إعدادات الموقع، وبعد ذلك يمكن لأي مؤسسة لديها ملف مورّد معتمد أن تنشر.
مورّد واحد: نشاط API واحد منسق، ومورّد منصة واحد، وحوكمة أبسط.
تعدد المورّدين: سوق على نمط RapidAPI حيث يدرج المورّدون المستقلون واجهات API الخاصة بهم ويسعّرونها ويدعمونها.
يُفرض التبديل على مستوى النموذج، لذا تتوافق API والإدارة واستوديو المورّد.
تبقى تهيئة المورّدين ومراجعة الملفات وفصل المهام نشطة في الوضعين.
تثبيت أول كامل لمن لم يشغّل تطبيق Django أو Node من قبل. اتبع الخطوات بالترتيب. تنتهي كل خطوة بفحص تعرف به أنها نجحت قبل المتابعة.
قبل أن تبدأ
لا تحتاج إلى Docker أو Redis أو التخزين السحابي أو حساب دفع للعرض التوضيحي المحلي. يحافظ SQLite والتخزين المؤقت في الذاكرة على بساطة التشغيل الأول.
تحتاج إلى
السبب
كيف تتحقق
Python 3.11
يشغّل الواجهة الخلفية Django.
python3.11 --version
Node.js 22.13+
يشغّل الواجهة الأمامية وأدوات البناء.
node --version
Git
ينزّل الشيفرة المصدرية.
git --version
نافذتان طرفيتان
واحدة تشغّل الواجهة الخلفية والأخرى تشغّل الواجهة الأمامية.
افتح Terminal مرتين.
أبقِ كلا الخادمين قيد التشغيل. الخلفية والواجهة الأمامية عمليتان منفصلتان. إغلاق الطرفية يوقف تلك العملية. استخدم Ctrl+C في طرفية لإيقاف الخادم عند الانتهاء.
1. تحقق من أدواتك
نفّذ هذه الأوامر في الطرفية. إذا كان أحدها مفقودًا، فثبّته أولًا وأعد فتح الطرفية.
يجب أن ترى Python 3.11 وNode 22.13 أو أحدث وإصدار npm. إذا لم يُعثر على python3.11، فثبّت Python 3.11 من python.org. إذا كان Node أقدم من 22.13، فثبّت إصدار LTS الحالي من nodejs.org.
Windows: استخدم py -3.11 حيثما يذكر هذا الدليل python3.11، ونشّط البيئة باستخدام .venv\Scripts\Activate.ps1.
2. نزّل الشيفرة
shell
git clone <your-fastrestful-repository> fastrestful
cd fastrestful
npm ci
يثبّت npm ci إصدارات تبعيات الواجهة الأمامية الدقيقة من ملف القفل. قد يستغرق بضع دقائق. يجب أن ينتهي بمجلد node_modules دون رسالة خطأ.
3. أنشئ بيئة الواجهة الخلفية
تحافظ البيئة الافتراضية على حزم Python الخاصة بـ FastRestful منفصلة عن بقية حاسوبك.
في Windows PowerShell، فعّل باستخدام .venv\Scripts\Activate.ps1 بدلًا من source .venv/bin/activate. عندما تكون البيئة نشطة، يبدأ موجّه الأوامر عادةً بـ (.venv).
نقطة التحقق: شغّل python3.11 -m django --version. ينبغي أن يطبع إصدار Django 5.x. إذا فشل، فالبيئة الافتراضية غير نشطة أو لم يكتمل التثبيت.
4. أنشئ ملف إعداد الواجهة الخلفية
انسخ ملف المثال، ثم أنشئ سرّين والصقهما في backend/.env.
لا تُدرج .env أبدًا في المستودع. يحتوي على أسرار. يتجاهله المستودع بالفعل. إذا غيّرت منفذ الواجهة الأمامية لاحقًا، فحدّث FRONTEND_URL, CORS_ALLOWED_ORIGINS، و CSRF_TRUSTED_ORIGINS ليتطابقا.
5. أنشئ قاعدة البيانات وبيانات العرض
تأكد من أن البيئة الافتراضية لا تزال نشطة وأنك داخل backend/.
ينشئ migrate جداول قاعدة البيانات. تنشئ أوامر التهيئة سوقًا تجريبيًا ومنتجات API ومحتوى وثائق وملفات مجتمعية. يؤدي هذا إلى إنشاء ملف backend/db.sqlite3 محلي.
بيانات اعتماد محلية فقط.seed_demo ينشئ مستخدمًا خارقًا admin / Admin12345!. تنشئ بذور التفاعل ملفات بنّائين بكلمة مرور Demo12345!. لا تُعد استخدام بيانات الاعتماد هذه في الإنتاج أبدًا.
6. ابدأ الواجهة الخلفية
الطرفية 1
# inside backend/, with the virtual environment active
python3.11 manage.py runserver 127.0.0.1:5056
اترك هذه الطرفية مفتوحة. تكون الواجهة الخلفية جاهزة عندما تطبع Starting development server at http://127.0.0.1:5056/. تحقق منها في طرفية أخرى باستخدام:
تحقق من الواجهة الخلفية
curl http://127.0.0.1:5056/api/health/live
7. ابدأ الواجهة الأمامية
افتح الطرفية الثانية وعد إلى جذر المستودع. يجب أن تظل الواجهة الخلفية قيد التشغيل في الطرفية 1.
الطرفية 2
cd /path/to/fastrestful
npm run dev -- --port 5055 --host 127.0.0.1
يمرر خادم تطوير Vite مسارات Django (/api/v1، /api/health، /api/schema، /api/docs، /admin، /static، /media) إلى الواجهة الخلفية على المنفذ 5056. لا تزال صفحات المنتجات العامة مثل /api/{slug} تُقدَّم من الواجهة الأمامية.
8. افتح التطبيق وسجّل الدخول
افتح هذه العناوين في متصفحك:
الصفحة
العنوان
ما هي
الموقع العام
http://127.0.0.1:5055
السوق وموقع التسويق.
مستوى التحكم
http://127.0.0.1:5055/admin/
إدارة Django وعمليات FastRestful.
وثائق API
http://127.0.0.1:5056/api/docs/
واجهة Swagger UI لواجهة API الخاصة بالمنصة.
فحص السلامة
http://127.0.0.1:5056/api/health/ready
الجاهزية لفحوص النشر.
سجّل الدخول إلى مستوى التحكم باستخدام admin / Admin12345!.
قائمة التحقق للتشغيل الأول
يُحمَّل الموقع العام ويظهر كتالوج السوق.
يفتح مستوى التحكم ويمكنك تسجيل الدخول باسم admin.
تُفتح إعدادات الموقع وخطط المنصة وقسم محتوى الموقع دون أخطاء.
ثبّت Python 3.11، وأعد فتح الطرفية، ثم نفّذ الفحص مجددًا.
يفشل npm ci بخطأ محرك
Node.js أقدم من 22.13.
ثبّت Node 22.13+ ونفّذ npm ci مجددًا.
ModuleNotFoundError: django
البيئة الافتراضية غير نشطة.
نفّذ source .venv/bin/activate داخل backend/.
خطأ FIELD_ENCRYPTION_KEY
المفتاح مفقود أو لم يُلصق بشكل صحيح.
أنشئ مفتاح Fernet جديدًا والصق القيمة الكاملة دون علامات اقتباس.
المنفذ 5055 أو 5056 مستخدم بالفعل
عملية أخرى تستخدم المنفذ.
أوقف العملية الأخرى، أو اختر منافذ جديدة وحدّث FRONTEND_URL وقيم CORS و CSRF.
تُحمَّل الصفحة لكن تفشل استدعاءات API
الواجهة الخلفية لا تعمل.
ابدأ الطرفية 1 باستخدام runserver وتأكد من عنوان فحص السلامة.
يُرفض تسجيل دخول المسؤول
لم تُنفّذ تهيئة العرض التوضيحي أو أن قاعدة بيانات أخرى قيد الاستخدام.
نفّذ seed_demo، أو أنشئ حسابك باستخدام python3.11 manage.py createsuperuser.
إعادة تعيين محلية. إذا أردت البدء من جديد على جهازك المحلي فقط، فأوقف الخلفية، واحذف backend/db.sqlite3، ثم أعد تشغيل migrate وأوامر البذور. لا تحذف قاعدة بيانات الإنتاج أبدًا.
ابدأ من هناقراءة 8 دقائق
البدء السريع: أول طلب عبر البوابة
انتقل من تثبيت محلي نظيف إلى استدعاء API محدود الاستخدام. ستشترك في API تجريبية، وتنشئ مفتاحًا، وترسل طلبًا، وترى حدث الاستخدام وسجل الطلب.
قبل أن تبدأ: أكمل التثبيت وأبقِ الطرفيتين قيد التشغيل. يجب أن تكون الخلفية على 127.0.0.1:5056 والواجهة الأمامية على 127.0.0.1:5055.
1. سجّل الدخول واختر مساحة عمل
افتح http://127.0.0.1:5055 وسجّل الدخول باستخدام admin / Admin12345!، أو أنشئ حسابًا جديدًا. تجمع مساحة العمل (المؤسسة) تطبيقاتك ومفاتيحك واشتراكاتك وفواتيرك.
تنتقل مساحة العمل النشطة في ترويسة X-Organization لاستدعاءات API. تضبطها وحدة تحكم المتصفح تلقائيًا. عند استدعاء API بنفسك، يجب تضمينها ما لم يستخدم الطلب مفتاح API بدلًا من جلسة المتصفح.
2. اشترك في منتج
افتح السوق، واختر منتجًا له إصدار مباشر، وحدد خطة. لمنتج SignalStack المهيأ إصدار مباشر 2.4.0 وثلاث خطط.
إذا كانت الخطة مجانية، فالتفعيل فوري. إذا كانت مدفوعة، يفتح FastRestful مزوّد الدفع المُعد. إعادة توجيه المتصفح لا تمنح الوصول بحد ذاتها: لا يُفعّل الاشتراك إلا بعد أن يسوّي webhook مزوّد موقّع الفاتورة الأولى.
لا يوجد مزوّد دفع بعد؟ استخدم خطة مجانية لطلبك الأول. لبيع خطط مدفوعة، اتبع بوابات الدفع خطوة بخطوة أولًا.
3. أنشئ تطبيقًا ومفتاحًا
في وحدة تحكم المستهلك، أنشئ تطبيقًا ثم أصدر مفتاح API. يُعرض المفتاح الخام مرة واحدة، لذا انسخه فورًا إلى مدير كلمات المرور أو ملف .env محلي.
شكل المفتاح الخام
fr_live_<random-secret>
# Store it in a secret manager or local .env file.
# Never commit it to a repository or paste it into a public issue.
النطاقات هي full أو execute أو read. اختر أضيق نطاق يكفي. إذا فقدت المفتاح، فأبطله وأصدر مفتاحًا جديدًا؛ يتوقف المفتاح القديم عن العمل فورًا.
4. أرسل طلبًا عبر البوابة
استبدل fr_live_… بالمفتاح الذي أنشأته للتو. يستخدم هذا المثال منتج SignalStack المهيأ واسم المسار البديل الخاص به.
مع تفعيل توجيه مضيف المنتج، يستخدم الطلب نفسه https://{product-slug}.{FASTRESTFUL_API_HOST_SUFFIX}/.... تشترك كلتا الواجهتين في المسار نفسه للاشتراك والحصة وحد المعدل وidempotency والقياس وسجل الطلبات.
تحتفظ صفحة API العامة بالمختبر وعقد endpoint وسياق الطلب في علامة تبويب واحدة.
5. افحص النتيجة
حدث الاستخدام: يُسجَّل من جانب الخادم مع الحالة وزمن الاستجابة.
العداد الشهري: يزداد لفرض الحصة والتجاوز.
سجل الطلبات: معاينات طلب واستجابة منقّحة مرئية للمستهلك والمورّد.
لوحة التحكم: الطلبات ومعدل النجاح والإنفاق وزمن الاستجابة وأفضل واجهات API والنشاط الأخير.
افتح لوحة تحكم المستهلك وسجل الطلبات. يجب أن ترى الطلب الذي أرسلته للتو. إذا لم تراه، فافحص الطرفية التي تشغّل الواجهة الخلفية بحثًا عن traceback.
6. انشر إصدارًا (اختياري)
في استوديو المورّد، افتح منصة عمل المنتج، واستورد عقد OpenAPI إلى إصدار مسودة، وطابق وثائق endpoint، وشغّل الفرق، وقدّم للمراجعة، ثم رقِّ. يتطلب الإصدار المباشر عقد OpenAPI مدعومًا وغير فارغ وكتالوج endpoint مطابقًا تمامًا.
انسخ المفتاح الكامل مجددًا. لا تُضمّن علامات اقتباس أو مسافة زائدة.
403
الاشتراك غير نشط أو نطاق المفتاح ضيق جدًا.
تأكد من أن الخطة نشطة وأن المفتاح لديه نطاق execute أو full.
404
لا تتطابق الطريقة والمسار مع الإصدار المباشر.
افحص endpoint في صفحة API وتأكد من أن الإصدار مباشر.
429
تم تجاوز حصة الخطة أو حد المعدل.
اقرأ retry_after وانتظر، أو استخدم خطة أكبر.
خطأ CORS أو CSRF في المتصفح
أصل المتصفح غير موثوق.
أضف أصل الواجهة الأمامية إلى CORS_ALLOWED_ORIGINS وCSRF_TRUSTED_ORIGINS. استدعاءات البوابة التي تستخدم X-API-Key لا تستخدم ملفات تعريف ارتباط المتصفح.
ابدأ من هناقراءة 14 دقيقة
الإعداد دون إرهاق
تحتاج معظم عمليات التثبيت إلى مجموعة صغيرة من الإعدادات للتشغيل. ابدأ بالحد الأدنى أدناه، ثم أضف التكاملات التي تستخدمها فعلًا. الجداول الطويلة أدناه مرجعية، وليست قائمة تحقق.
أين توجد الإعدادات
المكان
استخدمه لـ
متى يُطبَّق
backend/.env
الأسرار وقاعدة البيانات وRedis ومفاتيح الدفع وSSO والتخزين.
أعد تشغيل الواجهة الخلفية بعد تغييره.
الإدارة → بوابات الدفع
بيانات اعتماد الدفع والدفعات.
يتجاوز قيم .env المطابقة حقلًا بحقل. دون إعادة تشغيل.
الإدارة → النشرة البريدية → إعدادات البريد
مزوّد البريد للحملات وهوية المرسل.
يتجاوز مرسل البيئة للحملات.
الإدارة → إعدادات الموقع
الهوية البصرية والتنقل وتوجيه المضيف ووضع الصيانة وسلوك الموقع.
يُطبَّق فورًا ما لم يكن الإعداد مخزنًا مؤقتًا أو مدمجًا في الواجهة الأمامية.
متغيرات بناء الواجهة الأمامية
قيم NEXT_PUBLIC_* مثل عنوان API العام.
تُدمج وقت البناء. أعد بناء الواجهة الأمامية بعد تغييرها.
الحد الأدنى للإعدادات المحلية
بعد نسخ .env.example، هذه هي القيم الوحيدة التي يجب تغييرها للعرض المحلي:
لا تستخدم SQLite في الإنتاج. عندما DJANGO_DEBUG=False، يتطلب FastRestful PostgreSQL وعنوان URL مشتركًا لـ Redis. راجع النشر لمعرفة التسلسل الكامل.
كيف تغيّر الإعدادات بأمان
غيّر تكاملًا واحدًا في كل مرة.
اضبط واختبر وتحقق قبل الانتقال إلى المزوّد التالي. هذا يجعل الأعطال واضحة.
حرّر backend/.env على الخادم.
لا تحرّر ملفات داخل حاوية قيد التشغيل ستُستبدل. احتفظ بالأسرار في مخزن أسرار منصة النشر عندما يكون ذلك ممكنًا.
أعد تشغيل الواجهة الخلفية والعمال.
تُقرأ تغييرات البيئة عند بدء العملية. أعد تشغيل Gunicorn وعامل Celery وCelery beat بعد تحرير .env.
أعد بناء الواجهة الأمامية لتغييرات NEXT_PUBLIC_*.
تُجمَّع القيم العامة للواجهة الأمامية في البناء. إعادة تشغيل الواجهة الأمامية لا تكفي.
شغّل إجراء الاختبار الخاص بالمزوّد.
استخدم عملية الدفع التجريبية أو البريد التجريبي أو سجل تسليم webhook قبل إرسال حركة مباشرة.
مرجع البيئة الأساسي
المتغير
الافتراضي
الغرض
DJANGO_SECRET_KEY
مفتاح للتطوير فقط
يجب أن يكون 50 حرفًا أو أكثر في الإنتاج.
DJANGO_DEBUG
True
عيّن False في الإنتاج. يفعّل سلوك ملفات تعريف الارتباط الآمنة وHSTS وHTTPS.
DJANGO_ALLOWED_HOSTS
localhost,127.0.0.1,testserver
أسماء مضيفين مفصولة بفواصل. ضمّن مضيفي API البدلاء عند استخدام نطاقات فرعية للمنتجات.
DATABASE_URL
sqlite:///db.sqlite3
SQLite محليًا؛ PostgreSQL في الإنتاج. يفشل الإنتاج دون PostgreSQL.
REDIS_URL
فارغ
التخزين المؤقت المشترك ووسيط Celery الافتراضي. مطلوب في الإنتاج.
CELERY_BROKER_URL
REDIS_URL
عنوان URL اختياري لوسيط منفصل.
FRONTEND_URL
http://localhost:5055
أصل الواجهة الأمامية العام وقاعدة عودة الدفع واحتياطي التتبع. يجب أن يكون HTTPS في الإنتاج.
FRONTEND_PREVIEW_URL
FRONTEND_URL
عنوان URL الأساسي المستخدم لمعاينات الأصول المخصصة في الإدارة.
FIELD_ENCRYPTION_KEY
فارغ
مفتاح Fernet لمفاتيح API المشفرة وأسرار المزوّدين. مطلوب في الإنتاج.
CORS_ALLOWED_ORIGINS
محلي 3000/5055/5173
أصول متصفح مفصولة بفواصل مسموح لها باستدعاء API.
CSRF_TRUSTED_ORIGINS
يطابق CORS
أصول متصفح موثوقة ببيانات اعتماد للطلبات التي تغيّر الحالة.
SECURE_REFERRER_POLICY
strict-origin-when-cross-origin
ترويسة سياسة المُحيل.
بيئة الواجهة الأمامية
المتغير
الغرض
NEXT_PUBLIC_API_URL
أصل API الخاص بـ Django للنشر المنفصل. اتركه فارغًا لمسارات الأصل نفسه.
NEXT_PUBLIC_SITE_URL
أصل الواجهة الأمامية العام الأساسي للبيانات الوصفية وsitemap وrobots وعناوين Open Graph.
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
مفتاح Stripe القابل للنشر لواجهة البطاقة المدمجة. يُحمَّل Stripe.js من CDN؛ دون اعتماد npm.
FASTRESTFUL_DEV_BACKEND_URL
هدف وكيل تطوير اختياري. الافتراضي http://127.0.0.1:5056.
FASTRESTFUL_ADMIN_ORIGINS
أصول الإدارة المسموح بها لمعاينات iframe للأصول المخصصة.
البوابة وتوجيه المضيف
المتغير
الافتراضي
الغرض
GATEWAY_TIMEOUT_SECONDS
15
مهلة طلب المنبع.
GATEWAY_MAX_BODY_BYTES
262144
الحد الأقصى لحجم النص الوارد.
GATEWAY_MAX_UPLOAD_BYTES
5242880
الحد الأقصى لرفع multipart المدمج.
GATEWAY_MAX_RETRIES
1
ميزانية إعادة المحاولة للأعطال العابرة الآمنة.
GATEWAY_RETRY_BACKOFF_SECONDS
0.05
التأخير بين المحاولات.
GATEWAY_IDEMPOTENCY_TTL_SECONDS
86400
مدة ذاكرة إعادة التشغيل المؤقتة.
GATEWAY_CIRCUIT_FAILURE_THRESHOLD
3
الأعطال قبل فتح الدائرة.
GATEWAY_CIRCUIT_WINDOW_SECONDS
60
نافذة عدّ الأعطال.
GATEWAY_CIRCUIT_COOLDOWN_SECONDS
30
مدة تبريد الدائرة المفتوحة.
GATEWAY_TRUSTED_PROXY_CIDRS
فارغ
الوكلاء الموثوقون المسموح لهم بتقديم ترويسات IP العميل.
GATEWAY_MEDIA_PREVIEW_BYTES
1500000
الحد الأقصى لمعاينة الوسائط base64 الملتقطة لوحدة التحكم.
FASTRESTFUL_API_HOST_SUFFIX
فارغ
يفعّل التوجيه المباشر {product}.{suffix}. يبقي الفراغ اسم المسار البديل فقط.
المصادقة و SSO
المتغير
الغرض
SSO_ISSUER
عنوان URL لمُصدر OIDC. إلغاء التعيين يخفي زر OIDC.
SSO_CLIENT_ID / SSO_CLIENT_SECRET
بيانات اعتماد عميل OIDC.
SSO_SAML_ENABLED
فعّل نقاط نهاية SAML 2.0 SP. يتطلب lxml.
SSO_SAML_ENTITY_ID
معرّف كيان مزوّد خدمة SAML. الافتراضي fastrestful.
SSO_SAML_SSO_URL
عنوان URL لـ SSO الخاص بمزوّد الهوية.
SSO_SAML_IDP_CERT
شهادة X.509 PEM لمزوّد الهوية.
SSO_SAML_AUDIENCE
تقييد جمهور اختياري.
ORGANIZATION_INVITE_DAYS
مدة الدعوة بالأيام. الافتراضي 7.
البريد الإلكتروني والنشرة البريدية
المتغير
الغرض
EMAIL_BACKEND
خلفية وحدة التحكم في وضع التصحيح؛ خلفية SMTP في الإنتاج افتراضيًا.
EMAIL_HOST / EMAIL_PORT
مضيف ومنفذ SMTP.
EMAIL_HOST_USER / EMAIL_HOST_PASSWORD
بيانات اعتماد SMTP.
EMAIL_USE_TLS
فعّل STARTTLS. الافتراضي true.
ALERT_FROM_EMAIL
المرسل الافتراضي وهوية التنبيهات.
NEWSLETTER_TRACKING_BASE_URL
الأصل العام لبكسلات التتبع وإعادة توجيه النقرات وروابط إلغاء الاشتراك. يعود إلى FRONTEND_URL.
يمكن أيضًا تخزين إعدادات SMTP للنشرة البريدية في استوديو النشرة البريدية وتتجاوز مرسل البيئة للحملات. راجع استوديو النشرة البريدية.
مرجع المدفوعات والدفعات
تبحث عن تعليمات الإعداد؟ المتغيرات أدناه مرجع فقط. للحصول على خطوات لوحة تحكم المزوّد خطوة بخطوة، وأحداث webhook، والتحقق من webhook الخاص بـ PayPal، وعمليات الدفع التجريبية، استخدم بوابات الدفع خطوة بخطوة.
PAYOUT_PROVIDER قائمة سماح اختيارية مفصولة بفواصل: stripe، paypal
يخزّن الإدارة → بوابات الدفع بيانات الاعتماد نفسها في قاعدة البيانات. يتجاوز سجل قاعدة البيانات حقل البيئة حقلًا بحقل، ويؤدي تعطيله إلى إيقاف المزوّد في كل مكان حتى لو بقيت مفاتيح البيئة مضبوطة.
تخزين الوسائط والمواصفات
المتغير
الغرض
MEDIA_STORAGE
local أو s3.
MEDIA_S3_BUCKET / MEDIA_S3_REGION
حزمة S3 والمنطقة.
MEDIA_S3_ENDPOINT_URL
endpoint مخصص متوافق مع S3.
MEDIA_S3_ACL
ACL مباشر لـ S3 اختياري. اتركه فارغًا عند استخدام CloudFront مع OAC.
MEDIA_CDN_DOMAIN
نطاق CloudFront أو CDN آخر.
MEDIA_CDN_DISTRIBUTION_ID
يفعّل إجراءات الإبطال لكل أصل.
SPEC_STORAGE
db أو s3 لكتل عقد OpenAPI.
SPEC_S3_BUCKET / SPEC_S3_PREFIX / SPEC_S3_REGION
وجهة كتلة المواصفات وبادئتها. يحتاج وضع S3 إلى boto3.
الروابط القصيرة
يعيّن SHORTLINK_BASE_URL أصل الرابط القصير العام، على سبيل المثال https://go.example.com. عند الفراغ يعود إلى NEWSLETTER_TRACKING_BASE_URL، ثم FRONTEND_URL. يمكن جدولة الأمر checklinks من cron أو Celery beat.
الأولوية وإعادة التحميل
توفر قيم البيئة افتراضيات النشر؛ وتتجاوز سجلات بوابة الإدارة القيم حقلًا بحقل.
تتطلب تغييرات بيئة الواجهة الخلفية إعادة تشغيل العملية. تُمسح بعض الإعدادات المخزنة مؤقتًا (علامة الصيانة، لغة المصدر) تلقائيًا عند حفظ النموذج.
تُدمج المتغيرات العامة للواجهة الأمامية وقت البناء. أعد البناء بعد تغيير قيم NEXT_PUBLIC_*.
بعد تغيير lib/i18n/*.json، نفّذ npm run export:i18n وأعد تشغيل الواجهة الخلفية حتى تكون حزمة المصدر المخزنة مؤقتًا حديثة.
النشر والتشغيلقراءة 16 دقيقة
النشر
انقل FastRestful من عرض SQLite محلي إلى نشر إنتاجي باستخدام PostgreSQL وRedis وتخزين كائنات وخادم WSGI وTLS وواجهة أمامية ثابتة. صُممت المنصة لتُستضاف ذاتيًا.
يمكنك تقديم الواجهة الأمامية وAPI من أصل واحد أو فصلهما. إذا فصلتهما، فعيّن NEXT_PUBLIC_API_URL إلى أصل API، وأضف أصل الواجهة الأمامية إلى CORS_ALLOWED_ORIGINS وCSRF_TRUSTED_ORIGINS، وعيّن FRONTEND_URL إلى أصل الواجهة الأمامية العام.
Docker Compose
يتضمن المستودع ملف Compose مع PostgreSQL وAPI وRedis وملفات تعريف اختيارية للعامل وbeat.
يشغّل Compose حزمة الواجهة الخلفية، لا الواجهة الأمامية. ابنِ الواجهة الأمامية بشكل منفصل واستضفها على مضيفك الثابت أو CDN، أو أضف خدمة واجهة أمامية إلى ملف Compose الخاص بك. تشغّل حاوية API الترحيلات وGunicorn على المنفذ 8000.
server {
listen 443 ssl http2;
server_name *.api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host; # product slug comes from this host
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
أضف سجل DNS بدلًا، وأصدر شهادة بدلًا بتحدٍ DNS-01، وضمّن المضيف البدل في DJANGO_ALLOWED_HOSTS. عيّن FASTRESTFUL_API_HOST_SUFFIX=api.example.com.
بناء الواجهة الأمامية واستضافتها
shell
export NEXT_PUBLIC_API_URL="https://api.example.com"
export NEXT_PUBLIC_SITE_URL="https://app.example.com"
export NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_live_..."
npm run build
انشر ناتج البناء على مضيفك الثابت أو بيئة تشغيل متوافقة مع Node. البناء مكتفٍ بذاته ولا يتطلب مستوى تحكم موقع مُدار. إذا استخدمت Cloudflare، فاربط D1/Images فقط عندما يحتاج النشر إلى تلك الميزات.
الملفات الثابتة والوسائط
الثابت: نفّذ collectstatic، وقدّم /static/ من Nginx أو CDN.
الوسائط المحلية: قدّم /media/ من Nginx للنشرات الصغيرة.
وسائط الإنتاج: استخدم S3 + CloudFront مع OAC، وأبقِ الحزمة خاصة، وعيّن MEDIA_STORAGE=s3، ولا تعيّن MEDIA_S3_ACL إلا عند التقديم مباشرة من S3.
المواصفات: اترك SPEC_STORAGE=db لتثبيت صغير؛ استخدم S3 لأرشيفات العقود الأكبر.
فحوص السلامة
الفحص
المتوقع
GET /api/health/live
حيوية العملية. دون اعتماد على قاعدة البيانات.
GET /api/health/ready
جاهزية قاعدة البيانات والتخزين المؤقت المشترك. يعيد 503 مع التبعية الفاشلة.
GET /api/schema/
مخطط OpenAPI. مفيد لفحوص دخان النشر.
الترقيات والنسخ الاحتياطي
تسلسل ترقية آمن
# 1. Back up PostgreSQL and media
pg_dump --format=custom "$DATABASE_URL" > fastrestful-$(date +%F).dump
# 2. Pull code and install dependencies
git pull --ff-only
pip install -r backend/requirements.txt
npm ci
# 3. Apply migrations and rebuild assets
python3.11 backend/manage.py migrate
npm run build
# 4. Restart API and workers
sudo systemctl restart fastrestful
sudo systemctl restart fastrestful-worker fastrestful-beat
# 5. Verify
curl -f https://api.example.com/api/health/ready
بوابات الإنتاج
DJANGO_DEBUG=False، سر بطول 50+ حرفًا، مفتاح Fernet صالح.
إزالة حسابات العرض التجريبي والبيانات الأولية من الإنتاج.
التحقق بخطوتين إلزامي للموظفين؛ وSSO مُختبر من البداية إلى النهاية.
التحقق من webhooks الدفع باستخدام السر الموقّع الخاص بالمزوّد.
حاوية الوسائط خاصة؛ وCDN OAC مهيأ؛ ولا وصول كتابة شامل.
النسخ الاحتياطية مشفرة ومُختبرة الاستعادة.
تستبعد السجلات الأسرار وتُخفي حمولات المستهلك.
تصحيح صور التبعيات والحاويات وفق جدول منتظم.
نشر جهة اتصال الحوادث ومسار الإفصاح عن الثغرات.
النشر والتشغيلقراءة 16 دقيقة
الترخيص والتحديثات الرسمية
FastRestful شفرة مصدرية مرخّصة تُباع عبر Dakidarts. اربط مفتاح الشراء بـ LicenseHub للتحقق من الإصدارات الرسمية الموقّعة، أو تثبيت إصدار أحدث، أو الرجوع إلى إصدار أقدم. تظل البوابة قيد التشغيل تعمل إذا تعذّر الوصول إلى LicenseHub مؤقتًا.
ما يفعله مركز التحديثات
المهمة
أين
ربط ترخيص الشراء وعرض تواريخ الاستحقاق
Admin → التحديثات البرمجية (/admin/updates/)
فحص الإصدارات وتنزيلها والتحقق منها وتثبيتها
الصفحة نفسها، أو الأمر fastrestful_update
تجديد إجازة الترخيص وفق جدول منتظم
python3.11 manage.py license_heartbeat
عرض سجل التحديثات وسجلات المثبّت
نشاط التنزيل والتثبيت في صفحة التحديث
عرض حالة الترخيص في نظرة عامة على العمليات
Admin → نظرة عامة على العمليات
قبل التحديث: خذ نسخة احتياطية من قاعدة البيانات والوسائط. يأخذ محدّث النظام لقطة من المصدر وSQLite افتراضيًا، لكن النسخة الاحتياطية الموثقة تبقى شبكة أمانك. راجع النسخ الاحتياطية والترقيات.
انتقل إلى Dashboard → التراخيص وانسخ المفتاح كاملًا. يبدأ بـ DK-FRST-….
افتح مركز التحديثات.
سجّل الدخول بصفة موظف وافتح https://your-domain/admin/updates/. يُسمّى في الشريط الجانبي التحديثات البرمجية.
الصق مفتاح الترخيص.
استخدم المفتاح كاملًا، بما في ذلك أي شرطات. يُشفّر عند التخزين ولا يُعرض بعد التفعيل سوى شكل مقنّع.
أكّد عنوان LicenseHub.
القيمة الافتراضية هي https://dakidarts.com. أبقِها ما لم يمنحك Dakidarts أصلًا مختلفًا. يلزم HTTPS خارج تصحيح الأخطاء المحلي.
اختر البيئة.
Production تستهلك مقعد إنتاج. Staging وDevelopment تستهلكان مقاعد غير إنتاجية. اختر ما يطابق هذا التثبيت.
أضف نطاق الإنتاج اختياريًا.
على سبيل المثال api.example.com. يساعدك هذا على تمييز التثبيت في بوابة العملاء.
اختر قناة إصدار.
ابدأ بـ Stable. استخدم Beta أو Preview فقط في بيئة اختبار مؤقتة.
انقر فوق تفعيل الترخيص.
ينشئ التفعيل installation_id دائمًا أو يعيد استخدامه ويربط مقعدًا واحدًا. تعرض الصفحة بعد ذلك النسخة، ونوافذ التحديث والدعم، وعدد مرات التفعيل، وآخر نبضة.
إذا فشل التفعيل، يظهر الخطأ في الصفحة. الأسباب الأكثر شيوعًا هي مفتاح منتهي الصلاحية، أو بلوغ حد المقاعد، أو مفتاح نُسخ مع مسافة زائدة.
الجزء 2 — تثبيت تحديث من لوحة الإدارة
خذ نسخة احتياطية.
انسخ احتياطيًا PostgreSQL والوسائط و.env وأي ملفات مخصصة. تأكد من نجاح استعادة النسخة الاحتياطية قبل أن تحتاج إليها.
افتح Admin → التحديثات البرمجية.
تعرض الصفحة الإصدار قيد التشغيل، والإصدار المثبّت، وحالة الاتصال.
انقر فوق التحقق من التحديثات.
يعيد LicenseHub كل إصدار تغطيه نافذة التحديث لديك: الإصدارات الأحدث والحالي والأقدم.
انقر فوق تنزيل وتجهيز على الإصدار الهدف.
ينزّل FastRestful كل أصل، ويتحقق من SHA-256، ويتحقق من توقيع بيان Ed25519، ويستخرج الحزمة إلى FASTRESTFUL_UPDATE_DIR/<version>/bundle/.
انقر فوق تثبيت.
تبدأ لوحة الإدارة عاملًا منفصلًا كي لا تتجاوز الترحيلات أو عملية البناء مهلة طلب الويب. تُحدّث الصفحة أثناء تشغيله.
انتظر ظهور «مثبّت» ولافتة إعادة التشغيل.
لا تزال العملية قيد التشغيل تستخدم الشفرة القديمة حتى تعيد التشغيل. تعرض الصفحة مثبّت … · إعادة التشغيل مطلوبة.
أعد تشغيل الخدمات.
أعد تشغيل Gunicorn أو خادم تطبيقك، وعامل Celery وbeat، وعملية الواجهة الأمامية إذا كانت تعمل على المضيف نفسه. استخدم مدير الخدمات لديك، لا صفحة الإدارة. أمثلة على أوامر systemd:
مثال systemd
sudo systemctl restart fastrestful
sudo systemctl restart fastrestful-worker fastrestful-beat
# restart your frontend process too if it runs on this host
تحقّق.
أكّد الإصدار في مركز التحديثات، وافتح /api/health/ready، ونفّذ طلب اختبار واحد عبر البوابة.
الحزم الكبيرة: إجراء تنزيل وتجهيز توجد في
الجزء 3 — التحديث من سطر الأوامر
استخدم هذا عندما تكون لوحة الإدارة غير متاحة أو عندما تريد التثبيت في جلسة طرفية.
تسجّل النبضة الفاشلة الخطأ في لوحة الإدارة لكنها لا توقف البوابة.
الجزء 4 — الرجوع إلى إصدار أقدم
افتح قائمة الإصدارات.
تظهر الإصدارات الأقدم التي تغطيها نافذة التحديث لديك إلى جانب الإصدار الحالي.
انقر فوق تثبيت إصدار أقدم على الإصدار الهدف.
يميّز مركز التحديثات التثبيت بذلك الإصدار. هذا تثبيت إصدار عادي، وليس إعادة تعيين مدمّرة.
أعد تشغيل الخدمات.
تلتقط العملية المعاد تشغيلها شجرة المصدر الأقدم.
افحص قاعدة البيانات.
إذا طبّق الإصدار الأحدث ترحيلًا غير قابل للتراجع، فاستعد النسخة الاحتياطية لقاعدة البيانات السابقة للتحديث. احتفظ بنسخة قاعدة البيانات ونسخة المصدر معًا.
لقطات المصدر اقرأ FASTRESTFUL_UPDATE_DIR/backups/. تُنسخ SQLite؛ وتُفرّغ PostgreSQL باستخدام pg_dump عند توفرها. قد يتطلب التراجع عبر ترحيل غير قابل للعكس استعادة قاعدة البيانات على أي حال.
الجزء 5 — القنوات والبيئات
القناة
استخدمه لـ
stable
إصدارات الإنتاج. هذه هي القناة الافتراضية.
beta
إصدارات معاينة لبيئة Staging.
preview
إصدارات مبكرة. استخدمها فقط مع بيئة مؤقتة.
تُخزّن القناة في الاتصال وتُرسل مع كل فحص. غيّرها في صفحة التحديث أو أثناء التفعيل.
الجزء 6 — Docker والنشر القائم على الصور
يحدّث المثبّت الافتراضي نسخة مصدرية مستخرجة. وفي حاوية، لا تكون تغييرات نظام الملفات دائمة عند إعادة إنشاء الحاوية. اختر أحد هذه البدائل بدلًا من ذلك:
ابنِ صورة جديدة من الإصدار المنزّل وانشرها عبر خط الأنابيب المعتاد لديك.
عيّن FASTRESTFUL_UPDATE_INSTALL_SCRIPT مخصصًا يسحب الصورة الجديدة أو يطلق طرح منصتك.
استخدم fastrestful_update download لجلب الإصدار والتحقق منه، ثم طبّقه خارج الحاوية قيد التشغيل.
لا تُركّب دليل التحديث أبدًا فوق ملفات مصدر التطبيق. يكتب محدّث النظام الحزم والنسخ الاحتياطية في ذلك الدليل؛ ويمكن أن يؤدي نسخ المصدر فوقها إلى إفساد كليهما.
الجزء 7 — التهيئة
المتغير
الافتراضي
الغرض
FASTRESTFUL_VERSION
1.0.0
الإصدار المعروض على LicenseHub والمقارن بالإصدارات. تضبطه عمليات بناء الإصدارات الرسمية.
DAKIDARTS_LICENSEHUB_URL
https://dakidarts.com
أصل LicenseHub للتفعيل والنبضات والفحوص.
FASTRESTFUL_UPDATE_DIR
<repo>/updates
دليل تجهيز خاص للأصول والحزم والنسخ الاحتياطية.
FASTRESTFUL_UPDATE_TIMEOUT_SECONDS
900
الحد الأقصى لمدة تشغيل المثبّت.
FASTRESTFUL_UPDATE_INSTALL_SCRIPT
install.sh
مسار المثبّت نسبةً إلى الحزمة المستخرجة.
FIELD_ENCRYPTION_KEY
مطلوب في الإنتاج
يشفّر مفتاح الشراء. انسخه احتياطيًا. فقدانه يتطلب إعادة ربط الترخيص.
الجزء 8 — استكشاف الأخطاء وإصلاحها
العَرَض
ما الذي يجب فحصه
license_key_required
المفتاح مفقود أو تم مسحه. أعد الاتصال من /admin/updates/.
activation_not_found
أُلغي تفعيل التثبيت في بوابة العملاء أو استُبدل. أعد الاتصال أو أعد التفعيل.
updates_expired
جدّد استحقاق التحديث في بوابة Dakidarts. يبقى التثبيت الحالي قيد التشغيل.
activation_limit
ألغِ تفعيل تثبيت قديم في بوابة Dakidarts، ثم أعد المحاولة.
فشل المجموع الاختباري للتنزيل
أعد المحاولة. افحص وجود وكيل أو ذاكرة تخزين مؤقت تفسد الأصول. لا تشغّل الحزمة.
لا يوجد سكربت تثبيت
حزمة الإصدار غير مكتملة. استخدم سير عمل النشر لديك أو أعد بناء الإصدار باستخدام scripts/install-release.sh.
نجح التثبيت لكن الإصدار لم يتغيّر
أعد تشغيل الواجهة الخلفية والعاملات والواجهة الأمامية. لا تزال العملية قيد التشغيل تستخدم الشفرة السابقة.
تفشل فحوص السلامة بعد تحديث
اقرأ سجل التحديث، ثم استعد نسخة المصدر السابقة الاحتياطية من FASTRESTFUL_UPDATE_DIR/backups/ ونسخة قاعدة البيانات المطابقة إذا لزم الأمر.
الجزء 9 — ملاحظات الأمان
لا يمكن فتح مركز التحديثات إلا للموظفين الذين يملكون licensing.change_licenseconnection.
حماية CSRF مفروضة على كل إجراء.
مفتاح الشراء مشفّر عند التخزين ولا يُعرض أبدًا بعد التفعيل.
تستخدم التنزيلات رموز LicenseHub قصيرة العمر. ويُتحقق من الأصول عبر SHA-256 وتوقيع بيان Ed25519 قبل الاستخراج أو التنفيذ.
أبقِ دليل التحديث خاصًا. لا تخدمه من Nginx أو تخزين الكائنات.
لا يؤدي انقطاع LicenseHub أو انتهاء نافذة التحديث إلى إخراج بوابة قيد التشغيل من الخدمة. الإلغاء يحجب التنزيلات الرسمية؛ لكنه لا يوقف عن بُعد تثبيتًا دائمًا قائمًا.
لمسؤولي الإصدارات
الإصدارات الرسمية أصول خاصة في LicenseHub. قد تحتوي الحزمة على أرشيف مصدر واحد أو عدة أصول (المصدر، والترحيلات، والواجهة الأمامية، والوثائق). تُستخرج كل الأصول إلى الدليل bundle/ نفسه بالترتيب الذي يعيده LicenseHub.
يجب أن تتضمن الحزمة مثبّتًا في أحد هذه المسارات:
install.sh
scripts/install.sh
scripts/install-release.sh
المسار في FASTRESTFUL_UPDATE_INSTALL_SCRIPT
scripts/install-release.sh في هذا المستودع هو التنفيذ المرجعي. انسخه إلى جذر حزمة الإصدار باسم install.sh. يأخذ لقطة للمصدر وقاعدة البيانات السابقين، ويغطّي المصدر الجديد، ويحافظ على الأسرار والوسائط وملفات قاعدة البيانات المحلية، ويثبّت تبعيات الواجهة الخلفية، ويشغّل ترحيلات Django، ويطبع متطلب إعادة التشغيل.
يتلقى المثبّت FASTRESTFUL_RELEASE_DIR، وFASTRESTFUL_BUNDLE_DIR، وFASTRESTFUL_UPDATE_DIR، وFASTRESTFUL_APP_ROOT، وFASTRESTFUL_FROM_VERSION، وFASTRESTFUL_TO_VERSION، وFASTRESTFUL_PYTHON، وFASTRESTFUL_INSTALL_LOG. ويعمل باستخدام bash، مع مهلة وسجل ملتقط. يجب أن يكون غير تفاعلي وأن يبقي التثبيت قابلًا للاستعادة إذا فشل.
النشر والتشغيلقراءة 8 دقائق
استكشاف الأخطاء وإصلاحها
الأخطاء التي تواجهها الفرق غالبًا — والفحوص التي تحلّها.
تعيد API رمز 401 أو 403
401: رمز bearer مفقود/منتهي الصلاحية، أو X-API-Key مفقود، أو مفتاح لا يُحلّ. حدّث JWT أو أصدر مفتاحًا جديدًا.
403: مصادق عليه لكن غير مسموح. افحص عضوية مساحة العمل والدور وحالة الاشتراك واستحقاق endpoint.
يجب أن تستخدم استدعاءات البوابة الخارجية X-API-Key (أو مفتاح bearer fr_live_…)، لا JWT الخاص بلوحة التحكم.
تحتاج استدعاءات لوحة التحكم إلى Authorization: Bearer <access> وX-Organization: <uuid> معًا.
تفشل طلبات المتصفح بسبب CORS أو CSRF
أضف أصل الواجهة الأمامية الدقيق إلى CORS_ALLOWED_ORIGINS وCSRF_TRUSTED_ORIGINS.
استخدم المخطط والمضيف والمنفذ نفسها التي يستخدمها المتصفح. localhost و127.0.0.1 أصلان مختلفان.
أعد بناء الواجهة الأمامية بعد تغيير NEXT_PUBLIC_API_URL أو NEXT_PUBLIC_SITE_URL.
لاستدعاءات البوابة من أصول مستهلكين عشوائية، هيّئ تعبيرات CORS النمطية أو CORS المتساهل على مضيف API الخاص بالمنتج فقط.
يفشل طلب البوابة
العَرَض
الفحص
429
بلوغ الحصة الشهرية أو حد المعدل لكل دقيقة. افحص استخدام الاشتراك وحدود الخطة.
409
إعادة استخدام مفتاح idempotency بمدخل طلب مختلف. استخدم مفتاحًا جديدًا أو أعد الطلب الأصلي.
503 قابل لإعادة المحاولة
ذاكرة التخزين المؤقت المشتركة غير متاحة، أو الدائرة مفتوحة، أو وضع الصيانة. افحص Redis وتوافر المنصة.
فشل TLS/DNS في المنبع
تأكد من أن منبع المورّد HTTPS عام ويُحلّ دون عمليات إعادة توجيه.
مفتاح مرفوض
المفتاح ملغى أو منتهي الصلاحية أو مرتبط بتطبيق آخر، أو اشتراكه غير نشط.
endpoint غير موجود
يجب أن يطابق الأسلوب + المسار endpoint في الإصدار المباشر. افحص الإصدار واستحقاق الخطة.
عنوان URL دقيق وعام. سجّل /api/v1/billing/stripe-webhook/ أو /paypal-webhook/ أو /flutterwave-webhook/ أو /paystack-webhook/ أو /razorpay-webhook/ على اسم المضيف نفسه الذي يصل إليه المستخدمون. لن يعمل localhost.
لا تُخلط قيم الاختبار والقيم الحية. مفتاح اختبار مع معرّف webhook حي (أو العكس) يفشل في كل تسليم.
السر من النوع الصحيح. يحتاج Stripe إلى سر توقيع endpoint (whsec_…)، لا مفتاح API السري. ويحتاج Flutterwave إلى تجزئة السر التي أنشأتها. ويحتاج Razorpay إلى سر توقيع webhook.
يستخدم PayPal معرّف webhook، لا سرًا. ضع المعرّف من تطبيق PayPal والبيئة نفسيهما في PAYPAL_WEBHOOK_ID. يتحقق FastRestful من كل حدث عبر API التحقق من توقيع PayPal. ويؤدي معرّف مفقود أو خاطئ إلى Bad signature. راجع استكشاف أخطاء webhook في PayPal.
لا يحتاج Paystack عادةً إلى سر webhook. اترك PAYSTACK_WEBHOOK_SECRET فارغًا؛ يتحقق FastRestful باستخدام PAYSTACK_SECRET_KEY.
أنواع الأحداث محددة. webhook قابل للوصول لكنه غير مشترك في حدث التسوية يترك الفاتورة مفتوحة.
وكيلك يحافظ على رؤوس المزوّد. يجب أن تمرر Nginx وCloudflare وموازنات الأحمال رؤوس التوقيع دون تغيير.
المبلغ والعملة متطابقان. يرفض FastRestful أي تسوية لا تطابق الفاتورة.
افحص الإيصال. افتح Admin → أحداث الدفع؛ تُؤكَّد معرّفات الأحداث المكررة دون تسوية مزدوجة. أعد إرسال الحدث الفاشل من لوحة تحكم المزوّد.
لا يُرسَل البريد الإلكتروني
يستخدم التطوير خلفية البريد الإلكتروني في وحدة التحكم. افحص مخرجات الطرفية.
يستخدم الإنتاج SMTP افتراضيًا. اختبر المضيف والمنفذ وTLS واسم المستخدم وكلمة المرور.
يمكن لإعدادات النشرة الإخبارية تجاوز مرسل البيئة؛ تأكد من المزوّد النشط في الاستوديو.
افحص SPF وDKIM وDMARC قبل إلقاء اللوم على قائمة الانتظار. معدلات الارتداد والشكاوى تمنع الإرسال مستقبلًا.
مشكلات بناء الواجهة الأمامية أو المسارات
نفّذ npm run typecheck وnpm test قبل تصحيح أخطاء النشر.
غالبًا ما تعني صفحة فارغة مدفوعة بـ API أن أصل API غير قابل للوصول أو أن CORS غير مكتمل.
إذا كانت صفحات المنتج العامة تعمل لكن /api/{slug} يعيد 404، فتأكد من أن الوكيل يمرر فقط مساحات أسماء Django وليس مسار المنتج المملوك للواجهة الأمامية.
بعد تغييرات i18n، نفّذ npm run export:i18n وأعد تشغيل Django.
لا تظهر تعديلات اللغة
تُحمّل الفرنسية المضمّنة من حزمة الواجهة الأمامية؛ وتأتي طبقات الإدارة من API اللغة النشطة.
احفظ طبقة الإدارة، وتأكد من أن اللغة نشطة، ثم أعد تحميل المتصفح بقوة.
بعد تغيير fr.json، صدّر مصدر الواجهة الخلفية وأعد تشغيل API لمسح ذاكرة التخزين المؤقت للعملية.
افحص وجود تفضيل لغة قديم في localStorage.
المنصةقراءة 10 دقائق
المصادقة والوصول
يستخدم FastRestful رموز وصول JWT قصيرة العمر، ورموز تحديث دوّارة، وجلسة متصفح Django مشتركة. ويمكن لتسجيل الدخول نفسه فتح وحدة تحكم المستهلك واستوديو المورّد ولوحة إدارة الموظفين.
مسارات المصادقة
المسار
endpoint
النتيجة
تسجيل الدخول بكلمة المرور
POST /api/v1/auth/token/
رمز وصول + رمز تحديث وجلسة Django.
التسجيل
POST /api/v1/auth/register/
المستخدم، ومساحة عمل اختيارية، وزوج JWT، وجلسة.
التحديث
POST /api/v1/auth/token/refresh/
رمز وصول جديد؛ وتضع الدورة رمز التحديث القديم في القائمة السوداء.
تسجيل الخروج
POST /api/v1/auth/logout/
يمسح الجلسة؛ واختياريًا يضع رمز تحديث مقدّمًا في القائمة السوداء.
تستخدم لوحة التحكم JWT مع رأس مساحة العمل النشطة الصريح. ويستخدم المستهلكون الخارجيون مفتاح API منتج مشتركًا. لا يجوز استخدام JWT لوحة التحكم مفتاح API للعميل، ولا يجوز إرسال مفتاح API خام إلى endpoints لوحة التحكم.
أدوار مساحة العمل
الدور
الوصول المعتاد
المالك
تحكم كامل بمساحة العمل، والفوترة، والفريق، وعمليات المورّد. المالك الأخير محمي.
وصول موظفي المنصة منفصل: يتطلب is_staff ولا ينتج أبدًا عن دور admin في مساحة العمل. وتُفرض أذونات الموظفين لكل نموذج Django وإجراء إداري.
المصادقة الثنائية
تسجيل أداة مصادقة TOTP مع رمز QR/URI التهيئة ورموز استرداد أحادية الاستخدام.
تُعرض رموز الاسترداد مرة واحدة، وتُجزّأ عند التخزين، وتُعاد إنشاؤها كمجموعة.
يمكن للمستخدم الخارق فرض المصادقة الثنائية على كل حساب في إعدادات الموقع.
يمكن تقييد وصول الإدارة حتى تأكيد التسجيل؛ وتعرض وحدة التحكم بوابة إعداد مخصصة.
دعوات مساحة العمل
يدعو المالكون ومسؤولو الإدارة عبر البريد الإلكتروني ويخصصون دورًا. رموز الدعوة مجزأة وأحادية الاستخدام ومرتبطة بالبريد الإلكتروني وتنتهي بعد سبعة أيام ويمكن إعادة إرسالها أو إلغاؤها. ويتطلب قبول الدعوة مستخدمًا مصادقًا عليه ببريد إلكتروني مطابق، ويمكنه إعادة تفعيل عضوية غير نشطة.
API الفريق
GET /api/v1/organization-invites/
POST /api/v1/organization-invites/ {"email": "...", "role": "developer"}
POST /api/v1/organization-invites/{id}/resend/
POST /api/v1/organization-invites/{id}/revoke/
POST /api/v1/auth/invites/accept/ {"token": "..."}
سجّل عنوان URL للاستدعاء https://api.example.com/api/v1/auth/sso/callback/ لدى مزوّد الهوية. تبقى الوجهات النسبية الآمنة ورموز الدعوة عبر رحلة الذهاب والإياب.
ثبّت lxml قبل تمكين SAML. تُخدم البيانات الوصفية على /api/v1/auth/saml/metadata/؛ وهيّئ IdP باستخدام عنوان URL لخدمة مستهلك التأكيد من endpoint البداية.
دورة حياة مفتاح API
أنشئ مفتاحًا في التطبيق المحدد؛ يظهر المفتاح الخام مرة واحدة.
أرسله كـ X-API-Key أو كبيانات اعتماد bearer fr_live_….
دوّر المفتاح لإلغاء القديم وإصدار مفتاح جديد ذريًا.
ألغِ المفتاح فورًا عند فقدان بيانات الاعتماد؛ ولا يمكن استرداد القيمة الخام.
استخدم نطاق execute أو read لأقل امتياز حيث لا يحتاج العميل إلى إدارة كاملة.
المنصةقراءة 12 دقيقة
منتجات API والإصدارات
المنتج هو الهوية العامة. والإصدار هو العقد غير القابل للتغيير. وتسير endpoints والوثائق وسياسة البوابة واستحقاقات الخطط جميعًا ضمن حدود ذلك الإصدار.
ينشئ الاستيراد إصدارًا مسودًّا أو يحدّثه، ويوفّق صفوف endpoints من paths، ويبلّغ عن endpoints المنشأة/المحدّثة/المحذوفة، ويحافظ على حقول سياسة البوابة في العمليات المحتفظ بها. ويُرفض استيراد إصدار مباشر.
جاهزية النشر
البوابة
المتطلب
بيانات تعريف القائمة
الاسم والمعرّف النصي والعبارة التعريفية والفئة وREADME موجودة.
المنبع
تم تهيئة منبع HTTPS صالح.
إصدار مباشر
إصدار مباشر واحد على الأقل بعقد OpenAPI مدعوم وendpoints مطابقة.
خطة عامة
خطة عامة واحدة على الأقل متاحة.
آلة حالة الإصدار
تدفق الحالة
draft ──submit_review──► review ──promote──► live ──deprecate──► deprecated
└───────────────────────promote────────────────┘
# product visibility
draft ──publish──► public ──unpublish──► draft
└──retire──► retired ──restore──► draft
الإصدارات المباشرة غير قابلة للتغيير: تُرفض التعديلات على مستوى النموذج والمُسلسِل.
تقاعد الترقية الإصدار المباشر السابق للحفاظ على ثبات إصدار مباشر واحد.
يجب أن يتطابق العقد وكتالوج endpoints تطابقًا تامًا قبل الترقية.
تُعاد تعيين استحقاقات endpoints في الخطط حسب الأسلوب + المسار عندما يستبدل إصدار مباشر جديد الإصدار القديم.
تقارير التغييرات الكاسرة
shell
GET /api/v1/versions/{version_id}/diff/?against={previous_version_id}
# Review added, removed, and changed operations before promotion.
# A release can be promoted only after the contract is validated.
توجيه مضيف المنتج
لكل منتج منشور مدخلان متكافئان:
البيئة
عنوان URL الأساسي
الإنتاج مع DNS نمطي
https://{product-slug}.api.example.com
مضيف واحد / التطوير
https://api.example.com/api/v1/{product-slug}
يقرأ الوسيط أول تسمية في المضيف كمعرّف نصي للمنتج. وتُسجّل أسماء المسارات المستعارة كمسار لاحق، لذا تفوز مسارات API المسماة دائمًا. وتعرض المنتجات غير المعروفة 404 مع تلميح؛ وتعيد الطلبات بلا مفتاح إلى منتجات غير معروفة 401 لتجنب الاستكشاف.
استحقاقات الخطة
يمنح all كل endpoint عام في الإصدار المباشر.
يمنح selected مجموعة endpoints المهيأة فقط.
تُفرض الاستحقاقات المحددة عند البوابة، بما في ذلك طلبات المسار الخام التي تتجاوز كتالوج endpoints.
تُقفل الشروط التجارية بعد أول اشتراك؛ أنشئ خطة بديلة بدلًا من تعديل خطة مشترك بها.
المنصةقراءة 11 دقيقة
البوابة والقياس
البوابة هي المسار الوحيد إلى منابع المورّد. فهي تحل المنتج، وتصادق المفتاح، وتفرض سياسة الاشتراك والخطة، وتحجز الحصة، وتمرر بأمان، وتقيس الاستخدام، وتكتب تتبعًا منقّحًا.
خط أنابيب الطلب
حل المنتج من المضيف أو اسم المسار المستعار والعثور على endpoint الإصدار المباشر حسب الأسلوب + المسار.
المصادقة باستخدام JWT/جلسة لوحة التحكم أو بيانات اعتماد خارجية X-API-Key / bearer fr_live_….
حل الاشتراك للمنتج والتطبيق. الاشتراكات النشطة وتجريبية فقط.
التحقق من ربط المفتاح وطبع last_used_at. لا يمكن للمفتاح عبور التطبيقات أو مساحات العمل.
حجز الحصة مقابل العداد الشهري وفرض حدود المعدل لكل endpoint ذريًا.
تشغيل فحوص أمان الشبكة: HTTPS، وDNS عام، ولا إعادة توجيه، ولا اجتياز، وعنوان IP مثبّت.
التمرير مع مهلة وحدود للجسم والتحميل وإعادة محاولات محدودة.
القياس: حدث استخدام، وعداد شهري، وسجل طلب منقّح، ومعاينة استجابة.
عرض المستهلك: سجل طلبات مساحة العمل النشطة مع البحث وتصفية الحالة والتصدير إلى CSV.
عرض المورّد: سجلات على مستوى الطلب عبر المنتجات المملوكة، مع المستهلك وendpoint والزمن والحالة ومعاينات منقّحة.
أحداث الاستخدام: رمز الحالة، والزمن، والاشتراك، والمنتج، وendpoint، والطابع الزمني.
العدادات الشهرية: نموذج قراءة الحصة والتحليلات.
يمكن تهيئة الاحتفاظ باستخدام prune_telemetry.
بيئة البوابة
كل المهل والحدود وميزانيات إعادة المحاولة وحدود الدائرة ومدة idempotency ونطاقات CIDR للوكيل الموثوق وحدود معاينة الوسائط ولاحقة مضيف المنتج تُدار عبر البيئة. راجع التهيئة للجدول الكامل.
المنصةقراءة 14 دقيقة
الفوترة والدفعات
للفوترة مهمتان: تمكين المستهلكين من الدفع مقابل خطط API، وتمكين مشغّل المنصة من تحصيل مقابل سعة مساحة العمل. وكلتاهما تستخدم المزوّدين والفواتير وتسوية webhook نفسها.
هل تربط مزوّدًا لأول مرة؟ اقرأ بوابات الدفع خطوة بخطوة أولًا. يغطي هذا الدليل لوحة تحكم المزوّد وعناوين URL لـ webhook ومعرّف webhook الخاص بـ PayPal وعمليات الدفع التجريبية. يشرح هذا الدليل ما يحدث بعد توصيل المزوّد.
مستويا الفوترة
فكّر فيهما كصندوقَي تسجيل نقدي منفصلين:
المستوى
من يدفع
من يستلم
ما الذي يفتحه
خطط API للمورّد
مستهلك API
مورّد API، ناقص رسوم السوق
الطلبات إلى ذلك المنتج، وفق حصته وحد معدله.
خطط المنصة
مالك مساحة العمل
مشغّل المنصة
عدد مساحات العمل وحدود إدراج API على المنصة نفسها.
كلتاهما تستخدم الدفع المستضاف وwebhooks الموقعة والفواتير والتسوية. تتدفق إيرادات API الخاصة بالمورّد إلى تسوية الدفعات؛ أما إيرادات اشتراكات المنصة فلا.
خطط المورّد
فاصل شهري أو سنوي، وعملة، وسعر، ووصف.
الحصة الشهرية، وحد المعدل لكل دقيقة، والتجاوز لكل 1,000 طلب، وأيام التجربة.
حتى ثمانية أسطر ميزات عامة وخطة عامة موصى بها واحدة.
استحقاق endpoint من نوع all أو selected.
تُقفل الشروط التجارية بعد أول اشتراك؛ استخدم خطة بديلة لإجراء التغييرات.
الدفع والتسوية
يختار المستهلك خطة ويقبل شروط API.
يُنشأ اشتراك معلّق وفاتورة الفترة الأولى.
يفتح المزوّد المهيأ الدفع المستضاف.
يرسل المزوّد webhook موقّعًا بعد الدفع.
يتحقق FastRestful من التوقيع، ويسجل حدث المزوّد، ويتحقق من المبلغ/العملة، ويعلّم الفاتورة مدفوعة.
لا يفعّل الاستحقاق إلا بعد التسوية. ولا تمنح عمليات إعادة توجيه المتصفح وصولًا أبدًا.
webhooks المزوّد
POST /api/v1/billing/stripe-webhook/
POST /api/v1/billing/paypal-webhook/
POST /api/v1/billing/flutterwave-webhook/
POST /api/v1/billing/paystack-webhook/
POST /api/v1/billing/razorpay-webhook/
تتجاوز Admin → بوابات الدفع بيانات اعتماد البيئة حقلًا بحقل. ويؤدي تعطيل سجل بوابة إلى إيقاف ذلك المزوّد في كل مكان، حتى لو بقيت مفاتيح البيئة.
المبالغ المستردة
يسترد المورّدون الذين لديهم إذن الفوترة الفواتير المدفوعة عبر البوابة الأصلية.
تُسوّى عمليات استرداد Stripe تراكميًا من أحداث webhook؛ وتؤكد البوابات المستضافة بشكل متزامن.
مفاتيح idempotency وطلبات الاسترداد المعلقة تجعل إعادة المحاولات آمنة.
الاسترداد الكامل يعلّم الفاتورة كمستردة.
تضيف عمليات الاسترداد بعد الدفعة قيود استرداد إيرادات المورّد وعكس الرسوم النسبي إلى دفتر الأستاذ.
لا يمكن للمستهلكين استرداد الأموال بأنفسهم؛ ويجب استرداد المدفوعات اليدوية عبر مزوّدها.
الدفعات
حالة الدفعة
pending ──► in_transit ──► paid
│ │
├──► failed ◄──┘
└──► reversed
# Only paid invoices settle. Refunds reduce the next transfer.
# Gross collected revenue is stored separately from net transfer.
# Provider event IDs are unique and retries are idempotent.
هيّئ وجهة مورّد باستخدام PATCH /api/v1/orgs/{id}/payout-provider/ (acct_… لـ Stripe أو البريد الإلكتروني لـ PayPal).
ابدأ تحويلًا باستخدام POST /api/v1/payouts/{id}/transfer/.
سوِّ باستخدام POST /api/v1/payouts/{id}/reconcile/؛ تتطلب الحالات الصارمة معرّف تحويل أو سبب فشل.
يجب تفعيل وضع تعدد المورّدين. يكون دفع اشتراك المنصة غير متاح ما دام وضع تعدد المورّدين معطلًا في إعدادات الموقع. فعّله قبل بيع خطط مساحات العمل.
تُدار خطط المنصة في Admin → خطط المنصة؛ بحد أقصى خمس خطط.
يمكن لكل خطة تحديد حدود مساحات العمل المملوكة وإدراج API والمزايا وتوصية.
تبقى الخطط المدفوعة غير منشورة حتى تهيئة مبلغ عرض ومعرّف سعر متكرر مطابق لدى المزوّد.
تُنشأ جلسات الدفع وبوابة الفوترة من الخادم بوجهات FRONTEND_URL ثابتة.
تسوية الاشتراك للقراءة فقط في لوحة الإدارة كي لا تنحرف تغييرات الموظفين عن المزوّد.
أوامر التسوية
shell
python3.11 manage.py generate_invoices --period 2026-10
python3.11 manage.py generate_payouts --period 2026-10
# Both commands are idempotent and safe to rerun.
تعمل مهمة Celery الشهرية في اليوم الأول الساعة 00:05 UTC. وبدون وسيط، استدعِ الأوامر يدويًا.
بيئة المزوّد
راجع التهيئة → المدفوعات والدفعات لكل متغير. على الأقل: سر/webhook Stripe، أو عميل/webhook PayPal، أو ثلاثي البوابة المستضافة العام/السري/webhook. وتحتاج واجهة البطاقة الأمامية أيضًا إلى NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY.
المنصةقراءة 24 دقيقة
بوابات الدفع خطوة بخطوة
اربط مزوّد دفع حقيقيًا دون تخمين. لكل قسم مزوّد نصفان: ما تنقر عليه في لوحة تحكم المزوّد، ثم ما تدخله في FastRestful. ويتضمن PayPal جولة كاملة في webhooks، بما في ذلك مكان العثور على معرّف webhook الذي يتطلبه FastRestful.
قبل أن تبدأ
تحتاج إلى
السبب
عنوان URL عام عبر HTTPS
يجب أن يتمكن كل مزوّد من الوصول إلى endpoint webhook لديك. لن يعمل localhost في لوحة تحكم مزوّد حقيقية.
حساب اختبار أولًا
استخدم وضع sandbox/الاختبار حتى تُسوّى دفعة اختبارية. لا تصحح الأخطاء بأموال حقيقية أبدًا.
وصول إداري
ستهيّئ المزوّدين في Admin → بوابات الدفع أو في backend/.env.
خطة للبيع
تُنشأ خطط API للمورّد في استوديو المورّد. وتُنشأ خطط المنصة في Admin → خطط المنصة.
مزوّد واحد في كل مرة. اضبط Stripe، ونفّذ دفعة تجريبية، وتأكد من سداد الفاتورة قبل إضافة PayPal أو بوابة مستضافة. أخطاء المزوّد أسهل بكثير في الاكتشاف عندما يتغير شيء واحد فقط.
تعمل الخطط المجانية دون مزوّد. لا يمكن فتح إتمام الشراء المدفوع حتى يتم تفعيل بوابة واحدة على الأقل. إذا قال الدفع “No payment provider is configured”، فأكمل قسم مزوّد واحد أدناه أولًا.
تتغير لوحات تحكم المزوّدين. استخدم هذه الخطوات كخريطة، لا كلقطة شاشة. إذا اختلف اسم عنصر في القائمة، فابحث عن المفهوم نفسه: مفاتيح API أو webhooks أو المنتجات أو الأسعار أو الدفعات.
كيف يتحرك المال في FastRestful
ينشئ FastRestful فاتورة.
يوجد الاشتراك وفاتورة الفترة الأولى قبل فتح الدفع. ولا شيء معلّم كمدفوع بعد.
للخطط المدفوعة، يفتح المزوّد الدفع.
يدفع العميل على صفحة المزوّد المستضافة. ويخزّن FastRestful مرجع الدفع فقط.
يرسل المزوّد webhook موقّعًا.
يتحقق FastRestful من التوقيع، ويسجل الحدث مرة واحدة، ويفحص المبلغ والعملة.
تُسوّى الفاتورة.
عندها فقط يُفعّل الاشتراك ويبدأ الاستحقاق. ولا تمنح إعادة توجيه المتصفح وصولًا أبدًا.
webhooks هي مصدر الحقيقة. إذا دفع العميل لكن لم يصل webhook أبدًا، تبقى الفاتورة مفتوحة. لوحة تحكم المزوّد هي المكان المناسب لفحص عملية التسليم وإعادة إرسالها.
أين تذهب بيانات الاعتماد
يمكنك وضع بيانات الاعتماد في backend/.env أو في Admin → بوابات الدفع. سجلات الإدارة أسهل في التدوير وتتجاوز قيم البيئة حقلًا بحقل. ويؤدي تعطيل سجل إداري إلى إيقاف المزوّد في كل مكان، حتى لو بقيت مفاتيح البيئة.
المزوّد
حقل عام
حقل سري
حقل webhook
Stripe
—
المفتاح السري (sk_…)
سر التوقيع (whsec_…)
PayPal
معرّف العميل
سر العميل
معرّف webhook (ليس سرًا وليس عنوان URL)
Flutterwave
المفتاح العام
المفتاح السري (FLWSECK-…)
تجزئة السر التي تنشئها
Paystack
المفتاح العام (pk_…)
المفتاح السري (sk_…)
اتركه فارغًا لاستخدام المفتاح السري
Razorpay
معرّف المفتاح (rzp_…)
سر المفتاح
سر توقيع webhook
أسماء حقول الإدارة عامة. في نموذج بوابة الدفع، المفتاح العام يعني المعرّف العام/معرّف العميل لدى المزوّد، المفتاح السري يعني سر API الخاص به، و سر webhook يعني قيمة توقيع webhook. وبالنسبة إلى PayPal، فهي Client ID وClient secret وWebhook ID على الترتيب.
اختبار webhooks على حاسوبك المحمول
لا يمكن للمزوّدين الوصول إلى http://127.0.0.1:5056. استخدم أحد هذه الأساليب للاختبار المحلي.
Stripe CLI
ثبّت Stripe CLI وسجّل الدخول.
اتبع دليل التثبيت الخاص بـ Stripe CLI، ثم نفّذ stripe login ووافق على مطالبة المتصفح.
تحتاج هذه المزوّدين إلى عنوان URL عام عبر HTTPS. استخدم نفقًا مثل ngrok أو Cloudflare Tunnel، ثم سجّل عنوان URL للنفق في لوحة تحكم المزوّد:
shell
# Example with ngrok
ngrok http 5056
# Use the generated https URL, for example:
# https://abc123.ngrok-free.app/api/v1/billing/paypal-webhook/
هل ستغيّر عنوان URL للنفق لاحقًا؟ حدّث لوحة تحكم المزوّد ووجهة webhook في FastRestful معًا. عنوان URL القديم هو السبب الأكثر شيوعًا لعبارة «نجح الدفع لكن الفاتورة لم تُغلق أبدًا».
يوفر PayPal أيضًا محاكي webhook في لوحة تحكم المطوّر. وجّهه إلى عنوان URL للنفق واستخدم معرّف webhook من تطبيق sandbox نفسه كي يتمكن FastRestful من التحقق من الحدث المحاكى.
اختيار مزوّد
المزوّد
الدفع
الدفعات
الأنسب
Stripe
دفع مستضاف أو واجهة بطاقة مضمّنة
ربط التحويلات
البطاقات والمحافظ العالمية والدفعات الآلية للمورّدين.
المشترون الذين يفضلون أرصدة PayPal والبطاقات واشتراكات PayPal.
Flutterwave
دفع مستضاف
تسوية يدوية
الأسواق الأفريقية بطرق دفع محلية.
Paystack
دفع مستضاف
تسوية يدوية
نيجيريا وغانا وكينيا وجنوب أفريقيا.
Razorpay
روابط الدفع
تسوية يدوية
الهند، مع تسعير أولوية بـ INR.
خطط المورّد مقابل خطط المنصة. تُفوتَر اشتراكات خطط API الخاصة بالمورّد عبر فواتير FastRestful: تفتح الفترة الأولى دفعًا مستضافًا، وتُنشأ الفواتير اللاحقة بواسطة مهمة التسوية. تستخدم اشتراكات المنصة الفوترة المتكررة لدى المزوّد: Stripe Prices أو خطط PayPal Billing. يتطلب دفع اشتراك المنصة أيضًا تفعيل وضع تعدد المورّدين في إعدادات الموقع. ويُضبط كل منهما في مكان مختلف.
Stripe خطوة بخطوة
1. أنشئ حساب Stripe وفعّله
أنشئ حساب Stripe وأكمل ملف الأعمال.
أبقِ وضع الاختبار مفعّلًا أثناء التكامل. المفتاح في الشريط العلوي من Stripe Dashboard.
يمكنك تحصيل مدفوعات اختبارية قبل أن ينهي Stripe تفعيل الحساب.
2. انسخ مفاتيح API
افتح Developers → API keys.
في Stripe Dashboard، افتح Developers ثم API keys.
انسخ المفتاح السري.
استخدم المفتاح السري للاختبار أولًا (sk_test_…). ضعه في STRIPE_SECRET_KEY أو في سجل Stripe الإداري. لا تضع المفتاح السري أبدًا في كود الواجهة الأمامية.
انسخ المفتاح القابل للنشر.
ضع مفتاح النشر التجريبي (pk_test_…) في NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY إذا أردت واجهة البطاقة المضمّنة. أعد بناء الواجهة الأمامية بعد تغييره.
يتحقق FastRestful من Price مقابل مبلغ الخطة وعملتها وفترتها عند الدفع. يؤدي عدم التطابق إلى إرجاع 409 مع توضيح بدلًا من تحصيل مبلغ خاطئ.
6. Stripe Connect لدفعات المورّدين
فعّل Connect في Stripe وأنشئ حسابًا متصلًا لكل مورّد تدفع له.
انسخ معرّف الحساب المتصل (acct_…).
خزّنه كوجهة المورّد عبر PATCH /api/v1/orgs/{id}/payout-provider/ أو من إعدادات دفعات المورّد.
اختياريًا، عيّن PAYOUT_PROVIDER=stripe للسماح بدفعات Stripe فقط.
أبقِ أحداث transfer.* محددة على webhook الخاص بـ Stripe.
7. اختبر Stripe
استخدم بطاقة الاختبار 4242 4242 4242 4242، وأي تاريخ انتهاء مستقبلي، وأي CVC.
أكمل عملية دفع وتأكد من أن الفاتورة أصبحت مدفوعة.
تأكد من أن الاشتراك أصبح نشطًا وأن مفتاح المستهلك يعمل.
افتح Admin → Payment events وتأكد من معالجة الحدث مرة واحدة.
أطلق استردادًا وتأكد من صحة حالة استرداد الفاتورة.
PayPal، خطوة بخطوة
PayPal هو المزوّد الذي يتطلب أكبر عدد من الخطوات على جانب المنصة. يستخدم FastRestful منتجين مختلفين من PayPal: Checkout orders لعمليات شراء خطط API الخاصة بالمورّدين، وBilling subscriptions لخطط المنصة. وكلاهما يستخدم بيانات اعتماد التطبيق نفسه وwebhook نفسه.
1. أنشئ تطبيق PayPal وانسخ بيانات الاعتماد
افتح PayPal Developer Dashboard.
انتقل إلى developer.paypal.com وسجّل الدخول بحساب PayPal للأعمال.
اختر Sandbox أو Live.
استخدم مفتاح التبديل Sandbox/Live في الأعلى. لكل من Sandbox وlive تطبيقات وبيانات اعتماد ومعرّفات webhook منفصلة.
افتح Apps & Credentials → Create App.
أعطه اسمًا مثل FastRestful وحدّد حساب الأعمال الذي يجب أن يستقبل المدفوعات.
انسخ Client ID وSecret.
يُوضعان في PAYPAL_CLIENT_ID وPAYPAL_CLIENT_SECRET (أو في سجل PayPal الإداري). إذا كان السر مخفيًا، فاستخدم إجراء إعادة الإنشاء في التطبيق وانسخ القيمة الجديدة.
2. أضف webhook الخاص بـ PayPal (مطلوب)
هذه هي الخطوة التي يفوّتها معظم الناس. بدون معرّف webhook، يرفض FastRestful كل حدث PayPal وتبقى الطلبات المدفوعة غير مدفوعة.
افتح تطبيقك في Apps & Credentials.
مرّر وصولًا إلى Webhooks وانقر على Add Webhook.
قد تكون التسمية الدقيقة Webhooks أو Add Webhook حسب إصدار لوحة PayPal.
يجب أن يكون عنوان URL عامًا عبر HTTPS. إعادة توجيه المتصفح ليست دليلًا على الدفع؛ يرسل PayPal أحداثًا موقّعة إلى هذا العنوان، وهذه الأحداث هي التي تسوّي الفاتورة.
افتح webhook المحفوظ إذا لزم الأمر. يعرض PayPal معرّف webhook (سلسلة قصيرة من الحروف والأرقام). هذا هو PAYPAL_WEBHOOK_ID. وهو ليس عنوان URL الخاص بـ webhook وليس سر العميل.
لماذا يختلف PayPal. لا يجزّئ FastRestful حمولة PayPal باستخدام سر مشترك. بل يرسل ترويسات webhook وجسم الحدث إلى /v1/notifications/verify-webhook-signature endpoint الخاص بـ PayPal مع معرّف webhook المخزّن. إذا كان المعرّف مفقودًا، أو من البيئة الأخرى، أو من تطبيق آخر، تفشل عملية التحقق ويعيد FastRestful 400 Bad signature. هذا سلوك مقصود للإغلاق عند الفشل.
3. أضف PayPal في FastRestful
حقل FastRestful
قيمة PayPal
معرّف العميل
App Client ID
سر العميل
App Secret
Webhook ID
معرّف webhook الذي نسخته في الخطوة السابقة
الوضع
Test لـ sandbox، وLive للإنتاج
افتح Admin → Payment gateways وحرّر صف PayPal. في هذا النموذج، Public key هو Client ID، وSecret key هو Client secret، وWebhook secret هو Webhook ID.
إذا كنت تفضّل متغيرات البيئة:
backend/.env
PAYPAL_CLIENT_ID=...
PAYPAL_CLIENT_SECRET=...
PAYPAL_WEBHOOK_ID=...
PAYPAL_ENV=sandbox # use live in production
# PAYPAL_API_BASE= # only for a proxy or custom host
أعد تشغيل الخادم الخلفي والعاملين بعد تغيير قيم البيئة. إذا استخدمت السجل الإداري، فاحفظه وفعّله؛ لا حاجة لإعادة التشغيل.
4. خطط PayPal Billing لاشتراكات المنصة
تخطَّ هذا ما لم تكن تبيع اشتراكات المنصة عبر PayPal. تستخدم خطط API الخاصة بالمورّدين أوامر Checkout لمرة واحدة ولا تحتاج إلى خطة PayPal Billing.
أنشئ منتجًا في PayPal.
في لوحة PayPal، افتح منطقة Billing/Subscriptions وأنشئ منتجًا يمثّل منصتك.
أنشئ خطة شهرية و/أو سنوية.
عيّن المبلغ والعملة والفترة نفسها المطابقة للخطة في FastRestful. أنشئ خطة منفصلة لكل فترة.
انسخ معرّف كل خطة.
تبدأ معرّفات خطط PayPal بـ P-….
الصقها في خطة المنصة.
افتح Admin → Platform plans واملأ PayPal monthly plan ID وPayPal annual plan ID.
تأكد من أن webhook يتضمن أحداث الاشتراك.
يُنشأ الاشتراك في حالة PENDING. ولا يصبح نشطًا إلا بعد وصول BILLING.SUBSCRIPTION.ACTIVATED.
5. PayPal Payouts للمورّدين
تأكد من أن حساب PayPal للأعمال معتمد لـ Payouts.
خزّن بريد مستلم PayPal الخاص بالمورّد كوجهة دفع له عبر PATCH /api/v1/orgs/{id}/payout-provider/.
اختياريًا، عيّن PAYOUT_PROVIDER=paypal، أو PAYOUT_PROVIDER=stripe,paypal للسماح بكل منهما.
أبقِ أحداث PAYMENT.PAYOUTS-ITEM.* محددة على webhook.
6. اختبر PayPal sandbox
استخدم بيانات اعتماد sandbox.
عيّن PAYPAL_ENV=sandbox، واستخدم Client ID وsecret الخاصين بتطبيق sandbox، ومعرّف webhook الخاص بـ sandbox.
أنشئ حساب مشترٍ في sandbox.
يوفر PayPal Developer Dashboard حسابات شخصية تجريبية. سجّل الدخول إلى sandbox.paypal.com بذلك المشتري عند فتح صفحة الدفع.
أكمل عملية دفع تجريبية.
وافق على الطلب وانتظر إعادة التوجيه إلى FastRestful.
تحقق من استلام webhook.
افتح Admin → Payment events. يجب أن ترى CHECKOUT.ORDER.APPROVED، ثم PAYMENT.CAPTURE.COMPLETED، ويجب أن تصبح الفاتورة مدفوعة.
أعد إرسال عملية تسليم إذا لزم الأمر.
في لوحة PayPal، افتح عمليات تسليم الأحداث الخاصة بـ webhook وأعد إرسال الحدث الفاشل. يزيل FastRestful التكرار حسب معرّف الحدث.
استكشاف أخطاء webhook PayPal وإصلاحها
استجابة FastRestful
المعنى
الحل
400 PayPal webhook is not configured.
Client ID أو client secret مفقود، أو السجل الإداري معطّل.
املأ client ID وsecret وفعّل السجل. أعد التشغيل إذا كنت تستخدم متغيرات البيئة.
400 Bad signature.
معرّف webhook مفقود، أو ينتمي إلى تطبيق/بيئة أخرى، أو تمت إزالة ترويسات التوقيع.
انسخ معرّف webhook من التطبيق نفسه في sandbox/live. لا تستخدم عنوان URL أو client secret. تحقق من أن الوكيل الخاص بك يمرّر ترويسات Paypal-*.
404 Unknown invoice for PayPal capture.
وصل الالتقاط قبل وجود مرجع الفاتورة المحلي أو جاء الحدث من تثبيت آخر.
أعد إرسال الحدث من PayPal بعد التأكد من أن عملية الدفع أنشأها هذا التثبيت.
{"status":"ignored"}
الحدث ليس من الأحداث التي يعالجها FastRestful، أو مرجع الاشتراك/الطلب غير معروف.
تحقق من تحديد أنواع الأحداث أعلاه. تأكد من أن عملية الدفع أنشأتها بيئة FastRestful هذه.
{"status":"duplicate"}
تم تسليم معرّف الحدث نفسه مرتين.
لا إجراء. هذا هو عمل حارس idempotency.
Flutterwave، خطوة بخطوة
أنشئ حساب Flutterwave وتحقق منه.
أكمل ملف الأعمال وKYC قبل استخدام وضع live.
انسخ مفاتيح API.
افتح Settings → API Keys. انسخ المفتاح العام والمفتاح السري. مفاتيح الاختبار ومفاتيح live منفصلة.
أدخل سلسلة عشوائية طويلة كـ secret hash الخاص بـ webhook. ضع القيمة نفسها في FLUTTERWAVE_WEBHOOK_SECRET أو السجل الإداري. هذه قيمة تختارها أنت، وليست مفتاحًا يولّده Flutterwave.
أدخل المفاتيح في FastRestful.
حرّر صف Flutterwave في Admin → Payment gateways، أو عيّن FLUTTERWAVE_PUBLIC_KEY وFLUTTERWAVE_SECRET_KEY وFLUTTERWAVE_WEBHOOK_SECRET.
اختبر عملية دفع.
يعالج FastRestful charge.completed بالحالة successful. يتم الإقرار بالأحداث الأخرى وتجاهلها.
Paystack، خطوة بخطوة
أنشئ حساب Paystack وفعّله.
أكمل خطوات تفعيل الأعمال قبل استخدام مفاتيح live.
انسخ مفاتيح API.
افتح Settings → API Keys & Webhooks. انسخ المفتاحين العام والسري لوضع الاختبار أو live.
يوقّع Paystack كل webhook بمفتاحك السري باستخدام HMAC-SHA512. يعود FastRestful إلى PAYSTACK_SECRET_KEY عندما يكون PAYSTACK_WEBHOOK_SECRET فارغًا. لا تعيّن تجاوزًا إلا إذا منحك دعم Paystack مفتاح توقيع منفصلًا.
أدخل المفاتيح في FastRestful.
حرّر صف Paystack في Admin → Payment gateways، أو عيّن PAYSTACK_PUBLIC_KEY وPAYSTACK_SECRET_KEY.
اختبر عملية دفع.
يعالج FastRestful charge.success ويقارن المبلغ بأصغر وحدة عملة (مثل kobo لـ NGN).
Razorpay، خطوة بخطوة
أنشئ حساب Razorpay وتحقق منه.
أكمل KYC وفعّل مدفوعات live.
أنشئ مفاتيح API.
افتح Account & Settings → API Keys وأنشئ مفتاحًا. انسخ Key ID وKey Secret.
حدّد payment_link.paid. ينشئ FastRestful رابط دفع Razorpay لعملية الدفع ويطابق ذلك الحدث. عيّن سر webhook قويًا؛ يوقّع Razorpay باستخدام HMAC-SHA256، ويجب تخزين القيمة نفسها في FastRestful.
أدخل المفاتيح في FastRestful.
حرّر صف Razorpay في Admin → Payment gateways، أو عيّن RAZORPAY_KEY_ID وRAZORPAY_KEY_SECRET وRAZORPAY_WEBHOOK_SECRET.
اختبر عملية دفع.
افتح Payment Link، وادفع بطريقة اختبار، وتأكد من دفع الفاتورة وتسجيل الحدث مرة واحدة.
اختبار القبول في 10 دقائق
نفّذ هذا لكل مزوّد قبل الانتقال إلى live:
يظهر المزوّد كمُهيأ ومُفعّل في Admin → Payment gateways.
تفتح عملية دفع تجريبية صفحة المزوّد وتعود إلى عنوان URL الصحيح للواجهة الأمامية.
يصل webhook الموقّع ويظهر مرة واحدة في Admin → Payment events.
لا تصبح الفاتورة مدفوعة إلا بعد webhook، وليس عند إعادة التوجيه.
يصبح الاشتراك نشطًا ويعمل مفتاح المستهلك.
يعود الاسترداد إلى وسيلة الدفع الأصلية ويحدّث دفتر الحسابات.
إذا كانت الدفعات مفعّلة، يصل تحويل تجريبي إلى وجهة المورّد ويُطابَق.
يتم الإقرار بتسليم webhook مكرر دون تسوية مزدوجة.
أخطاء webhook الشائعة
الخطأ
ما يحدث
الحل
استخدام http://localhost كعنوان URL لـ webhook
لا يستطيع المزوّد الوصول إلى جهازك.
استخدم عنوان URL عامًا عبر HTTPS أو نفقًا للاختبار المحلي.
خلط بيانات اعتماد الاختبار وlive
تُفتح عملية الدفع، لكن يفشل التحقق من webhook أو يُحصَّل من الحساب الخاطئ.
أبقِ المجموعة كاملة في الوضع نفسه: المفاتيح، ومعرّف/سر webhook، وبيئة المزوّد.
لصق عنوان URL الخاص بـ webhook PayPal كـ PAYPAL_WEBHOOK_ID
كل حدث PayPal يعيد Bad signature.
انسخ معرّف webhook من صفحة تفاصيل Webhooks في التطبيق.
استخدام مفتاح Stripe السري كسر webhook
تفشل عمليات تسليم Stripe في التحقق.
استخدم سر توقيع الـ endpoint (whsec_…).
نسيان الاشتراك في حدث
لا يرسله المزوّد أبدًا، فتبقى الفاتورة مفتوحة.
حدّد قائمة الأحداث لذلك المزوّد تمامًا كما هو موضّح أعلاه.
تغيير عنوان URL للنفق
تذهب عمليات التسليم إلى مضيف قديم وتفشل.
حدّث لوحة المزوّد وFastRestful معًا.
مبلغ أو عملة خاطئة
يرفض FastRestful التسوية لحماية دفتر الحسابات.
اجعل سعر الخطة وسعر المزوّد متطابقين تمامًا.
الوكيل يزيل ترويسات التوقيع
يفشل التحقق حتى مع أسرار صحيحة.
مرّر ترويسات المزوّد دون تغيير عبر Nginx أو Cloudflare أو موازن الحمل.
استخدم اسم مضيف API الحقيقي، وليس نفقًا، وتأكد من أن HTTPS يعمل من الإنترنت العام.
عيّن مفتاح النشر الخاص بالواجهة الأمامية.
استخدم مفتاح Stripe القابل للنشر الخاص بـ live وأعد بناء الواجهة الأمامية.
طابق الأسعار ومعرّفات الخطط.
تأكد من أن معرّفات Stripe Price ومعرّفات خطط PayPal Billing تشير إلى كائنات live بالمبلغ والعملة والفترة نفسها.
خذ دفعة حقيقية صغيرة واستردها.
تحقق من webhook والفاتورة والاستحقاق والاسترداد وقيود دفتر الحسابات. هذه هي الطريقة الوحيدة لإثبات مسار live.
راقب أحداث اليوم الأول.
تحقق من Admin → Payment events بحثًا عن أعطال، وتأكد من أن لوحة المزوّد تعرض عمليات تسليم ناجحة.
Experienceقراءة 8 دقائق
مكتبة الوسائط & CDN
مسار تخزين واحد لأصول الوسائط وشعارات المنتجات وصور المورّدين وصور المستخدمين الرمزية وصور CMS. نظام ملفات محلي في التطوير؛ S3 + CloudFront في الإنتاج.
الأنواع المدعومة والحدود
النوع
الإضافات
الحد
صورة
jpg، jpeg، png، webp، gif
8 MB
فيديو
mp4، webm
64 MB
صوت
mp3، wav، ogg
16 MB
مستند
pdf، txt، csv
16 MB
أرشيف
zip
32 MB
يتحقق النظام من الامتداد ونوع المحتوى المعلن وتوقيع magic-byte والحجم. تتم إزالة تكرار البايتات المتطابقة داخل مساحة العمل نفسها عبر checksum SHA-256. ويغذّي GET /api/v1/media/supported-types/ تلميحات القبول في الواجهة.
أوضاع التخزين
MEDIA_STORAGE
السلوك
local
تخزين Django على نظام الملفات ضمن MEDIA_ROOT؛ ويُقدَّم عبر /media/.
s3
S3 عبر django-storages. أسماء كائنات UUID غير قابلة للتغيير وتُكتب بترويسة تخزين مؤقت غير قابلة للتغيير لمدة سنة.
يتطلب وضع S3 وجود boto3 وdjango-storages في بيئة الإنتاج. يفشل manage.py check إذا كانت الحاوية مفقودة ويحذّر عندما لا يُهيأ نطاق CDN ولا ACL للقراءة العامة.
إعداد CloudFront
أنشئ حاوية خاصة مع تفعيل Block all public access.
أنشئ توزيع CloudFront مع أصل الحاوية وOrigin Access Control (OAC).
امنح التوزيع s3:GetObject على arn:aws:s3:::<bucket>/* عبر سياسة الحاوية المُولّدة.
وجّه MEDIA_CDN_DOMAIN إلى التوزيع أو إلى CNAME بشهادة ACM.
لأن أسماء الكائنات غير قابلة للتغيير، تحصل عمليات الرفع المستبدلة على مفتاح جديد. التخزين المؤقت طويل الأمد في CDN آمن ونادرًا ما تكون التطهيرات ضرورية. اضبط MEDIA_S3_ACL=public-read فقط عند التقديم مباشرة من S3 دون CloudFront.
سير عمل المكتبة
Console: يرفع الموظفون أصول المكتبة ويديرونها؛ ويرى المستأجرون رفّ مساحة عمل للقراءة فقط على /dashboard/media أو /vendor/media.
Collections: مجلدات/فئات خاصة بمساحة العمل مع البحث والتصفية والنقل المجمّع.
Rename presets: kebab أو snake أو Title Case أو UPPER أو الإبقاء، مع بادئات ولاحقات وتسلسلات مبطّنة.
Focal points:focal_x/focal_y لكل أصل (0–100) تستخدمها كتل صور CMS.
Range selection: حدّد نطاقًا بالنقر مع Shift، ونزّل، وانسخ URL، وافتح الأصل السابق/التالي في اللوحة الجانبية.
Usage badges: اعرف أين يُشار إلى الأصل قبل حذفه.
دلالات المنتقي
اختيار أصل من المكتبة ينسخ بايتاته إلى الحقل الهدف. استبدال أصل المكتبة أو حذفه لا يكسر الصورة المختارة أبدًا، ويحتفظ كل نموذج بدورة حياة تخزينه. تُرفض الأصول العابرة لمساحات العمل.
الأهداف الموصولة: شعار المنتج، وملف/غلاف المورّد، وصورة المستخدم الرمزية، وهوية المسؤول، وصور الفئات، وصور CMS، ووسائط كتل المحتوى.
Automations → أضف خطوات بريد وانتظار؛ ويؤدي الانضمام إلى قائمة أو إضافة وسم إلى بدء التسجيل.
System emails → اربط القوالب بمحفّزات المعاملات.
إعداد المزوّد: للحصول على خطوات لوحة التحكم الدقيقة لـ SES وMailgun وSendGrid وPostmark وBrevo وMailjet وSparkPost وResend أو SMTP المخصص، راجع External integrations → Email.
عمل مجدول
python3.11 manage.py newsletter_beat
# or schedule the Celery tasks:
# newsletter.send_due_campaigns
# newsletter.process_automations
تُطبَّق قيم UTM الافتراضية على روابط الحملة؛ ولا تُقبل إلا أهداف http(s).
الشرائح والأتمتة
تجمع الشرائح القوائم والوسوم (الكل/أي) وحالة جهة الاتصال ونوافذ التفاعل (فتح، نقر، لم يفتح خلال N يومًا) وحداثة الانضمام. تُحسب الأعداد مباشرة وتُعاد استخدامها في الحملات.
تُشغَّل الأتمتة عند الانضمام إلى قائمة أو إضافة وسم أو يدويًا أو عبر API. ترسل الخطوات بريدًا أو تنتظر N ساعة. تتقدم عمليات التشغيل بشكل idempotent وتسجّل الأعطال. تتم إزالة تكرار التسجيل لكل جهة اتصال.
بريد النظام
إذا كان قالب استوديو نشط مرتبطًا بمحفّز، فإنه يعرض HTML + نصًا؛ وإلا يُرسل النص العادي القديم. تشمل المفاتيح المرتبطة: الترحيب، وإعادة تعيين كلمة المرور، ورمز تسجيل الدخول، وتنبيه الأمان، وإشعار المنصة، وفتح الفاتورة، وفشل الدفع، والموافقة على المورّد، وتنبيه الحصة، ودعوة المؤسسة، وملخص النشاط.
التسجيل العام والتفضيلات
POST /api/v1/newsletter/subscribe/ مع تأكيد double opt-in اختياري.
GET /confirm/<token>/، وGET /unsubscribe/<token>/، وRFC 8058 one-click POST.
مركز التفضيلات على /api/v1/newsletter/preferences/<token>/ لتبديل القوائم أو إلغاء الاشتراك عالميًا.
يعيد بكسل الفتح وإعادة توجيه النقر كتابة الروابط عند تفعيل التتبع.
32 لافتة مدمجة تشمل الإطلاقات والثقة/الحالة والعروض والأحداث ودورة الحياة والمقالات والمجتمع والحملات الموسمية.
HTML مخصص مع العناصر النائبة {{click_url}} و{{dismiss_url}} و{{impression_url}} كي يظل التتبع يعمل.
تكرار الإغلاق: كل تحميل صفحة، أو مرة لكل جلسة، أو مرة يوميًا، أو مرة واحدة فقط.
التسليم والتتبع
endpoints عامة
GET /api/v1/announcements/?path=/pricing&locale=en&placement=topbar
POST /api/v1/announcements/<id>/impression/
POST /api/v1/announcements/<id>/dismiss/
GET /api/v1/announcements/<id>/click/
تتضمن الحمولات HTML المُقدَّم من الخادم بأنماط مضمّنة إضافة إلى impression_url وdismiss_url وfrequency. وتسجّل الأحداث الموضع والمسار واللغة والجهاز والمُحيل وuser agent وIP.
التجارب والتقارير
تتقاسم اللافتات ذات الأولوية نفسها نسبة الحركة حسب الوزن (1–1000).
عيّن اسم تجربة وتسمية متغير على عدة لافتات؛ ويُختار متغير واحد لكل طلب بناءً على الوزن.
تعرض تقارير التجارب مرات الظهور والنقرات ونسبة CTR والمتغير المتقدم.
ترسم التقارير النشاط اليومي خلال 30/90 يومًا وتفصّل الموضع وأفضل الصفحات والأجهزة والأحداث الأخيرة.
تعرض قوائم المسؤول العدادات وإجراءات التفعيل/الإيقاف المؤقت وسجلات الأحداث للقراءة فقط.
العمليات
أحداث اللافتات للإضافة فقط. تُخزَّن حالة الإغلاق في متصفح الزائر وتُحتسب على جانب الخادم. يتجاوز السكربت العام user agents البوتات؛ استخدم user agent عاديًا لمتصفح حقيقي في اختبار جودة اللافتات العامة.
Experienceقراءة 7 دقائق
الروابط القصيرة
روابط قصيرة جاهزة للحملات، وإعادات توجيه، ورموز QR، وقيم UTM افتراضية، وبدائل احتياطية، وتحليلات نقرات، وفحوص وجهات معطلة — متاحة في لوحة المستهلك واستوديو المورّد معًا.
ما يفعله
أنشئ روابط قصيرة باستخدام slug مخصص ووجهة ووسوم ونوع إعادة توجيه وانتهاء وحالة تفعيل.
إعادات توجيه 301 أو 302؛ ويمكن للروابط المنتهية أو المعطّلة أن تعود إلى وجهة آمنة أو صفحة 410 تحمل الهوية.
تُضاف قيم UTM الافتراضية (utm_source، utm_medium، utm_campaign) عند إعادة التوجيه؛ وتكون لمعاملات الحملة الواردة الأولوية.
توليد QR بصيغة SVG مع لون مخصص وبيانات وصفية للحملة.
تحليلات النقرات مع البلد والجهاز والمُحيل وسياق الحملة.
فحوص صحة الوجهات المعطلة مع تفاصيل الخطأ وإعادة فحص بنقرة واحدة.
استيراد/تصدير CSV وإجراءات التحديد المجمّع.
Console
افتح Links في لوحة المستهلك (/dashboard/links) أو استوديو المورّد (/vendor/links). يتضمن المحرر العنوان والوجهة وslug والوسوم ونوع إعادة التوجيه والانتهاء ومفتاح التفعيل ونطاق الموقع الكامل الخاص بالموظفين فقط. ويعرض الجدول إجراءات النسخ وQR وإعادة الفحص والتحرير والحذف والصحة والحالة.
الإعداد
المتغير
الغرض
SHORTLINK_BASE_URL
أصل الرابط القصير العام، مثل https://go.example.com.
NEWSLETTER_TRACKING_BASE_URL
الأصل الاحتياطي عندما تكون قاعدة الرابط القصير فارغة.
تُحل إعادات التوجيه العامة حسب slug، وتسجّل النقرة، ثم تعيد التوجيه. وتتضمن قوائم المسؤول أعمدة النقر/الصحة، وإجراءات إعادة الفحص/التفعيل/التعطيل، وإجراء سريع «تقصير رابط»، وسجل نقرات للقراءة فقط.
Experienceقراءة 12 دقيقة
الموقع وCMS & اللغات
يملك مستوى التحكم في Django الواجهة العامة: الهوية، وافتراضيات البحث/المشاركة، والتنقل، والصفحات، ومقالات المدونة، والمستندات القانونية، وأكواد CSS/JS المخصصة، ووضع الصيانة، وطبقات اللغة.
واجهات المشغّل
مسار المسؤول
يملك
/admin/platform/sitesettings/
سياسة السوق، وأصول الهوية، والبيانات الوصفية العامة، ونص الترويسة/التذييل، والإعلان، وجهة اتصال الدعم، وسياسة المصادقة الثنائية، ووضع الصيانة.
مقتطفات CSS/JS المخصصة، وتحديد النطاق بالمسار، والمعاينة، وسجل المراجعات.
/admin/platform/sitelocale/
اللغات المضمّنة، وطبقات المسؤول، وتغطية الترجمة، والاستيراد/التصدير.
إعدادات الموقع
الشعار، وأيقونة الموقع، وصورة المشاركة الاجتماعية مع منتقي الوسائط والتنظيف بعد الاعتماد.
عنوان meta العام، والوصف، والصورة الاحتياطية للمشاركة.
وضع السوق، ونسبة الرسوم الافتراضية، وعلم الصيانة.
تسمية CTA في الترويسة + الوجهة (يجب توفيرهما معًا).
تفعيل لافتة الإعلان/نصها/رابطها.
عنوان التذييل، والملخص، وحقوق النشر، وبريد الدعم.
تحدي مدمج أو Google reCAPTCHA للنماذج العامة.
سياسة مصادقة ثنائية إلزامية لجميع الحسابات.
ألوان السمة والخطوط ومعاينة مباشرة للواجهة العامة.
المحتوى المنظم
تُجمَّع الصفحات والمقالات من أقسام مرتبة، وليس من HTML خام. تشمل أنواع الأقسام المتاحة: النثر، والجدول، والكود، والصورة، والفيديو، والمنقسم، والاقتباس، وعلامات التبويب، والكود متعدد اللغات، ونموذج endpoint، والشهادات، وقائمة الميزات، والأسئلة الشائعة، والخطوات، والمقاييس، وشبكة البطاقات، والفاصل، والواجهة الرئيسية، وشريط الشعارات، والخط الزمني، وقائمة الروابط، والتنبيه، ومجموعة API، ومجموعة الفئات، وأبرز APIs، والمقالات الأخيرة.
يدعم النثر فقرات مفصولة بسطر فارغ؛ وعناصر القائمة عنصر واحد لكل سطر.
تتطلب الإجراءات تسمية ووجهة معًا؛ وتقبل الروابط مسارات الموقع، أو HTTPS، أو mailto، أو tel.
لا تظهر المسودات علنًا أبدًا؛ وتظهر الصفحات المنشورة في محتوى الموقع والبيانات الوصفية ومسارات sitemap.
يتجاوز SEO على مستوى الصفحة الافتراضيات العامة لكل حقل.
تنضم الصفحات القانونية إلى مجموعة التذييل القانونية الافتراضية بعد النشر فقط.
CSS & JS المخصصان
يحقن Admin → Custom assets CSS أو JavaScript في الموقع العام دون نشر. ولكل مقتطف نوع وموضع (head أو footer) ونطاق (الموقع كاملًا أو مسارات محددة أو صفحة واحدة). وتدعم المسارات التطابقات التامة وبدائل /prefix/*.
الحمولة العامة: يعيد GET /api/v1/platform/assets/ المقتطفات النشطة إضافة إلى csp_nonce المهيأ.
المعاينة: لكل مقتطف معاينة iframe داخل لوحة المسؤول مع حقن مفروض عبر ?fr_preview_asset=<id>.
المراجعات: ينشئ كل حفظ لقطة غير قابلة للتغيير مع المؤلف والملاحظة؛ ويمكن استعادة أي مراجعة كإدخال جديد.
CSP: عيّن nonce نفسه في Site settings وفي سياسة edge لديك؛ وتستلمه الوسوم تلقائيًا.
اللغات وطبقات الترجمة
الإنجليزية هي حزمة المصدر الأساسية. ويُشحن الفرنسي كاملًا. وكل لغة أخرى طبقة مسؤول متفرقة تُدمج فوق الإنجليزية وقت التشغيل.
افتح Site locales → Manage translations لفحص التغطية، أو تحرير الفرنسية المضمّنة، أو إضافة لغة.
تظهر الفرنسية المضمّنة بنسبة 100% دون صف في قاعدة البيانات. ويؤدي حفظ حقل إلى إنشاء طبقة مسؤول دون تغيير البديل المشحون.
صدّر JSON أو TypeScript، وترجم دون اتصال، ثم استورد مجددًا. تُتجاهل المفاتيح غير المعروفة ويُبلَّغ عنها.
تعيد واجهة API العامة للغات الطبقات النشطة؛ وتدمجها الواجهة الأمامية فوق الإنجليزية والفرنسية المضمّنتين.
بعد تحرير lib/i18n/*.json، شغّل npm run export:i18n وأعد تشغيل API لتحديث ذاكرة العملية المؤقتة.
وضع الصيانة
توقف الصيانة كل مسار في الواجهة الأمامية وكل استدعاء لـ API/بوابة العملاء. وتبقى لوحة الموظفين وفحوص الصحة وعمليات ردّ مزوّد الهوية وwebhooks الدفع والدفعات الموقعة متاحة. ويُكشف التوفر العام بشكل مجهول مع علم الصيانة والإشعار وفترة إعادة المحاولة.
البريد الإلكتروني، وتخزين الكائنات، وتسجيل الدخول الموحد، والبنية التحتية، وwebhooks الصادرة. يوضح كل قسم ما يجب فعله على موقع المزوّد أولًا، ثم القيم التي تنسخها بالضبط إلى FastRestful.
المدفوعات في دليلها الخاص. Stripe وPayPal وFlutterwave وPaystack وRazorpay وwebhooks والدفعات مشمولة في بوابات الدفع خطوة بخطوة.
أي قيمة تفوز؟
توفر متغيرات البيئة افتراضيات النشر.
تتجاوز السجلات التي يديرها المسؤول قيم البيئة المطابقة حقلًا بحقل.
يؤدي تعطيل سجل إداري إلى إيقاف ذلك المزوّد في كل مكان، حتى إذا بقيت مفاتيح البيئة معيّنة.
تُدمج قيم مزوّد الواجهة الأمامية وقت البناء. أعد البناء بعد تغيير NEXT_PUBLIC_*.
شغّل إجراء الاختبار الخاص بالمزوّد قبل إرسال حركة live.
مزوّدو البريد الإلكتروني والرسائل الإخبارية
يمكن لـ FastRestful إرسال بريد الحملات والأتمتة وبريد النظام عبر مزوّدك الخاص. هيّئه في Admin → Newsletter → Email settings، أو ورّث SMTP من متغيرات البيئة EMAIL_*. تُشفَّر مفاتيح API والأسرار عند التخزين.
الإعداد في ست خطوات
أنشئ حسابًا لدى مزوّد واحد.
استخدم مزوّد بريد معاملاتي مثل Amazon SES أو Mailgun أو SendGrid أو Postmark أو Brevo أو Mailjet أو SparkPost أو Resend، أو أي مضيف SMTP.
تحقق من نطاق الإرسال أو عنوان المرسل.
لن يسلّم معظم المزوّدين حتى يتم التحقق من النطاق أو البريد. أضف سجلات DNS التي يمنحك إياها المزوّد.
أنشئ مفتاح API أو بيانات اعتماد SMTP.
استخدم أصغر صلاحية تتيح إرسال البريد. ولـ SMTP، انسخ المضيف والمنفذ واسم المستخدم وكلمة المرور.
أضف نطاق الإرسال وتحقق منه، ثم أنشئ مفتاح API. لاحظ ما إذا كان النطاق في منطقة US أو EU.
مفتاح API، ونطاق الإرسال، ومنطقة EU اختيارية، وendpoint API اختياري.
SendGrid
تحقق من مرسل أو نطاق، ثم أنشئ مفتاح API بصلاحية Mail Send.
مفتاح API من نوع Bearer.
Postmark
أنشئ خادمًا وتحقق من توقيع مرسل أو نطاق.
رمز الخادم.
Brevo
تحقّق من المرسل أو النطاق وأنشئ مفتاح API v3.
مفتاح API.
Mailjet
تحقّق من المرسل أو النطاق وأنشئ مفتاح API وسرًّا.
مفتاح API وسر.
SparkPost
تحقّق من نطاق الإرسال وأنشئ مفتاح API بصلاحية الإرسال.
مفتاح API من نوع Bearer.
Resend
تحقّق من نطاق الإرسال وأنشئ مفتاح API.
مفتاح API من نوع Bearer.
قابلية التسليم مهمة DNS. فعّل مصادقة SPF وDKIM وDMARC قبل زيادة الحجم. ابدأ بإرساليات صغيرة، وراقب الارتدادات والشكاوى، وأبقِ رابط إلغاء الاشتراك فعّالًا. ويمكن أن تستخدم الحملات والأتمتة والبريد النظامي قوالب مختلفة، لكنها تشترك في المزوّد نفسه.
تخزين الكائنات وCDN
التخزين على نظام الملفات المحلي مناسب للتطوير. وينبغي أن يستخدم الإنتاج تخزينًا متوافقًا مع S3 مع CDN، لتبقى الملفات المرفوعة بعد عمليات النشر وتُحمَّل الأصول بسرعة.
1. أنشئ حاوية S3 والأذونات
أنشئ حاوية خاصة.
في وحدة تحكم AWS، أنشئ حاوية في المنطقة التي تريدها. أبقِ خيار حظر كل الوصول العام مفعّلًا. سيقرأ CloudFront منها عبر OAC.
أنشئ مستخدم IAM أو دورًا.
سلسلة بيانات الاعتماد القياسية مدعومة: متغيرات البيئة، أو ملف تعريف المثيل، أو IRSA على Kubernetes. لا تُضمّن المفاتيح مباشرة في المستودع.
نفّذ pip install boto3 django-storages في بيئة الواجهة الخلفية وأضفها إلى متطلبات النشر.
عيّن قيم البيئة.
backend/.env
MEDIA_STORAGE=s3
MEDIA_S3_BUCKET=my-media-bucket
MEDIA_S3_REGION=us-east-1
# MEDIA_S3_ENDPOINT_URL= # only for S3-compatible providers
# MEDIA_S3_ACL= # omit when using CloudFront OAC
أعد التشغيل وارفع أصلًا تجريبيًا.
افتح مكتبة الوسائط وارفع صورة. ينبغي أن تظهر في الحاوية وتُحمَّل من CDN أو عنوان S3 المهيأ.
2. ضع CloudFront أمام الحاوية
أنشئ توزيع CloudFront.
اختر الحاوية كمصدر وأنشئ Origin Access Control (OAC).
حدّث سياسة الحاوية.
اسمح لتوزيع CloudFront بقراءة الكائنات. ويمكن لوحدة تحكم CloudFront توليد السياسة لك.
عيّن قيم FastRestful.
backend/.env
MEDIA_CDN_DOMAIN=cdn.example.com
MEDIA_CDN_DISTRIBUTION_ID=E1234567890ABC
# MEDIA_S3_ACL=public-read # only if serving S3 directly, not recommended
اسمح بإبطال الذاكرة المؤقتة.
أضف cloudfront:CreateInvalidation إلى سياسة IAM إذا أردت أن يعمل زر التطهير في مكتبة الوسائط.
اختبر برفع ملف جديد.
ارفع ملفًا جديدًا، وافتحه عبر نطاق CDN، ثم استبدله واستخدم إجراء التطهير.
3. مزوّدون متوافقون مع S3
تعمل Cloudflare R2 وMinIO وDigitalOcean Spaces وخدمات مشابهة عبر S3 API. عيّن MEDIA_S3_ENDPOINT_URL إلى endpoint S3 الخاص بالمزوّد، وأبقِ الحاوية خاصة إذا كان المزوّد يدعم CDN أو عناوين URL موقّعة. تحقّق من الرفع والتنزيل والحذف قبل الاعتماد عليه في الإنتاج.
4. تخزين مواصفات OpenAPI
بشكل افتراضي، تُخزَّن عقود OpenAPI المستوردة في قاعدة البيانات. لتخزينها في S3، عيّن:
استيراد OpenAPI: استورد OpenAPI 3.x أو Swagger 2.0 إلى إصدار مسودة. ويوفّق مسار الإصدار بين endpoints ويُعلّم التغييرات الكاسرة.
مخطط المنصة: صدّره من /api/schema/ باستخدام python3.11 manage.py spectacular --file schema.yml --validate.
واجهة Swagger: تقدّمها الواجهة الخلفية على /api/docs/.
Postman / حزم البدء: تعرض endpoints المنتجات حزمًا قابلة للتنزيل للمستهلكين.
webhooks الصادرة خطوة بخطوة
أنشئ endpoint في FastRestful.
افتح قسم webhook endpoints في مستوى التحكم وأضف عنوان URL للمستقبِل. ويجب أن يكون HTTPS.
اختر الأحداث وسر التوقيع.
خزّن سرًّا قويًا. يوقّع FastRestful جسم الطلب الخام باستخدام HMAC-SHA256.
أرسل تسليمًا تجريبيًا.
تأكد من أن مستقبِلك يعيد استجابة 2xx.
تحقّق من التوقيع على خادمك.
قارن HMAC-SHA256 الذي تحسبه أنت لجسم الطلب الخام مع ترويسة X-FastRestful-Signature. والقيمة هي sha256=<hex>. واسم الحدث موجود في X-FastRestful-Event.
راقب سجل التسليم.
إعادات المحاولة آمنة وسجل التسليم دليل للقراءة فقط. وتعامل مع أسماء الأحداث المكررة بشكل idempotent.
webhooks الدفع منفصلة. تسوّي webhooks المزوّد المعاملات المالية وتُسجّل في لوحة تحكم كل مزوّد. أما webhooks المورّد الصادرة فمخصّصة لتكاملاتك الخاصة. لا توجّه مزوّد دفع إلى endpoint webhook خاص بمورّد.
قائمة قبول التكامل
يظهر المزوّد مهيأً ومفعّلًا في صفحة الإدارة أو الإعدادات.
تصل رسالة اختبار حقيقية أو عملية رفع إلى المزوّد ويُحمَّل عنوان URL المُعاد.
تصل رسالة البريد التجريبية؛ وتنجح SPF وDKIM وDMARC.
تُخزَّن الوسائط المرفوعة في الحاوية وتُقدَّم عبر CDN.
يعود استدعاء OIDC أو SAML الراجع إلى مسار الواجهة الأمامية المتوقع.
تتحقق توقيعات webhooks الصادرة على المستقبِل.
لا تؤدي إعادات المحاولة إلى تكرار الآثار الجانبية.
لا تُخلط بيانات اعتماد الاختبار والإنتاج.
متقدمقراءة 9 دقائق
النسخ الاحتياطية والترقيات
مسار قابل للتكرار للنسخ الاحتياطي والاستعادة والترقية لنشر FastRestful المستضاف ذاتيًا. تأتي النسخ الاحتياطية أولًا؛ وتعتمد طريقة الترقية على كيفية شرائك للمنتج ونشره.
تثبيت مرخّص من Dakidarts؟ استخدم الترخيص والتحديثات الرسمية للحصول على إصدارات رسمية موقعة وتراجع بنقرة واحدة. لا يزال هذا الدليل مسؤولًا عن خطة النسخ الاحتياطي والاستعادة، ومسار ترقية المصدر اليدوي.
تحذير مفتاح التشفير. فقدان FIELD_ENCRYPTION_KEY يجعل مفاتيح API المشفرة وأسرار المزوّد غير قابلة للاسترداد. انسخه احتياطيًا بشكل منفصل عن قاعدة البيانات، مع تحكم صارم في الوصول.
أعد تشغيل API والعاملين؛ وتحقق من الجاهزية ومن طلب فحص سريع.
اخرج من وضع الصيانة وراقب معدل الأخطاء وعمق الطابور وإيصالات webhook.
بعد أي من مساري الترقية، أعد تشغيل Gunicorn وعامل Celery وbeat وعملية بناء الواجهة الأمامية إذا كانت تعمل على المضيف نفسه. ثم تحقق من /api/health/readyوأرسل طلب فحص واحد وافتح الإدارة → أحداث الدفع لتأكيد عدم فشل أي عمليات تسليم من المزوّد أثناء إعادة التشغيل.
شغّل وضع الصيانة للترحيلات التي تغيّر أعمدة حالة الأموال أو حالة الإصدار.
أبقِ Celery متوقفًا مؤقتًا حتى تكتمل الترحيلات.
إصدارات الواجهة الأمامية
بناء الواجهة الأمامية ثابت ومكتفٍ بذاته. أبقِ أصل API وعنوان URL للموقع العام متوافقين مع النشر. وإذا نشرت بناءً جديدًا يتوقع حقول API جديدة، فأصدر الواجهة الخلفية أولًا أو أبقِ العقد متوافقًا مع الإصدارات السابقة.
متقدمقراءة 9 دقائق
المراقبة التشغيلية
الصحة والسجلات والمقاييس والطوابير لمنصة تترك فيها الطلبات والأموال والإشراف أدلة.
الصحة والجاهزية
الفحص
ما تجيب عنه
GET /api/health/live
هل العملية حية؟
GET /api/health/ready
هل تستطيع العملية الوصول إلى قاعدة البيانات والذاكرة المؤقتة المشتركة؟
GET /api/schema/
هل عقد API قابل للتقديم؟
عرض مسار الواجهة الأمامية
هل يمكن للغلاف العام تحميل الهوية والمحتوى؟
استخدم الجاهزية لتحديد عضوية موازن التحميل. ويعيد انقطاع الذاكرة المؤقتة 503 مع التبعية المتعثرة بدلًا من التقديم بحالة محلية فقط.
سياق الطلب
تحمل كل استجابة API بيانات وصفية للطلب في سجلات التطبيق. وحافظ على معرّف الطلب عبر الوكيل العكسي.
استخدم مسارات الموقع أو HTTPS أو mailto أو وجهات tel.
أبقِ نص alt للصورة ذا معنى؛ ويمكن أن يخدم نص المتن كتسمية توضيحية.
لا تنضم الصفحات المنشورة إلى التنقل وبيانات خريطة الموقع إلا عندما تكون حية.
طبقات اللغة
الإنجليزية هي الحزمة الأساسية؛ وتأتي الفرنسية مكتملة. أضف لغة أخرى في الإدارة، واستورد حزمة JSON أو TypeScript، وتجاوز فقط المفاتيح التي تحتاجها.
تبقى القيم المضمّنة بديلًا عندما يكون مفتاح الطبقة فارغًا.
تُتجاهل المفاتيح غير المعروفة ويُبلّغ عنها أثناء الاستيراد.
صدّر JSON أو TypeScript للترجمة دون اتصال.
نفّذ npm run export:i18n بعد تعديل حزمة الواجهة الأمامية وأعد تشغيل API.
webhooks الصادرة
تسلّم webhooks المورّد أحداثًا موقّعة إلى endpoints HTTPS مع سجل تسليم آمن لإعادات المحاولة. أبقِ سر التوقيع في مساحة عمل المورّد وتحقق من التوقيع قبل التصرف بناءً على حمولة.
استخدم عنوان endpoint ثابتًا وأعد 2xx بسرعة.
تعامل مع الأحداث كضمان مرة واحدة على الأقل واجعل المعالجات idempotent.
استخدم سجل التسليم لفحص حالة الاستجابة والمعاينات.
لا تُعد استخدام مسارات webhook الخاصة بمزوّد الدفع لأحداث المورّد.
لا تُنشر الخطط المدفوعة حتى يتوفر زوج من المبلغ ومعرّف سعر متكرر لدى المزوّد.
تعرض مطابقة اشتراك المنصة للقراءة فقط الحالة والاستحقاق دون السماح بانحراف الموظفين عن المزوّد.
إشعارات المنصة
تتوزع الإشعارات التي يكتبها الموظفون إلى صفوف صندوق وارد لكل مستخدم. ويمكن أن يكون الجمهور كل الحسابات أو الموظفين فقط؛ والمستويات هي معلومات وإشعار وحرج. وتظهر أعداد التسليم في لقطة العمليات.
التدقيق وعمليات التصدير
أحداث تدقيق للإضافة فقط تتضمن الفاعل والإجراء والمؤسسة والهدف والبيانات الوصفية.
تدعم مهام التصدير مراجعة الأمان وسير عمل الاحتفاظ.
تعرض قوائم الإدارة طرق عرض مفلترة وبحثًا وCSV حيث يلزم.
لا تضع أبدًا أسرارًا خامة أو مفاتيح API أو حمولات المزوّد في بيانات التدقيق الوصفية.
إدارة اللغات
لغات الموقع → إدارة الترجمات تعرض اللغات المضمّنة والمدارة والتغطية والمفاتيح الناقصة. ويمكن تعديل الفرنسية المضمّنة عبر طبقة إدارية. ويدعم الاستيراد/التصدير JSON وقيم TypeScript الحرفية؛ وتُتجاهل المفاتيح غير المعروفة ويُبلّغ عنها.
مرجعقراءة 10 دقائق
مرجع API
واجهة FastRestful API مبنية على Django REST Framework وجذورها عند /api/v1/. وتقدّم الواجهة الخلفية OpenAPI وهو العقد المرجعي.
رقِّ إصدارًا متحققًا منه وأحِل الإصدار الحي السابق للتقاعد.
GET /products/{slug}/publication-readiness/
أعد بوابات النشر الأربع.
GET /applications/، GET /keys/
تطبيقات المستهلك وبيانات اعتماد محددة النطاق.
POST /keys/{id}/rotate/، POST /keys/{id}/revoke/
استبدل مفتاحًا أو أبطله بأمان.
GET /subscriptions/، POST /{id}/cancel/
الخطط النشطة والإلغاء.
POST /subscriptions/{id}/change-plan/
انتقل إلى خطة أخرى مؤهلة.
POST /gateway/execute/
مغلّف البوابة الآمن القديم.
GET /dashboard/consumer/، GET /dashboard/vendor/
نماذج قراءة ملخصات المستهلك والمورّد.
GET /request-logs/
سجل طلبات محجوب ومحدد النطاق بالمستأجر.
GET /usage-events/، GET /usage-counters/
تفاصيل القياس والعدادات الشهرية.
GET /invoices/، POST /invoices/{id}/pay/
سجل الفوترة والدفع لدى المزوّد.
POST /invoices/{id}/refund/
استرداد كلي أو جزئي عبر البوابة الأصلية.
GET /payouts/، POST /payouts/{id}/transfer/
تسوية المورّد والتحويل عبر المزوّد.
POST /payouts/{id}/reconcile/
طبّق نتيجة المزوّد الصارمة على دفعة.
GET/POST /media/، GET /media/supported-types/
مكتبة الوسائط والتحقق من الرفع.
POST /newsletter/subscribe/
اشتراك عام في القائمة، مع تأكيد مزدوج اختياري.
GET /short-links/، GET /short-links/{id}/qr/
إدارة الروابط وإعادة التوجيه وأصول QR.
GET /announcements/?path=
أفضل لافتة عامة لكل موضع.
GET /platform/branding/، GET /platform/site-content/
الغلاف العام والبيانات الوصفية والتنقل والمحتوى المنشور.
GET /platform/plans/، GET /platform/subscription/
خطط المنصة والاستحقاق الحالي.
GET /platform/locales/، GET /platform/assets/
طبقات اللغة النشطة والأصول المخصصة.
GET /tickets/، GET/POST /ticket-messages/
طابور الدعم والردود وسياق الطلب.
GET /reports/، GET /moderation-appeals/
سجل حالات السلامة وأهلية الاستئناف.
GET /webhook-endpoints/، GET /webhook-deliveries/
تهيئة webhooks الصادرة وأدلة التسليم.
GET /audit-events/، GET /export-jobs/
سجل التدقيق وحالة التصدير.
ترقيم الصفحات والتصفية
تستخدم endpoints القوائم عقد ترقيم صفحات: page وpage_size وsearch وordering ومرشحات الموارد. وتستخدم الاستجابات {count, next, previous, results}. ويقبل الترتيب اسم حقل، مع بادئة اختيارية -.
مثال
GET /api/v1/products/?page=2&page_size=25&search=delivery&ordering=-rating_average
GET /api/v1/invoices/?status=paid&ordering=-created_at
GET /api/v1/request-logs/?status_class=server&ordering=-created_at
بنية الخطأ
تستخدم أخطاء التحقق كائن DRF الذي تُستخدم فيه أسماء الحقول مفاتيح. وتستخدم أخطاء البوابة والمنصة كائن JSON يتضمن رمزًا قابلًا للقراءة آليًا ورسالة بشرية وبيانات إعادة محاولة اختيارية.
هناك نوعان من webhook في FastRestful. أبقِهما منفصلين:
النوع
الاتجاه
الغرض
webhooks المورّد الصادرة
من FastRestful إلى خادمك
أبلغ أنظمتك بأحداث المنصة. موقّعة بـ X-FastRestful-Signature: sha256=<hex> وX-FastRestful-Event.
webhooks مزوّد الدفع
من المزوّد إلى FastRestful
سوِّ الفواتير والاشتراكات والاستردادات والدفعات. وتختلف مخططات التوقيع حسب المزوّد.
مسارات مزوّد الدفع
POST /api/v1/billing/stripe-webhook/
POST /api/v1/billing/paypal-webhook/
POST /api/v1/billing/flutterwave-webhook/
POST /api/v1/billing/paystack-webhook/
POST /api/v1/billing/razorpay-webhook/
يجب أن تستخدم endpoints webhook الخاصة بالمورّد HTTPS وأن تخزّن سر توقيع.
التسليمات موقّعة وتُعاد محاولتها بأمان وتُسجّل مع الحالة ومعاينة الاستجابة.
تُسجّل webhooks مزوّد الدفع في لوحة تحكم كل مزوّد، لا في قسم webhook المورّد.
معرّفات أحداث المزوّد فريدة؛ وتُقبل الأحداث الموقّعة المكررة دون تسوية مزدوجة.
cd backend
python3.11 manage.py spectacular --file schema.yml --validate
استخدم المخطط المولّد لأدوات SDK أو Postman أو اختبارات العقود. وعقود OpenAPI على مستوى المنتج منفصلة: تُستورد في إصدارات API وتُرقّى عبر مسار الإصدار.
عند التعثر
إذا أعاد endpoint رمزًا غير متوقع، فتحقق أولًا من معرّف الطلب وطريقة المصادقة وترويسة مساحة العمل وحالة الاشتراك. ويغطي دليل استكشاف الأخطاء أنماط الفشل الشائعة بالترتيب.