تخطي إلى المحتوى الرئيسي

ArtinTech Solution

MikroTik billing automation in Linkhive: routers page with online status, customer count, RouterOS version and CPU load

لدى مزود الإنترنت مصدران للحقيقة: نظام الفوترة والراوتر. وأتمتة فوترة MikroTik هي العمل على إبقائهما متفقين، أما الأخطاء المكلفة فتعيش في الفجوة بينهما: عميل دفع وما زال مقطوعًا، أو عميل توقف عن الدفع وبقي متصلًا، أو تجديد طُبق مرتين لأن بوابة الدفع أعادت إرسال webhook. عندما بنينا Linkhive، منصة الفوترة المبنية على Laravel والمستضافة ذاتيًا لمزودي النطاق العريض وWi-Fi، شكلت هذه الأعطال الثلاثة التصميم أكثر من أي ميزة.

تبدأ أتمتة فوترة MikroTik بخطوات آمنة عند تشغيلها مرتين

دورة الفوترة في Linkhive قائمة مرتبة من الخطوات: إنشاء فواتير التجديد، والتجديد التلقائي من الرصيد المسبق، وتنفيذ الفواتير المدفوعة، وإرسال التذكيرات، والإنهاء والإيقاف، ثم معالجة القسائم. يشغلها المجدول كل 15 دقيقة، وعلى الاستضافة التي لا تدعم cron تعمل الدورة نفسها عبر زيارات الموقع مرة كل 15 دقيقة على الأكثر.

لا يكون التشغيل المتكرر آمنًا إلا إذا لم يغير التشغيل الثاني شيئًا. لذا تسأل كل خطوة هل أُنجز عملها. فقبل فوترة التجديد تبحث عن فاتورة للعميل والباقة والفترة نفسها. وقبل إرسال تذكير تفحص سجل الرسائل بحثًا عن تذكير أُرسل اليوم. وتعمل كل خطوة داخل try/catch خاص بها: يُسجل الخطأ وتستمر بقية الخطوات، فلا يوقف سجل تالف كل عمليات الإيقاف في الشبكة.

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

حساب عميل في Linkhive يعرض الباقة وتاريخ الانتهاء والرصيد المسبق مع التجديد التلقائي وسجل الفواتير
عميل تجريبي قبل الانتهاء بيومين، مع تفعيل التجديد التلقائي وإصدار الفاتورة التالية.

تحديث ذري واحد يمنع التجديد المزدوج

قد تصل الدفعة نفسها إلى النظام عبر ثلاثة طرق معًا: متصفح العميل العائد من البوابة، وwebhook البوابة، ودورة الفوترة التي تلتقط فاتورة مدفوعة. وإذا سأل كل طريق «هل جُدد هذا؟» ثم جدد، فقد يجتاز طريقان الفحص معًا فيحصل العميل على شهرين بسعر شهر.

الفحص ثم الكتابة يتركان تلك الفجوة، لذا جعلنا الفحص والكتابة عبارة واحدة:

$claimed = Invoice::whereKey($invoice->id)
    ->whereNull('fulfilled_at')
    ->update(['fulfilled_at' => now()]);

if ($claimed === 0) {
    return false; // another request got here first
}

لا تسمح قاعدة البيانات إلا لعبارة UPDATE واحدة بمطابقة ذلك الصف، أيًا كان الطلب الذي وصل أولًا. أما البقية فترى صفر صفوف متأثرة وتتوقف. وتُعامل المدفوعات بطريقة مشابهة: تقفل approvePayment() الصف عبر lockForUpdate() داخل معاملة، فلا يُطبق المال إلا مرة واحدة ولو استُدعيت مرتين.

اسأل البوابة ولا تسأل المتصفح

كل ما يصل إلى رابط العودة يمكن تزويره، لذا يُعامل على أنه تلميح فقط. مع Stripe يحفظ Linkhive معرف جلسة Checkout عند بدء الدفع، ثم يجلب تلك الجلسة من واجهة Stripe عند العودة. ولا يُسجل المال إلا إذا طابقت الجلسة وأكد Stripe أنها مدفوعة بالمرجع الصحيح والمبلغ الدقيق والعملة الصحيحة. ويتبع PayPal النمط نفسه، وتؤكد مشغلات SSLCommerz وbKash وNagad المبلغ والمرجع عبر واجهاتها.

قائمة فواتير Linkhive بأرقام الفواتير والعملاء وتواريخ الاستحقاق والأرصدة وحالة غير مدفوعة
تبقى الفواتير غير مدفوعة حتى يوافق الموظف أو تؤكد واجهة البوابة خلاف ذلك.

يجب ألا يلغي راوتر غير متصل عملية دفع

التصميم المغري يخاطب الراوتر داخل معاملة الدفع، فتتحول إعادة تشغيل الراوتر إلى صفحة خطأ بعد دفع ناجح. في Linkhive يمر كل تغيير للراوتر عبر صنف واحد هو Provisioner، ولا يرمي أي استثناء. يُسجل المال أولًا. وإذا تعذر الوصول إلى الراوتر، يُكتب الخطأ في سجل التزويد ويُعلَّم الاشتراك لإعادة المحاولة.

تعيد مهمة تعمل كل ساعة محاولة الاشتراكات المعلَّمة لمدة تصل إلى ثلاثة أيام. وتقرأ الحالة الحالية للاشتراك بدل إعادة تشغيل الأمر القديم: يُفعَّل الاشتراك النشط ويُوقف ما عداه. فإذا دفع عميل أثناء تعطل الراوتر، تعيد المحاولة توصيله ولا تطبق الإيقاف القديم.

في أتمتة فوترة MikroTik يعمل المشغل عبر RouterOS API، على المنفذ 8728 أو عبر TLS على 8729، بعميل كتبناه بأنفسنا. يحدّث /ppp/secret لاتصالات PPPoE أو /ip/hotspot/user لمستخدمي Hotspot، ثم يقطع الجلسة النشطة ليعيد العميل الاتصال بالملف الصحيح. ويقع FreeRADIUS خلف واجهة المشغل نفسها، فلا تهتم شيفرة الفوترة بما يستخدمه المزود.

أتمتة فوترة MikroTik في Linkhive: صفحة الراوترات مع الحالة وعدد العملاء وإصدار RouterOS وحمل المعالج
تُفحص حالة الراوترات كل خمس دقائق. والراوترات في العرض التجريبي محاكاة.

أثبت ذلك باختبارات تهاجم القواعد

تفشل هذه القواعد بصمت، لذا تحتاج أتمتة فوترة MikroTik إلى اختبارات تحاول كسرها. يأتي Linkhive مع 147 اختبارًا آليًا تنجح على SQLite وMySQL 8.4. تشغل الدورة مرارًا للتحقق من عدم تغير النتيجة، وترسل عودات مزورة، وتجرب مبالغ وعملات غير متطابقة. ولا يُظهر التحليل الثابت عبر Larastan في المستوى 5 أي أخطاء.

لوحة إدارة Linkhive بالسمة الداكنة مع العملاء النشطين والتحصيل والإيراد المتكرر والرصيد المستحق
عرض المشغل لشبكة العرض التجريبي بالسمة الداكنة.

أهم النقاط

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

يمكنك رؤية كل ذلك في العرض التجريبي لـ Linkhive، أو قراءة نظرة عامة على الميزات في Charming Theme، أو الحصول على Linkhive من Vibe96.

هل تدير شبكة نطاق عريض أو Wi-Fi ولم تعد جداول البيانات كافية؟ لنتحدث. تبني ArtinTech Solution هذا النوع من الفوترة والتكامل عبر خدمة تطوير Laravel.

Share this article