أضف الترخيص إلى برنامجك
خصص نحو 15 دقيقة لحماية التصدير: إعدادات ومثال ودمج واختبار الرفض. يجب أن تكون أدوات تطوير اللغة مثبتة مسبقًا.
يتولى SDK الطلبات وهوية الجهاز والتوقيع وبيانات الاعتماد والتخزين والنبضات. قدّم مفتاح العميل ودالة العمل؛ لا حاجة لطلبات HTTP يدوية أو حفظ activation_id.
- تنزيل حزمة التكاملأنشئ إعدادات المنتج في لوحة التحكم
- أنشئ ملفًا مُصدّرًاتحقق من الترخيص ونتيجة العملية
- أضفه إلى التطبيقبدء التشغيل ونقطة العملية والإغلاق
1. جهّز الحزمة في لوحة التحكم
افتح البدء السريع، وأدخل اسم البرنامج واختر ترخيصًا مرتبطًا بالجهاز أو عائمًا ثم أنشئ المنتج وتابع. يُجهّز النظام المنتج والسياسة والترخيص التجريبي والمفتاح العام والإصدار 1.0.0. اختر لغة ونزّل الحزمة المعدّة وفكّها.
تحتوي الحزمة على إعدادين:sdk-demo.json يتضمن مفتاح ترخيص تجريبي لاختباراتك؛product.json يتضمن إعدادات المنتج والمفتاح العام فقط، ويمكن توزيعه مع البرنامج.
للبدء اختر ترخيصًا مرتبطًا بالجهاز. يتيح المثال export دون عدّاد. يجب أن تسمح سياسة المنتج الحالي وترخيصه بنفس الميزة.
2. افحص البيئة وصدّر ملفًا
افتح الطرفية في جذر المجلد المستخرج. أبقِ product.json وsdk-demo.json وstart.ps1 وstart.sh وsdk معًا. اختر اللغة والنظام وشغّل الأوامر. فحص البيئة لا يرسل تفعيلًا.
علامة النجاح:حالة خروج 0 والمخرجات أدناه وملف licensed-report.txt جديد. أعد التشغيل دون خيار الاختبار؛ يستعيد SDK بيانات الجهاز دون استهلاك موضع إضافي.
License OK: export is available
Export completed: licensed-report.txtثبّت الأدوات الناقصة أولًا. يحتاج C/C++ ملفات تطوير libcurl؛ يقبل MinGW الخيار -CurlRoot. قبول تحذير المتصفح لا يجعل SDK يثق بالشهادة؛ يجب أن تثق بيئة التشغيل بشهادة خادم الاختبار.
3. أضفه إلى تطبيق العميل
شغّل مثبّت الموقع في مشروعك. تستخدم اللغات التسع 0.10.0. يتحقق من SHA-256 قبل التثبيت أو استخراج حزم البناء. أضف product.json فقط إلى موارد التطبيق.
التثبيت دون اتصال من حزمة التكامل المحمّلة
استبدل SDK_ROOT بالمسار المطلق للمجلد المستخرج.
الملف القابل للتشغيل لهذه اللغة:. انسخ نقطة دخول العملية إلى مشروعك؛ راجع الكود الكامل ←
| مرحلة التطبيق | ما يجب فعله |
|---|---|
| بدء التشغيل أو شاشة التفعيل | مرّر product.json ومفتاح العميل. بعد التفعيل استخدم مفتاحًا فارغًا عند التشغيل التالي. نفّذ أول تفعيل متصل في مهمة خلفية للتطبيقات الرسومية. |
| زر التصدير أو الاختصار أو القائمة أو الأمر | مرّر دالة التصدير إلى RunFeature. يفحص SDK الصلاحية قبل استدعائها. أبقِ نفس client نشطًا. |
| إغلاق التطبيق | أغلق client لإيقاف النبضات. تعاد المقاعد العائمة ويُحتفظ بتسجيل الجهاز المرتبط. |
4. تحقق من منع التصدير عند رفض الصلاحية
تأكد أن السياسة لا تتضمن licentivo_denied_probe ثم نفّذ الأمر. يجب أن تكون حالة الخروج غير صفرية وألا يُنشأ denied-report.txt. استخدم مسار إخراج غير موجود.
5. أضف العمليات المحسوبة عند الحاجة
مرّر دالتك ومعرف مهمة ثابتًا إلى RunMeteredFeature. يحجز SDK الاستخدام ويؤكد النجاح ويلغي عند فشل العملية ويسجل التأكيدات المعلقة.راجع دمج الاستخدام المحسوب وإعادة المحاولة ←
وزّع SDK المطلوب وproduct.json فقط. لكل عميل مفتاحه. لا تضمّن sdk-demo.json أو ذاكرة التراخيص أو بيانات اعتماد الأجهزة أو مفاتيح الإدارة. يختار cache_path الفارغ مجلدًا خاصًا بالمستخدم.
ميّز بين هذه المعرّفات الثلاثة
| الاسم | يستخدمه | الغرض |
|---|---|---|
مفتاح الترخيص lv_lic_… | مشتري البرنامج | فعّل داخل التطبيق. رمز نقل الجهاز المؤقت lv_tmp_… يُدخل أيضًا في الحقل نفسه. |
| معرّف المنتج | SDK / مطوّر البرنامج | يحدد المنتج الذي يجري التحقق منه؛ يمكن توزيعه مع التطبيق. |
| مفتاح API للإدارة | خادم البائع | يؤتمت إصدار التراخيص وتجديدها وإدارتها. لا يحتاج تفعيل العميل إليه. |
اضبط فاصل النبضات ومدة العمل دون اتصال بشكل مستقل في سياسات الترخيص. تبدأ الصلاحية عند أول تفعيل. أضف حصص الميزات والمقاعد العائمة والتفعيل بملف دون اتصال بعد نجاح التكامل الأساسي.
دون التسجيل، يمكنك فتح جرّب العرضلعرض الطلبات والاستجابات. لإصدار التراخيص تلقائيًا، تابع إلى مفتاح API للإدارة.
SDK للعميل
قدّم دالتك إلى SDK: RunFeature للصلاحية وRunMeteredFeature للعدادات. يتولى SDK الطلبات والتوقيع والتخزين المؤقت والنبضات.
قبل التشغيل
في لوحة التحكم، البدء السريعنزّل الحزمة المعدّة. تستخدم التجربة الملف الخاص sdk-demo.json؛ في التطبيق الفعلي، استخدم product.json، مع تمرير مفتاح العميل عند البدء. تنزيل SDK أدناه يوفر شفرة عامة دون إعدادات منتجك.
ما معنى كل حقل في الإعدادات؟
{
"base_url": "https://www.licentivo.com",
"product_id": "PRODUCT_UUID",
"license_key": "",
"device_name": "Customer app",
"app_version": "1.0.0",
"trusted_keys": {
"SIGNING_KEY_UUID": "BASE64URL_PUBLIC_KEY"
},
"timeout_seconds": 10,
"allow_http": false
}base_url- عنوان خادم الترخيص: النطاق والمنفذ فقط، دون
/api/v1. للاختبار المحلي، استخدمhttps://127.0.0.1:8080. product_id- معرّف منتج هذا التطبيق، ويجب أن يطابق منتج الترخيص.
license_key- اتركه فارغًا في product.json. مرّر مفتاح العميل إلى OpenWithLicense:
lv_lic_…أو رمز نقل جهاز:lv_tmp_…؛ لا يؤدي ذلك إلى تعديل الإعدادات المشتركة. app_version- الإصدار الحالي بصيغة major.minor.patch مثل 1.0.0. مطلوب عند تفعيل نطاق الإصدارات أو الصيانة. تحقّق عبر الإنترنت مجددًا بعد تغيير الإصدار.
device_name- اسم الجهاز المعروض في لوحة التحكم. يساعد على التعرّف عليه لكنه لا يحدد هويته.
trusted_keys- معرّف مفتاح توقيع المنتج والمفتاح العام. وزّعهما مع التطبيق أو تحديث موثّق. لا تثق بمفتاح عام تقدمه استجابة مجهولة.
cache_path- احذفه أو اتركه فارغًا لاستخدام مجلد خاص بالمستخدم تلقائيًا، أو حدّد ملفًا خاصًا بتطبيقك.
timeout_seconds- مهلة الطلب بالثواني: الافتراضي 10، والنطاق 1–120. أخطاء الشبكة المؤقتة تسمح بمحاولتين كحد أقصى.
proxy_url- عنوان وكيل اختياري. يستخدم Java وكيل HTTP؛ ويتطلب Node.js تثبيت undici عند إعداد وكيل. يبقى التحقق من الشهادات مفعّلًا.
allow_http- في الإنتاج، اترك القيمة
false، مع استخدام HTTPS. للاختبارات المحلية يمكن تعيينه إلىtrue، ولكن فقط لـ localhost أو عناوين الحلقة المحلية.
لا تحتاج إلى إدخال device_id؛ يقرأ SDK هوية الجهاز المحلي. يمكن توزيع المفاتيح العامة في product.json؛ احفظ مفاتيح العملاء وsdk-demo.json في مكان خاص.
اختر لغتك
يطابق الكود الملف الموزع ويُنشئ تصديرًا فعليًا. تحل متغيرات البيئة محل إدخال التفعيل؛ استخدم واجهتك وأبقِ client نشطًا طوال عمر التطبيق.
تثبيت موحّد وإصدارات محددة
اختر اللغة والمنصة وشغّل في مشروعك. يوزّع Licentivo SDK عبر موقعه دون حساب GitHub. النشر على GitHub والسجلات العامة ما زال مؤجلًا.
الإصدار: · حزمة الإصدار · ملف التحقق SHA-256 · بيان الإصدار
تم التحقق من Windows x64 وLinux x64. اختبار macOS وARM64 على أجهزة فعلية ما زال مطلوبًا. تُفصل حزم C/C++ حسب المنصة والمترجم.
كيفية استخدام SDK بعد التثبيت
| اللغة | تكامل المشروع |
|---|---|
| Go | import licentivo "github.com/spf86/licentivo-sdk" |
| Java | implementation(files('.licentivo-sdk/java/v0.10.0/licentivo-sdk-0.10.0.jar')) |
| C / C++ | find_package(Licentivo 0.10 REQUIRED) · target_link_libraries(MyApp PRIVATE Licentivo::C) / Licentivo::CPP |
| C# | using Licentivo; |
| Python | from licentivo import Client |
| Node.js | import {Client} from '@licentivo/sdk' |
| Rust | use licentivo::Client; |
| Ruby | require 'licentivo' |
احتفظ بمجلد .licentivo-sdk الخاص بـ Go وRust وC/C++ في المشروع. حدّد إصدارًا جديدًا للتحديث؛ تبقى product.json وذاكرة ترخيص العميل محفوظة.
نفّذ العمل المحمي عبر SDK وأغلق client عند الخروج.
正在加载代码…شغّل هذا الملف باستخدام سكربت البدء السريع ←
استخدم مفتاح عميل آخر أو شغّل مثال البروتوكول الكامل
اضبط متغير البيئة وشغّل سكربت البدء دون خيار الاختبار. مفتاح الترخيص ليس مفتاح API للإدارة.
عند النجاح تظهر الرسالة License OK: export is available. اجمع المفتاح عبر نافذة التفعيل في تطبيقك. لا يحتاج العميل إلى متغير بيئة؛ يحفظ SDK بيانات اعتماد الجهاز. لا تضع المفتاح في السجلات.
تشغيل التجربة الكاملة في الحزمة
فك ZIP مع الحفاظ على بنية المجلدات. ضع sdk-demo.json في جذر الحزمة المستخرجة. اختر النظام وافتح الطرفية فيه وشغّل:
هذا المثال الكامل للفحص المتقدم. ابدأ بـ start.ps1 أو start.sh؛ تحتفظ أمثلة البدء بتسجيل الجهاز عند الإغلاق المعتاد.
كيف أشغّل مثال الإدارة؟
اضبط أولًا متغيرات بيئة خادمك LICENTIVO_URL و LICENTIVO_API_KEY، أدخل عنوان خادم الترخيص ومفتاح الإدارة كاملًا. يقرأ المثال قائمة المنتجات ويعرض حالة HTTP والاستجابة.
يعيد HTTP 200 ويتضمن data.items، نجح الطلب. عند 401 تحقق من اكتمال المفتاح وصلاحيته وعدم إلغائه. إنشاء المفاتيح وصلاحياتها موضحة في مفتاح API للإدارة.
تشغيل مثال تطبيق
تتضمن الأمثلة إدخال التفعيل والحالة وتصدير الملفات وفك ربط الجهاز. Java وPython وC# لها نوافذ، والبقية قوائم طرفية. أدخل المفتاح مرة، ثم اتركه فارغًا للاستعادة.
ينشئ التصدير الناجح licensed-report.txt. اضبط حصة export في السياسة قبل استخدام التصدير المحدود بالعدد.
تعرض أمثلة النوافذ والقوائم الحجز منخفض المستوى. استخدم RunMeteredFeature أدناه؛ تحفظ اللغات التسع التأكيدات المعلقة. بعد تعطل أثناء العملية افحص نتيجتك الخاصة.
كيف تعرض حالة الترخيص؟
تقرأ Status وFeatureStatus الحالة محليًا دون طلبات أو انتظار التحقق الخلفي. استخدم إشعارات الحالة لتحديث الواجهة.
| الحالة | المعنى |
|---|---|
active | نجح آخر تحقق عبر الشبكة؛ والترخيص المحلي صالح. |
offline_valid | التوقيع المحلي صالح، ولم ينجح التأكيد عبر الشبكة منذ التشغيل. |
verification_required | لا يوجد توقيع صالح للاستخدام. فعّل الترخيص أو حدّثه عبر الشبكة. |
| expired / revoked / released | رفض الخادم الترخيص صراحةً. أوقف العمليات المحمية. |
quota_exhausted | تجاوز هذا الطلب حصته؛ تبقى الميزات المرخّصة الأخرى متاحة. |
يعني allowed صلاحية الترخيص المحلي؛ والميزات المعدودة ما زالت تطلب وحدات. lease_valid_until نهاية صلاحية الذاكرة الموقّعة لا الترخيص. يوضح code وrequest_id وretryable الخطأ ومرجع السجل وإمكان إعادة المحاولة.
راجع sdk/README.md للطرق والاستدعاءات واستخدام الحزم. يوفّر الموقع حزم إصدارات ومثبّتات موحّدة؛ النشر في السجلات العامة ما زال مؤجلًا.
أين تضع هذه الاستدعاءات في تطبيقك؟
| مرحلة التطبيق | ما يجب فعله |
|---|---|
| عند البدء أو بعد إدخال المفتاح | استدعِ OpenWithLicense (المنشئ وStart في C++). يُفعّل SDK الترخيص ويبدأ النبضات حسب السياسة. |
| قبل الميزات المدفوعة | مرّر دالتك إلى RunFeature، واستخدم RunMeteredFeature للعدادات |
| أثناء تشغيل التطبيق | أبقِ client نشطًا؛ يرسل SDK النبضات بالفاصل المحدد في السياسة. |
| عند خروج التطبيق | يوقف Close / Dispose / Destroy النبضات ويعيد المقاعد العائمة ويحافظ على تسجيل الأجهزة المرتبطة. |
| عندما يفك المستخدم الربط | استدعِ Deactivate ثم أغلق client. |
تشير الأسماء في الجدول إلى العمليات؛ استخدم الأسماء الدقيقة في مثال لغتك. لتفاصيل النبضات والذاكرة دون اتصال والتحديث عبر الإنترنت، راجع نبضات الاتصال والعمل دون اتصال.
مفتاح API للإدارة
استخدم مفتاح API للإدارة لإصدار التراخيص تلقائيًا من نظام الطلبات أو قراءة بيانات الترخيص من الخادم. يمثّل مساحة عملك كمورّد.
أي مفتاح يحتاجه العميل البرمجي؟
| بيانات الاعتماد | لمن يُسلّم | الغرض منه |
|---|---|---|
lv_api_…مفتاح API للإدارة | خادمك الخاص | أنشئ المنتجات والسياسات والتراخيص واعرض الأجهزة والاستخدام والتدقيق |
lv_lic_…مفتاح الترخيص | برنامج العميل | التفعيل والتحقق والنبضات وتحرير الجهاز |
| المفتاح العام للمنتج | وزّعه مع البرنامج العميل | تحقق من توقيع الترخيص من الخادم |
يكفي مفتاح الترخيص للتحقق داخل برنامج العميل. مفتاح API للإدارة يتحكم بمساحة العمل كلها؛ لا تضعه في برنامج العميل أو صفحة عامة.
إنشاء مفتاح
- سجّل الدخول بصفة Owner لمساحة العمل وافتح API Key ثم اختر إنشاء API Key.
- سمّه حسب الاستخدام، مثل «نظام الطلبات». اختر القراءة فقط للاستعلام أو القراءة والكتابة لإنشاء التراخيص وتعديلها. الصلاحية من 1 إلى 365 يومًا.
- انسخ المفتاح كاملًا فور الحفظ؛ يُعرض مرة واحدة فقط. احفظه في إعدادات خادم خاصة أو متغير بيئة.
أرسل أول طلب إداري
يقرأ المثال قائمة المنتجات. اضبط LICENTIVO_URL على عنوان خادم الترخيص واضبط LICENTIVO_API_KEY على المفتاح الكامل الذي أنشأته ثم نفّذ:
curl "$LICENTIVO_URL/api/v1/products?limit=25" \
-H "Authorization: Bearer $LICENTIVO_API_KEY"هذه صيغة Bash/macOS/Linux. في Windows PowerShell استخدم curl.exe؛ متغير البيئة هو $env:LICENTIVO_URL و $env:LICENTIVO_API_KEY. أمثلة الطلبات الكاملة للغات التسع في خيار API Key لإدارة الخادم في صفحة SDK.
يعيد النجاح HTTP 200 مع data.items. طلبات Bearer Key لا تحتاج ملفات دخول أو CSRF.
الصلاحيات ومعالجة الإبطال
مفتاح القراءة يعرض الموارد، ومفتاح القراءة والكتابة ينشئ ويعدّل المنتجات والسياسات والتراخيص. الحسابات والفرق والإعدادات والمدفوعات تحتاج دخول حساب مخوّل، لا مفتاح إدارة.
ألغِ المفتاح المسرّب أو غير المستخدم من لوحة التحكم. لاستبداله اضغط تدوير؛ يبطل القديم فورًا. ثم حدّث إعدادات خادمك.
حصة API في الباقة تحسب التفعيل والتحقق والنبضات والتحرير. طلبات الإدارة هذه لا تُحسب ضمنها.
API المنتجات والتراخيص
أصدر التراخيص من خادمك بعد الطلب: أنشئ المنتج والسياسة، ثم ترخيصًا لكل عميل. عادةً يُضبط المنتج والسياسة مرة واحدة.
أنشئ في اللوحة بصلاحية كتابة مفتاح API للإدارة. تستخدم الأمثلة التالية Authorization: Bearer 你的管理Key؛ احتفظ بهذا المفتاح على خادم المورّد.
استخدم data.id للمنتج كـ product_id وللسياسة كـ policy_id. بعد الإصدار احفظ data.id وdata.key للترخيص. يُرجع المفتاح الكامل مرة واحدة؛ لا يصلح key_prefix في القائمة للتفعيل.
لترخيص محدد المدة قبل التفعيل،expires_at و first_activated_at تكون null. تبدأ المدة من أول تفعيل ناجح؛ النقل لا يمنح مدة جديدة.
الإدارة اللاحقة
| الطريقة والمسار دون /api/v1 | الغرض وجسم الطلب |
|---|---|
GET /products | استعرض المنتجات. في الاستجابة، data.items مصفوفة السجلات وdata.total عددها الإجمالي. |
GET /licenses/{id} | اعرض تفاصيل الترخيص وأول تفعيل والانتهاء. |
POST /licenses/{id}/renew | تجديد مثل {"days":30}؛ يحتفظ بالترخيص الأصلي. |
POST /licenses/{id}/revoke | إلغاء؛ جسم الطلب {}. |
GET /products/{id}/public-keys | اقرأ مفاتيح المنتج العامة دون دخول. ثبّت المفاتيح الموثوقة عند توزيع SDK. |
GET /activations | اعرض روابط الأجهزة وجلسات التشغيل. |
تستخدم الصفحات limit=25&offset=0، limit حتى 100. المعاملات والهياكل الأخرى في ملف OpenAPI؛ راجع موضوع نموذج الترخيص في القائمة الجانبية.
كيف أستدعي بجلسة دخول المتصفح؟
طلبات الكتابة بملفات ارتباط المتصفح تحتاج X-CSRF-Token. اطلب GET /api/v1/auth/csrf ثم ضع data.csrf_token في هذا الرأس. طلبات Bearer Key لا تحتاج CSRF.
استدعاءات الترخيص عبر SDK
اختر اللغة والعملية ثم استدعِ SDK. يتولى التفعيل وهوية الجهاز والتحقق من التوقيع والتخزين المؤقت والنبضات وحجز الاستخدام وتأكيده وإلغاءه.
في الأمثلة، يأتي client من البدء وpath هو مسار التصدير وexportReport / export_report هي دالتك. jobID معرف ثابت تحفظه تطبيقات الاستخدام المحسوب.
راجع الكود الكامل ← · البدء السريع · راجع دمج الاستخدام المحسوب وإعادة المحاولة ←
ينفذ SDK العملية عند السماح فقط. لا يخصم RunFeature استخدامًا؛ يحجز RunMeteredFeature ويؤكد النجاح ويلغي الفشل. أعد المهمة الأصلية لتسوية التأكيد دون تكرار العملية المكتملة.
عرض طلبات HTTP واستجاباتها (للعملاء المخصصين أو استكشاف الأخطاء)
تنفّذ حزم SDK البروتوكول أدناه. لا تحتاج التطبيقات التي تستخدم حزم SDK التسع إلى تنفيذه من جديد.
تتحقق الواجهات الثماني من الترخيص وهوية الجهاز دون ملفات دخول أو CSRF أو مفاتيح إدارة. تُحرر الجلسات العائمة عند الخروج ويبقى تسجيل الأجهزة المرتبطة.
كيف أفحص السماح بعد التفعيل أو التحقق أو النبضات؟
- تأكد من HTTP 200 واقرأ
data.activation_id. أرسل هذا المعرّف مع التحقق والنبضات والقياس وفك الربط لاحقًا. - تحقق بمفتاح المنتج العام الموثوق مسبقًا
data.leaseثم طابق المنتج والجهاز والمدة والميزات. فك payload إلى JSON وحده لا يثبت صلاحية الترخيص. - ينفّذ SDK أول خطوتين تلقائيًا. يفحص RunFeature الصلاحية قبل العمل، ويتولى RunMeteredFeature الحجز والتأكيد والإلغاء للعدادات.
يحفظ SDK الذاكرة الموقعة ويرسل النبضات وفق السياسة. لا تمسح ذاكرة صالحة لمجرد مهلة شبكة. عند الإلغاء أو التحرير أو الانتهاء الصريح، امنع الميزات المحمية حسب نتيجة SDK.
ما معاني حقول payload بعد فك الترميز؟
المثال لشرح البيانات فقط. عند تنفيذ التحقق استخدم بايتات payload الأصلية المستلمة؛ لا تعِد ترتيب JSON أو تسلسله قبل التحقق.
إعادة المحاولة والنبضات والفوترة
مطلوب للتفعيل وفك الربط والقياس Idempotency-Key، حتى 80 محرفًا دون مسافات. أنشئ قيمة جديدة لكل عملية، واحتفظ بالقيمة والنص عند إعادة المحاولة. اختياري للتحقق والنبضات؛ يدير SDK معرّفات طلباته.
كل تفعيل أو تحقق أو نبضة أو فك ربط ناجح يستهلك طلب API واحدًا. الفشل وإعادة الطلب المتماثل لا يعاد عدّهما؛ CheckFeature محلي. Consume يخصم استخدام الميزة لا حصة API هذه؛ quantity عدد الاستخدامات المستهلكة.
فاصل النبضات ومدة عدم الاتصال والدوام حسب سياسات الترخيص.payload.expires_at هو انتهاء الذاكرة الموقعة الحالية، وليس انتهاء الترخيص النهائي. راجع تفاصيل الترخيص للتاريخ النهائي.
نبضات الاتصال والعمل دون اتصال
الإعدادان في سياسات الترخيص، لكنهما يحددان أمرين مختلفين: وتيرة الاتصال عند توفر الشبكة، ومدة الاستخدام عند تعذر الوصول.
فاصل النبضات: تكرار التحقق
اضبط فاصل النبضات بالثواني على 600، يرسل SDK تحققًا دوريًا كل 10 دقائق تقريبًا أثناء التشغيل. يجلب كل نجاح أحدث القواعد ويحدّث ذاكرة الترخيص المحلية.
أدخل 600–86400 ثانية. أدخل 0 يعطّل نبضات التحقق المجدولة. يظل التحقق أو التحديث اليدوي متاحًا. يضيف الجدول تأخيرًا عشوائيًا 0–10%؛ ولا تقل الفترة عن 600 ثانية.
عند وجود ترخيص مرتبط بالجهاز وذاكرة صالحة، يُستعاد الوصول ثم يُحدّث عبر الشبكة في الخلفية، حتى مع إيقاف المؤقت. الترخيص الذي يتطلب الاتصال والمقاعد العائمة ينتظران تأكيد الخادم.
مدة عدم الاتصال: التشغيل عند تعذر الوصول للخادم
لوضع عدم الاتصال ثلاثة خيارات؛ لا يغير فاصل النبضات.
- السماح لمدة محددة
- عند ضبط 24 ساعة، تبقى الذاكرة الموقعة صالحة حتى 24 ساعة بعد آخر تحقق متصل ناجح. يستمر البرنامج خلال انقطاع الشبكة أو عطل مؤقت ضمنها. بعدها يلزم تحقق متصل ناجح.
- لا يُسمح بالرجوع دون اتصال
- يتطلب البدء اتصالًا ناجحًا بالخادم؛ ذاكرة القرص لا تسمح بتجاوز فشل الطلب. التوقيع القصير أثناء التشغيل صالح لمدة أقصاها
max(10, 心跳间隔)ثانية؛ يجب أن يواصل التطبيق التحقق وفحص صلاحيات الميزات. - السماح بالاستخدام الدائم دون اتصال
- يمكن استخدام التوقيع المحلي طويلًا رغم فشل الشبكة. ترخيص 30 يومًا ينتهي بعد 30 يومًا؛ العمل الدائم دون اتصال لا يجعل الترخيص المؤقت دائمًا.
تستخدم الواجهة offline_mode يمثل هذه الخيارات الثلاثة بالترتيب limited، none، permanent. عند تحديد مدة دون اتصال،offline_seconds من 1 إلى 31536000 ثانية؛ وأدخل 0 للوضعين الآخرين.
كيف تعمل هذه التركيبات؟
| إعدادات النبضات / دون اتصال | السلوك الفعلي |
|---|---|
| 10 دقائق / 24 ساعة | تحقق كل 10 دقائق عند الاتصال. دون اتصال استمر حتى 24 ساعة من آخر تحقق ناجح |
| 10 دقائق / دون اتصال دائم | يحاول النبضات كل 10 دقائق ويحدّث القواعد عند النجاح ويستخدم توقيعًا صالحًا عند التعذر. |
| 0 / دون اتصال دائم | بذاكرة صالحة يبدأ البرنامج دون طلبات مجدولة. التحقق أو التحديث الصريح يظل يتصل بالخادم |
| 0 / 24 ساعة | لا نبضات مجدولة لكن الذاكرة تنتهي. على التطبيق جدولة التحقق؛ تعطيل النبضات لا يزيد مدة عدم الاتصال. |
اجعل مهلة عدم الاتصال أطول من فترة النبضة. نبضة كل ساعة مع دقيقة واحدة دون اتصال تعني انتهاء التوقيع قبل النبضة التالية؛ يجب التحقق بطلب إضافي.
هل يحدّث تعديل السياسة التراخيص الموجودة؟
نعم. تطبق إعدادات النبضات والعمل دون اتصال على التراخيص المرتبطة القديمة والجديدة عند أول تفعيل أو تحقق أو نبضة ناجحة. يستبدل SDK الذاكرة الموقعة. إعادة الطلب بنفس Idempotency-Key تعيد نتيجة الطلب الأصلي.
يستخدم الجهاز غير المتصل قواعده الموقعة السابقة. الاتصال وحده لا يحدّث الذاكرة؛ يجب نجاح طلب. يمكن للتطبيق طلب التحديث عند عودة الشبكة.
المدة وحد الأجهزة والميزات محفوظة لكل ترخيص. تعديل السياسة لا يعيد كتابتها تلقائيًا. عدّل حقوق الترخيص من صفحة التراخيص.
تحديث متصل عند الطلب
تحاول هذه الطرق الاتصال دائمًا، حتى مع العمل الدائم دون اتصال وإيقاف النبضات. النجاح يحدّث التوقيع؛ فشل الشبكة يبلغ بفشل التحديث ويحفظ ذاكرة ما زالت صالحة. الإلغاء أو التحرير الصريح يمسحها.
| اللغة | طريقة الاستدعاء |
|---|---|
| Go | client.RefreshOnline(ctx) |
| Java | client.refreshOnline() |
| C | ln_refresh_online(client) |
| C++ | client.RefreshOnline() |
| C# | await client.RefreshOnline() |
| Python | client.refresh_online() |
| JavaScript | await client.refreshOnline() |
يُحسب التحديث الناجح كطلب تفعيل API واحد. إذا فعّلت السياسة نبضات كانت معطلة، استدعِ StartHeartbeat للغتك لبدء الجدولة. الجهاز غير المتصل لا يتلقى تحديثات الإلغاء أو التحرير.
ربط الأجهزة
مع ترخيص جهاز واحد، نسخ البرنامج والذاكرة إلى حاسوب عادي آخر لا ينقل ترخيص الحاسوب الأصلي.
كيف يحدد SDK هوية الكمبيوتر؟
عند كل بدء يقرأ SDK هوية النظام ويحسب التجزئة مع معرّف المنتج. يتضمن توقيع الخادم التجزئة، ويتحقق منها محليًا أيضًا.
يقرأ Windows MachineGuid وLinux machine-id وmacOS IOPlatformUUID. تُرسل التجزئة فقط، لا الهوية الأصلية. حقل الإعداد القديم device_id لا يستبدل هوية الجهاز الفعلية.
ماذا يحدث عند نسخ ملفات الجهاز A إلى B؟
- يتفعّل A ويتلقى توقيعًا مرتبطًا بتجزئة جهازه.
- يقرأ B هويته فيحصل على تجزئة مختلفة ويرفض ذاكرة A.
- يجب تفعيل B متصلًا. إذا كان الحد جهازًا واحدًا وما زال A مرتبطًا، يرفض الخادم B.
كيف يغيّر العميل جهاز الكمبيوتر؟
يفك العميل ربط الحاسوب القديم ثم يفعّل الجديد. إذا تلف القديم، حرّره من تفعيلات الأجهزة في اللوحة. تغيير الحاسوب لا يعيد مدة الترخيص.
إعادة تثبيت النظام قد تغيّر هويته وتستلزم تفعيل جهاز جديد. استنساخ النظام الكامل أو تزوير الهوية أو تعديل العميل هجمات أقوى؛ تجزئة الجهاز وحدها لا تضمن منعها.
مع فترات عدم اتصال طويلة، لا يعرف توقيع A بتحريره فورًا؛ يلزم طلب ناجح لتحديث الحالة. المدة الأطول تؤخر تطبيق القيود عن بُعد.
تجزئة الجهاز المشتركة بين اللغات
SHA256(UTF8(
"LicenovaDevice/v2\n"
+ lower(product_id) + "\n"
+ lower(trim(OS_machine_identity))
))الحصص والفوترة
حصة الأجهزة تحسب الأجهزة المستخدمة، وحصة API الطلبات الناجحة. هما مقياسان مستقلان؛ لا يستنتج عدد الطلبات من الأجهزة.
أي عمليات تُحتسب ضمن حصة API؟
| الإجراء | هل يُحتسب؟ |
|---|---|
| التفعيل والتحقق والنبضات والتحرير الناجحة | كل نجاح يُحسب مرة؛ تُحتسب كل نبضة في اليوم نفسه منفردة. |
| الطلبات الفاشلة مثل مفتاح خاطئ أو حصة غير كافية | لا يُحتسب |
| إعادة بنفس Idempotency-Key وإرجاع النتيجة الأصلية | لا يُحتسب مجددًا |
| CheckFeature محلي أو فحص الذاكرة الموقعة | لا يُحتسب؛ لا طلب للخادم |
| استعلم أو أصدر التراخيص بمفتاح API إداري | لا يدخل ضمن حصة API التشغيل هذه |
هل تُحتسب الطلبات المتكررة الجهاز عدة مرات؟
لا. في دورة واحدة يُحسب الجهاز نفسه للمنتج نفسه مرة، لكن كل نبضة ناجحة تحسب API. تحريره لا يمحو الاستخدام السابق.
مثلًا: 100 جهاز، 8 ساعات يوميًا، 22 يومًا شهريًا، ونبضة كل 10 دقائق. النبضات وحدها تبلغ 105,600 طلب. أضف 100 تفعيل وتحققًا إضافيًا لكل جهاز يوميًا ليكون الإجمالي 107,900 طلب.
التحققات الإضافية افتراض للمثال؛ الاستخدام الفعلي حسب برنامجك. في تقدير الاستخدام المتصل غيّر الأجهزة ووقت التشغيل والفاصل.
كيف تُحسب رسوم تجاوز الباقة؟
لباقة 100,000 طلب و0.0001 USD للزائد: 120,000 طلب ناجح تعني 20,000 زائد ورسوم API قدرها 2 USD.
يُخصم التجاوز المسموح بسعر المسؤول. يقرب المجموع إلى السنت ويخصم الفرق الجديد فقط، فلا تتكرر رسوم التقريب للأسعار الصغيرة لكل طلب.
رسوم الأجهزة الزائدة مستقلة: العدد الزائد × سعر الجهاز. الحد الصارم يرفض التجاوز، والرصيد غير الكافي يرفض الطلب المدفوع التالي. الطلب المرفوض لا يزيد الاستخدام.
API غير المحدود بلا رسوم تجاوز. صفر يعني لا طلبات مجانية وتطبق الزيادة من أول طلب ناجح. للحصص والأسعار والحدود راجع الباقة الحالية، هذه الأرقام أمثلة فقط.
متى تبدأ مدة الباقة والحصة؟
اشترِ 1 أو 3 أو 6 أو 12 شهرًا. ادفع الإجمالي مرة واحدة؛ تتفعل الباقة بعد نجاح الدفع.
تتجدد الحصص شهريًا من التفعيل. بدء 31 يناير يعني آخر يوم من فبراير ثم 31 مارس. لا تُرحّل الحصة المتبقية.
دون شراء تطبق قواعد المسؤول بالشهر التقويمي UTC. الأجهزة بفواتير شهرية والتجاوز API بخصم فوري. الباقة المشتراة تستخدم حصص دورتها دون جمع الافتراضية.
رفض طلب بسبب الحصة أو الرصيد لا يبطل التوقيع المعزول، الذي يتبع قواعده الأصلية. يحرر المورّد الأجهزة من اللوحة دون استهلاك حصة API التشغيل.
المقاعد العائمة
الترخيص العائم يحد البرامج العاملة معًا. يناسب الاستخدام بالتناوب دون شراء ترخيص لكل حاسوب.
مثال
مع 100 حاسوب و10 مقاعد تعمل أول 10 برامج ويرفض الحادي عشر لامتلاء المقاعد. خروج برنامج وإغلاق SDK طبيعيًا يحرر مقعده لآخر. برنامجان على حاسوب واحد يشغلان مقعدين.
اضبط في السياسة
اختر مقاعد عائمة وحدًا قدره 10. فاصل النبض لا يقل عن 600 ثانية؛ الإيجار أطول مثل 1200 ثانية. يجدد النبض الإيجار، وتحرر نهايته المقعد بعد تعطل أو انقطاع.
يسمح الترخيص العائم بانقطاع قصير ضمن الإيجار. تحدّ المدة نفسها العمل دون اتصال؛ لا يدعم العمل الدائم المعزول أو التفعيل الأول بملف دون اتصال.
ماذا يجب أن تعالجه شفرة التطبيق أيضًا؟
استخدم Open/Start والإغلاق العادي. ينشئ SDK معرّف جلسة مستقلًا لكل client. لا تنشئ client لكل تصدير؛ أبقه حتى خروج البرنامج.
الذاكرة العائمة القديمة لا تستعيد المقعد عند البدء التالي. إذا انتهى الإيجار، فعّل مجددًا واحصل على مقعد قبل العمل.
التفعيل دون اتصال
للحاسوب المعزول تمامًا استخدم ملف طلب واستجابة موقعة للتفعيل الأول. انقل الطلب بقرص USB إلى حاسوب متصل.
الخطوات
- حمّل إعداد SDK على الحاسوب المستهدف واستدعِ OfflineRequest("activate") واحفظ الطلب. إنشاؤه لا يتصل بالخادم.
- على حاسوب متصل افتح التفعيل بملف دون اتصال، وارفع الطلب ونزّل الاستجابة. يمكن للعميل النهائي استخدام بوابته أيضًا.
- أعد الاستجابة واستدعِ ImportOffline بالطلب الأصلي والاستجابة. يتحقق SDK من التوقيع ومعرّف الطلب والإصدار وهوية الجهاز ثم يحفظ الذاكرة.
- تحقق من الإذن باستخدام CheckFeature. الحاسوب المعزول لا يحتاج نبضات متصلة؛ تحدد السياسة مدة عدم الاتصال.
التفعيل بالملف للتراخيص المرتبطة التي تسمح بعدم الاتصال فقط. الطلب صالح 30 يومًا. يبدأ الترخيص المؤقت عند موافقة الخادم لأنه لا يعرف وقت استيراد الرد.
كيف أفك الربط دون اتصال؟
أنشئ OfflineRequest("deactivate") على الحاسوب الأصلي. يمسح SDK الذاكرة أولًا ثم قدم الطلب للمورّد أو البوابة. المسح لا يثبت غياب النسخ السابقة. للإيقاف السريع اختر سياسة تحقق متصل دوري.
الأسماء في كل لغة
| اللغة | إنشاء الطلب | استيراد الاستجابة |
|---|---|---|
| Go | OfflineRequest("activate") → []byte | ImportOffline(requestBytes, responseBytes) |
| Java | offlineRequest("activate") → نص JSON | importOffline(requestText, responseText) |
| JavaScript | offlineRequest("activate") → object | importOffline(requestObject, responseObject) |
| C | ln_offline_request(client, "activate") | ln_import_offline(client, requestText, responseText) |
| C++ / C# | OfflineRequest("activate") → نص JSON | ImportOffline (نص C++ وبايتات C#) |
| Python | offline_request("activate") → dict | import_offline(requestDict, responseDict) |
في C حرر النص المرجع باستخدام ln_free_string. مرر محتوى ملف الاستجابة نفسه، لا غلاف data في API الويب.
حدود استخدام الميزات
صلاحية التصدير تختلف عن 500 تصدير شهريًا. يفحص RunFeature الصلاحية، ويؤكد RunMeteredFeature الاستخدام بعد نجاح العملية.
السماح بـ 500 تصدير شهريًا
أضف export إلى الميزات ثم حصة: export، 500، شهريًا. الافتراضي يرفض بعد نفادها. للسماح بزيادة اضبط أقصاها؛ يسجل النظام التجاوز لنظام طلباتك.
تتجدد الحصص اليومية والشهرية عند منتصف ليل UTC؛ التراكمية لا تتجدد. تغيير الحد لا يمسح الاستخدام السابق.
تأكيد الاستخدام بعد نجاح التصدير
مرّر دالة العملية إلى SDK. استخدم معرفًا جديدًا لكل مهمة جديدة، ونفس المعرف والميزة والكمية لإعادة المحاولة. لا تشغّل نفس المعرف بالتوازي في عمليات مختلفة.
| اللغة | استدعاء عملية محسوبة |
|---|---|
| Go | client.RunMeteredFeature(ctx, "export", 1, jobID, exportReport) |
| Java | client.runMeteredFeature("export", 1, jobID, this::exportReport) |
| Node.js | await client.runMeteredFeature("export", 1, jobID, exportReport) |
| Python | client.run_metered_feature("export", 1, job_id, export_report) |
| C# | await client.RunMeteredFeature("export", 1, jobID, ExportReport) |
| C++ | client.RunMeteredFeature("export", 1, jobID, exportReport) |
| Rust | client.run_metered_feature("export", 1, &job_id, || export_report())? |
| Ruby | client.run_metered_feature("export", 1, job_id) { export_report } |
| C | ln_run_metered_feature(client, "export", 1, job_id, export_report, context) |
اضبط حصة export أولًا. أضف -Metered -OperationID export-job-001 في Windows، أو --metered --operation-id export-job-001 في Linux/macOS.
إذا نجح العمل وفشل التأكيد، تعيد المحاولة التأكيد فقط دون العمل. التعطل أثناء العمل يمنع إعادة التنفيذ تلقائيًا. افحص نتيجتك الدائمة ثم استخدم ResolveMeteredFeature للتأكيد أو الإلغاء. العدّ البعيد والعمل المحلي ليسا معاملة واحدة.
عند الحاجة للتحكم بالحجز بنفسك
- أنشئ معرّف مهمة لهذا التصدير واحفظه.
- احجز وحدة وابدأ التصدير فقط بعد pending. يعني committed أن العمل اكتمل؛ لا تنفذه مجددًا.
- بعد نجاح التصدير وحفظ النتيجة، استدعِ Commit لتأكيد الاستخدام.
- إذا فشل التصدير قبل اكتماله، استدعِ Cancel لإلغاء الحجز دون احتساب الاستخدام.
الحجز صالح 15 دقيقة افتراضيًا، ويُقصّر عند إعادة ضبط فترة UTC. يمكن للـ API ضبط reservation_seconds إلى 30–3600 ثانية.
| اللغة | حجز | تأكيد / إلغاء |
|---|---|---|
| Go | Reserve(ctx, "export", 1, jobID) | Commit / Cancel(ctx, hold.ID, jobID) |
| Java / Node.js | reserve("export", 1, jobID) | commit / cancel(id, jobID) |
| C | ln_reserve(client, "export", 1, jobID) | ln_commit / ln_cancel(client, id, jobID) |
| C++ / C# | Reserve("export", 1, jobID) | Commit / Cancel(id, jobID) |
| Python | reserve("export", 1, jobID) | commit / cancel(id, jobID) |
كيف تقرأ حقول الاستجابة؟
| الحقل | المعنى |
|---|---|
| reservation_id / operation_id | معرّف الحجز ومعرّف المهمة الأصلي؛ استخدم القيم نفسها عند إعادة المحاولة. |
| status / expires_at | حالة الحجز وموعد انتهائه: pending ينتظر الإكمال، committed احتُسب، canceled أُلغي، expired انتهت مدته. |
| consumption.used / reserved | الاستخدامات المؤكدة في هذه الفترة / الوحدات المحجوزة لجميع المهام السارية. |
| consumption.limit / remaining | الحصة الأساسية / الوحدات الأساسية المتاحة. remaining = max(0, limit - used - reserved)، دون التجاوز المسموح. |
| consumption.quantity / overage | وحدات هذه المهمة / الوحدات المؤكدة فوق الحد الأساسي؛ لا تُحصّل أموال من العميل. |
| consumption.period / reset_at | فترة الاستخدام بتوقيت UTC / إعادة الضبط التالية؛ للحصة مدى الحياة reset_at = null. |
راجع طلبات Reserve وCommit وCancel في مرجع API للتحقق من الترخيص لمعرفة الرسائل وأنواع الحقول.
بعد النجاح لا تلغِ الحجز ولا تكرّر التصدير. احفظ المعرّفات والنتيجة وأعد Commit. إذا انتهى الحجز فاحتفظ بالمهمة للمراجعة. احتساب الاستخدام البعيد والعمل المحلي لا يشكّلان معاملة ذرّية واحدة.
يسجّل Consume الاستخدام فورًا. استخدم الحجز لتجنب احتساب العمل الفاشل. جميع واجهات استخدام الميزات تتطلب اتصالًا ولا تدخل ضمن أنواع API الأربعة المحتسبة للمنصة.
الإصدارات وفترة الصيانة
الشراء الدائم يتيح الاستخدام المستمر، لا التحديث المجاني للأبد بالضرورة. تحدد فترة الصيانة الإصدارات المؤهلة حسب تاريخ نشرها.
امتلك الإصدار الحالي مع تحديثات مجانية لعام
اضبط الترخيص دائمًا والصيانة 365 يومًا من أول تفعيل. انشر 1.0.0 و1.1.0 وغيرها في إصدارات البرامج بتواريخها الفعلية.
تبقى إصدارات فترة الصيانة متاحة؛ الإصدارات اللاحقة تُرفض بينما تعمل القديمة. بعد تجديد العميل، مدّد الصيانة في حقوق وعميل الترخيص.
كيف يرسل البرنامج إصداره؟
اضبط app_version في sdk-demo.json مثل 1.1.0. مع الصيانة انشر الإصدار في اللوحة أولًا. يُقبل تنسيق ثلاثة أرقام مثل 1.2.3 فقط. لا تتغير تواريخ النشر لحماية الحقوق المبيعة.
للسماح بـ1.x فقط اضبط 1.0.0–1.999.999 دون صيانة. بعد التحديث اتصل لاستلام توقيع الإصدار الجديد؛ ذاكرة القديم لا ترخصه.
توفير التنزيل
يمكن للسجل تضمين رابط HTTPS وبصمة SHA-256. تعرض البوابة الإصدارات المؤهلة فقط. السجلات تقدم روابط ولا ترفع المثبتات أو تثبت التحديثات تلقائيًا.
بوابة العملاء
يمكن للعملاء عرض التراخيص والأجهزة وفك الربط دون الدخول إلى لوحة المورّد.
يربط المورّد بريد العميل أولًا
أدخل البريد عند الإصدار أو الحقوق والعميل. أرسل بوابة العملاء للعميل. عند إدخال البريد يتلقى رابط دخول لمرة واحدة صالحًا 15 دقيقة. تستمر الجلسة 24 ساعة.
يرى العميل تراخيص بريده فقط، لا إدارة المنتجات أو الفواتير أو بيانات الآخرين. اضبط خدمة البريد في إعدادات المسؤول أولًا.
ماذا لو فقد العميل مفتاحه عند تغيير الكمبيوتر؟
- يدخل العميل البريد المرتبط بالترخيص ويفتح رابط الدخول المرسل إليه. الرابط يسجّل الدخول فقط ولا يفك ربط الجهاز.
- في أجهزتي/جلساتي اختر القديم وفك الربط والنقل ثم أكد.
- تعرض الصفحة رمزًا مؤقتًا صالحًا حتى 15 دقيقة ولتفعيل ناجح واحد. يمكن نسخه أو اختيار إرساله لبريد العميل.
- افتح البرنامج على الحاسوب الجديد وأدخل الرمز المؤقت. يتعرف SDK عليه ويربط الترخيص الأصلي ويحفظ اعتماد الجهاز. إعادة التشغيل والنبضات تستخدم الاعتماد؛ انتهاء الرمز لا يؤثر على الجهاز المفعّل.
يتغير ربط الجهاز فقط. يبقى المعرّف والانتهاء الأصلي والميزات والعميل والاستخدام المستهلك؛ لا يصدر ترخيص جديد. يجب أن يطابق الجهاز السياسة الأصلية وتتوفر له حصة جهاز.
ماذا يحتاج مورّد البرنامج إلى تغييره؟
حدّث إلى SDK الحالي. حقل مفتاح الترخيص يقبل أيضًا lv_tmp_ رموز النقل المؤقتة؛ ضعها في إعداد license_key يكفي؛ وتعمل Start والتحقق والنبضات كالمعتاد. يحفظ SDK بيانات اعتماد الجهاز في مجلد ذاكرة خاص؛cache_path يمكن تركه فارغًا. احفظ الملف في بيانات تطبيق المستخدم الحالي؛ ولا توزّعه مع برنامج التثبيت.
بعد نجاح الاستبدال يمكن للبرنامج مسح license_key فارغًا؛ أبقِ المنتج والمفاتيح العامة و cache_path، يستعيد SDK اعتماد الجهاز عند إعادة التشغيل. لا يحتاج العميل إلى حفظ الرمز المؤقت أو إدخاله مجددًا. أبقِ الإدخال حتى نجاح الاستبدال لإعادة المحاولة بعد انقطاع.
إذا انتهى الرمز أو أُغلقت الصفحة
ادخل مجددًا لعرض الرموز غير المستخدمة. بعد انتهاء رمز غير مستخدم، اطلبه بجانب الجهاز المحرر دون احتساب نقل جديد. لا يُعاد استخدام رمز مستهلك ولا إصداره مرارًا من سجل قديم لتجاوز الحد. للنقل التالي فك ربط الجهاز الحالي.
إذا كان الكمبيوتر الجديد دون اتصال تمامًا
أدخل الرمز المؤقت بالحاسوب الجديد وصدّر طلب التفعيل. قبل انتهائه احصل على رد عبر البوابة من حاسوب متصل ثم استورده بالجديد. يجب السماح بالتفعيل المعزول المرتبط بالجهاز. تبقى المدة الأصلية؛ احمِ الرد المحتوي على ترخيص الجهاز واعتماده.
حدود فك الربط وحالة الكمبيوتر القديم
اضبط حد التحرير الذاتي لكل ترخيص وشهر UTC. صفر يعطل فك الربط الجديد في البوابة. تكرار النقر وعرض الرموز وتجديد المنتهي غير المستخدم لا يزيد العدد. يشمل الحد البوابة وطلبات العميل المعزولة، لا التحرير اليدوي للمورّد أو طلب البرنامج بالمفتاح الأصلي.
فك الربط البعيد يمنع التحقق المتصل التالي. تبقى الذاكرة القديمة حتى الاتصال أو الانتهاء. لا يمكن إيقاف ذاكرة دائمة فورًا عن بُعد؛ استخدم تحققًا دوريًا للإلغاء السريع. تُرفض النسخ العادية للإعداد والاعتماد والذاكرة على حاسوب آخر لاختلاف الهوية.
تدير بوابة العملاء استخدام الترخيص. تبقى الطلبات ومدفوعات بيع البرامج في نظام المورّد الخاص.
إشعارات الأحداث
عند التفعيل أو التجديد أو الإلغاء يمكن لـLicentivo إخطار خادمك لمزامنة الطلبات والعملاء والدعم.
إضافة عنوان الإشعار
افتح إشعارات الترخيص وأضف عنوان HTTPS وحدد الأحداث. يظهر سر التوقيع مرة واحدة؛ احفظه على الخادم المستقبِل. في الإنتاج تُمنع العناوين المحلية والخاصة.
تحقق من التوقيع بعد الاستلام
اقرأ X-Licentivo-Timestamp وX-Licentivo-Event والنص الخام. ادمج الوقت + '.' + معرّف الحدث + '.' + النص واحسب HMAC-SHA256 بالسر، وأضف sha256= وقارن مع X-Licentivo-Signature بزمن ثابت. ارفض فرقًا يتجاوز 5 دقائق.
أزل التكرار بمعرّف الحدث. تحقق من التوقيع وخزّن الحدث في معاملة أو طابور دائم، ثم أعد 2xx. للنسخة المكررة أعد 2xx دون إعادة إجراءات الطلب.
ماذا يحدث عند الفشل؟
حتى 8 محاولات تلقائية بفواصل متزايدة. تعرض اللوحة الحالة والوقت والأخطاء وتسمح بإعادة الإرسال. الحدث وعملية الترخيص في معاملة واحدة؛ يتواصل الإرسال بعد إعادة التشغيل.
الأحداث تشمل الإنشاء والتعديل والتجديد والإلغاء والتفعيل والتحرير واستهلاك الميزات وقرب الانتهاء والانتهاء وتغير الصيانة. الإشعار يحمل بادئة الترخيص فقط، لا المفتاح الكامل.
العمليات الجماعية وتغيير السياسات
أصدر أو جدد أو ألغِ تراخيص العملاء دفعة واحدة. عاين الأثر قبل تعديل الحقوق السابقة.
إصدار جماعي أو استيراد
في التراخيص اختر الإصدار/الاستيراد الجماعي ثم المنتج والسياسة. أدخل اسمًا وبريدًا لكل سطر أو CSV برأس customer,customer_email. الحد 100 سطر. نزّل النتائج واحفظ الرموز الكاملة.
إذا فشل عنصر فلن تطبق الدفعة كلها. بعد المهلة أعد بنفس المحتوى؛ يعيد معرّف الطلب النتيجة الأصلية دون إصدار جديد.
تجديد أو إلغاء جماعي
حدد التراخيص ثم التجديد أو الإلغاء الجماعي. خانة الرأس تختار الصفحة؛ يبقى الاختيار بين الصفحات، حتى 100. تغيير المرشحات أو المغادرة أو التحديث يمسحه.
أدخل الأيام المضافة. غير المفعّل تزيد مدته، والمفعّل تمدد نهايته، والمنتهي يبدأ التمديد من الآن. قبل الإلغاء وسّع الاختيار وتحقق من العملاء؛ الإلغاء نهائي. أعضاء القراءة فقط لا ينفذونها.
طبّق سياسة جديدة على التراخيص الموجودة
- احفظ القواعد الجديدة في سياسات الترخيص.
- حدد تراخيص منتج واحد ثم تطبيق السياسة واختر السياسة الجديدة.
- راجع المدة والأجهزة/المقاعد والميزات والاستخدام والصيانة. إذا تجاوزت المقاعد المشغولة الحد الجديد أو بقيت أجهزة نشطة عند تغيير الربط، عالجها أولًا.
- طبّق بعد التأكيد. التحقق المتصل التالي يستلم ترخيصًا موقعًا جديدًا؛ الذاكرة المعزولة لا تتغير عن بُعد.
المعاينة صالحة 10 دقائق. عند تغير الترخيص أو السياسة أعدها. المدة الجديدة تعيد حساب الانتهاء من أول تفعيل أصلي؛ راجع التواريخ أولًا.
الأسئلة الشائعة
افحص رمز الخطأ أولًا ثم إعداداته. في الاستجابة، request_id يساعد في إيجاد العملية بالسجل؛ لا تضع المفاتيح الكاملة في السجلات أو الصور.
ماذا أفحص عند فشل التفعيل؟
تحقق من الوصول للخادم ومعرّف المنتج واكتمال رمز الترخيص وتطابق المنتج. قبل نشر الخادم لا يمكن لحاسوب العميل استخدام عنوانك 127.0.0.1 ؛ فهذا العنوان يشير إلى حاسوب العميل نفسه.
| رمز الخطأ | الخطوة الأولى |
|---|---|
LICENSE_INVALID | راجع معرّف المنتج والمفتاح الكامل ومنتج الترخيص |
LICENSE_EXPIRED | راجع الانتهاء؛ يجدده المورّد عند الحاجة |
LICENSE_REVOKEDDEVICE_RELEASED | الترخيص ملغى أو الجهاز محرر؛ يمسح SDK الذاكرة |
DEVICE_LIMIT_REACHED | مواضع الترخيص ممتلئة؛ حرر جهازًا أو زد الحد |
API_QUOTA_EXCEEDED | نفدت حصة API؛ راجع الفترة والباقة |
API_BALANCE_INSUFFICIENT | رصيد تجاوز API غير كافٍ؛ راجع العملة والبيئة |
MONTHLY_QUOTA_EXCEEDED | بلغ حد أجهزة المنصة، مستقل عن حد الترخيص |
IDEMPOTENCY_CONFLICT | مفتاح واحد لأجسام مختلفة؛ جديد للعملية الجديدة، والقديم عند الإعادة بنفس الجسم |
IDEMPOTENCY_EXPIRED | الاستجابة أو الربط القديم غير صالح؛ راجع الحالة ومفتاحًا جديدًا لعملية جديدة |
لماذا يستمر العمل دون اتصال؟
دون اتصال يتحقق SDK محليًا من التوقيع والمنتج والجهاز والميزات والانتهاء؛ يُحذف طلب الخادم فقط. الذاكرة المنتهية أو رفض متصل صريح بالإلغاء أو التحرير يمنع الاستمرار.
لماذا يفشل فحص التوقيع أو الجهاز؟
قد يفشل التحقق بسبب مفتاح عام مختلف أو ذاكرة منتج آخر أو نسخة على حاسوب آخر. راجع trusted_keys يستخدم معرّف المفتاح والمفتاح العام للمنتج الحالي، ثم تحقق من تبديل النظام أو إعادة تثبيته.
يعرض SDK clock rollback ؛ تحقق من رجوع الساعة، صححها ثم حدّث عند الاتصال.
استجابة الخطأ الكاملة
{
"error": {
"code": "LICENSE_REVOKED",
"message": "License was revoked"
},
"request_id": "99999999-9999-4999-8999-999999999999"
}| الحقل | المعنى والإجراء |
|---|---|
error.code · string | معرّف خطأ ثابت لمنطق البرنامج بدل نص message. |
error.message · string | سبب مقروء للتشخيص أو لصياغة رسالة العميل. |
request_id · UUID | معرّف HTTP من الخادم للسجلات؛ ليس الترخيص أو Idempotency-Key. |
400/415: صحّح الحقول أو Content-Type؛ 401: راجع مفتاح الإدارة؛ 403: عالج رمز خطأ الترخيص؛ 409: راجع الحصة أو الجلسة أو تعارض التكرار؛ 429: انتظر حسب Retry-After. أعد طلبات المهلة أو 5xx بفاصل زمني. للكتابة استخدم المعرّف والنص الأصليين لتجنّب العد المكرر.
كيف أقرأ استجابة JSON؟
استجابة ناجحة data و request_id؛ والفشل يعيد error.code، error.message و request_id. احفظ رمز الخطأ وrequest_id لتحديد المشكلة.
للبريد والدفع والنشر راجع الدعم واستكشاف الأخطاء.
اطّلع على جميع حقول API في ملف OpenAPI.