انتقل إلى المحتوى
وثائق المطوّرينالبدء السريع

أضف الترخيص إلى برنامجك

خصص نحو 15 دقيقة لحماية التصدير: إعدادات ومثال ودمج واختبار الرفض. يجب أن تكون أدوات تطوير اللغة مثبتة مسبقًا.

يتولى SDK الطلبات وهوية الجهاز والتوقيع وبيانات الاعتماد والتخزين والنبضات. قدّم مفتاح العميل ودالة العمل؛ لا حاجة لطلبات HTTP يدوية أو حفظ activation_id.

  1. تنزيل حزمة التكاملأنشئ إعدادات المنتج في لوحة التحكم
  2. أنشئ ملفًا مُصدّرًاتحقق من الترخيص ونتيجة العملية
  3. أضفه إلى التطبيقبدء التشغيل ونقطة العملية والإغلاق

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 أدناه يوفر شفرة عامة دون إعدادات منتجك.

ما معنى كل حقل في الإعدادات؟
product.json · إعدادات المنتج المشتركة
{
  "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 بعد التثبيت
اللغةتكامل المشروع
Goimport licentivo "github.com/spf86/licentivo-sdk"
Javaimplementation(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;
Pythonfrom licentivo import Client
Node.jsimport {Client} from '@licentivo/sdk'
Rustuse licentivo::Client;
Rubyrequire 'licentivo'

احتفظ بمجلد .licentivo-sdk الخاص بـ Go وRust وC/C++ في المشروع. حدّد إصدارًا جديدًا للتحديث؛ تبقى product.json وذاكرة ترخيص العميل محفوظة.

نفّذ العمل المحمي عبر SDK وأغلق client عند الخروج.

Go · ترخيص العميل
正在加载代码…

شغّل هذا الملف باستخدام سكربت البدء السريع ←

استخدم مفتاح عميل آخر أو شغّل مثال البروتوكول الكامل

اضبط متغير البيئة وشغّل سكربت البدء دون خيار الاختبار. مفتاح الترخيص ليس مفتاح API للإدارة.

متغير البيئة لهذه الطرفية

عند النجاح تظهر الرسالة License OK: export is available. اجمع المفتاح عبر نافذة التفعيل في تطبيقك. لا يحتاج العميل إلى متغير بيئة؛ يحفظ SDK بيانات اعتماد الجهاز. لا تضع المفتاح في السجلات.

تشغيل التجربة الكاملة في الحزمة

فك ZIP مع الحفاظ على بنية المجلدات. ضع sdk-demo.json في جذر الحزمة المستخرجة. اختر النظام وافتح الطرفية فيه وشغّل:

أمر الطرفية

تُحرّر التجربة الجهاز عند الانتهاء.

هذا المثال الكامل للفحص المتقدم. ابدأ بـ start.ps1 أو start.sh؛ تحتفظ أمثلة البدء بتسجيل الجهاز عند الإغلاق المعتاد.

تشغيل مثال تطبيق

تتضمن الأمثلة إدخال التفعيل والحالة وتصدير الملفات وفك ربط الجهاز. 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 للإدارة يتحكم بمساحة العمل كلها؛ لا تضعه في برنامج العميل أو صفحة عامة.

إنشاء مفتاح

  1. سجّل الدخول بصفة Owner لمساحة العمل وافتح API Key ثم اختر إنشاء API Key.
  2. سمّه حسب الاستخدام، مثل «نظام الطلبات». اختر القراءة فقط للاستعلام أو القراءة والكتابة لإنشاء التراخيص وتعديلها. الصلاحية من 1 إلى 365 يومًا.
  3. انسخ المفتاح كاملًا فور الحفظ؛ يُعرض مرة واحدة فقط. احفظه في إعدادات خادم خاصة أو متغير بيئة.

أرسل أول طلب إداري

يقرأ المثال قائمة المنتجات. اضبط LICENTIVO_URL على عنوان خادم الترخيص واضبط LICENTIVO_API_KEY على المفتاح الكامل الذي أنشأته ثم نفّذ:

curl
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. يتولى التفعيل وهوية الجهاز والتحقق من التوقيع والتخزين المؤقت والنبضات وحجز الاستخدام وتأكيده وإلغاءه.

بدء التشغيل أو شاشة التفعيلقبل الميزات المدفوعةعند خروج التطبيق

استدعاء SDK

في الأمثلة، يأتي client من البدء وpath هو مسار التصدير وexportReport / export_report هي دالتك. jobID معرف ثابت تحفظه تطبيقات الاستخدام المحسوب.

راجع الكود الكامل ← · البدء السريع · راجع دمج الاستخدام المحسوب وإعادة المحاولة ←

ضع كود العملية في دالة الاستدعاء.

ينفذ SDK العملية عند السماح فقط. لا يخصم RunFeature استخدامًا؛ يحجز RunMeteredFeature ويؤكد النجاح ويلغي الفشل. أعد المهمة الأصلية لتسوية التأكيد دون تكرار العملية المكتملة.

عرض طلبات HTTP واستجاباتها (للعملاء المخصصين أو استكشاف الأخطاء)

تنفّذ حزم SDK البروتوكول أدناه. لا تحتاج التطبيقات التي تستخدم حزم SDK التسع إلى تنفيذه من جديد.

أول تفعيلنبضات أثناء التشغيلتحقق من الصلاحيات قبل العملياتفك الربط قبل نقل الجهاز

تتحقق الواجهات الثماني من الترخيص وهوية الجهاز دون ملفات دخول أو CSRF أو مفاتيح إدارة. تُحرر الجلسات العائمة عند الخروج ويبقى تسجيل الأجهزة المرتبطة.

كيف أفحص السماح بعد التفعيل أو التحقق أو النبضات؟

  1. تأكد من HTTP 200 واقرأ data.activation_id. أرسل هذا المعرّف مع التحقق والنبضات والقياس وفك الربط لاحقًا.
  2. تحقق بمفتاح المنتج العام الموثوق مسبقًا data.lease ثم طابق المنتج والجهاز والمدة والميزات. فك payload إلى JSON وحده لا يثبت صلاحية الترخيص.
  3. ينفّذ SDK أول خطوتين تلقائيًا. يفحص RunFeature الصلاحية قبل العمل، ويتولى RunMeteredFeature الحجز والتأكيد والإلغاء للعدادات.

يحفظ SDK الذاكرة الموقعة ويرسل النبضات وفق السياسة. لا تمسح ذاكرة صالحة لمجرد مهلة شبكة. عند الإلغاء أو التحرير أو الانتهاء الصريح، امنع الميزات المحمية حسب نتيجة SDK.

ما معاني حقول payload بعد فك الترميز؟

المثال لشرح البيانات فقط. عند تنفيذ التحقق استخدم بايتات payload الأصلية المستلمة؛ لا تعِد ترتيب JSON أو تسلسله قبل التحقق.

مثال payload

إعادة المحاولة والنبضات والفوترة

مطلوب للتفعيل وفك الربط والقياس 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 تعيد نتيجة الطلب الأصلي.

يستخدم الجهاز غير المتصل قواعده الموقعة السابقة. الاتصال وحده لا يحدّث الذاكرة؛ يجب نجاح طلب. يمكن للتطبيق طلب التحديث عند عودة الشبكة.

يحدّث هذا قواعد التشغيل.

المدة وحد الأجهزة والميزات محفوظة لكل ترخيص. تعديل السياسة لا يعيد كتابتها تلقائيًا. عدّل حقوق الترخيص من صفحة التراخيص.

تحديث متصل عند الطلب

تحاول هذه الطرق الاتصال دائمًا، حتى مع العمل الدائم دون اتصال وإيقاف النبضات. النجاح يحدّث التوقيع؛ فشل الشبكة يبلغ بفشل التحديث ويحفظ ذاكرة ما زالت صالحة. الإلغاء أو التحرير الصريح يمسحها.

اللغةطريقة الاستدعاء
Goclient.RefreshOnline(ctx)
Javaclient.refreshOnline()
Cln_refresh_online(client)
C++client.RefreshOnline()
C#await client.RefreshOnline()
Pythonclient.refresh_online()
JavaScriptawait client.refreshOnline()

يُحسب التحديث الناجح كطلب تفعيل API واحد. إذا فعّلت السياسة نبضات كانت معطلة، استدعِ StartHeartbeat للغتك لبدء الجدولة. الجهاز غير المتصل لا يتلقى تحديثات الإلغاء أو التحرير.

ربط الأجهزة

مع ترخيص جهاز واحد، نسخ البرنامج والذاكرة إلى حاسوب عادي آخر لا ينقل ترخيص الحاسوب الأصلي.

كيف يحدد SDK هوية الكمبيوتر؟

عند كل بدء يقرأ SDK هوية النظام ويحسب التجزئة مع معرّف المنتج. يتضمن توقيع الخادم التجزئة، ويتحقق منها محليًا أيضًا.

يقرأ Windows ‏MachineGuid وLinux ‏machine-id وmacOS ‏IOPlatformUUID. تُرسل التجزئة فقط، لا الهوية الأصلية. حقل الإعداد القديم device_id لا يستبدل هوية الجهاز الفعلية.

ماذا يحدث عند نسخ ملفات الجهاز A إلى B؟

  1. يتفعّل A ويتلقى توقيعًا مرتبطًا بتجزئة جهازه.
  2. يقرأ B هويته فيحصل على تجزئة مختلفة ويرفض ذاكرة A.
  3. يجب تفعيل B متصلًا. إذا كان الحد جهازًا واحدًا وما زال A مرتبطًا، يرفض الخادم B.

كيف يغيّر العميل جهاز الكمبيوتر؟

يفك العميل ربط الحاسوب القديم ثم يفعّل الجديد. إذا تلف القديم، حرّره من تفعيلات الأجهزة في اللوحة. تغيير الحاسوب لا يعيد مدة الترخيص.

إعادة تثبيت النظام قد تغيّر هويته وتستلزم تفعيل جهاز جديد. استنساخ النظام الكامل أو تزوير الهوية أو تعديل العميل هجمات أقوى؛ تجزئة الجهاز وحدها لا تضمن منعها.

مع فترات عدم اتصال طويلة، لا يعرف توقيع A بتحريره فورًا؛ يلزم طلب ناجح لتحديث الحالة. المدة الأطول تؤخر تطبيق القيود عن بُعد.

تجزئة الجهاز المشتركة بين اللغات
تستخدم SDK التسع الخوارزمية نفسها
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 إلى حاسوب متصل.

الخطوات

  1. حمّل إعداد SDK على الحاسوب المستهدف واستدعِ OfflineRequest("activate") واحفظ الطلب. إنشاؤه لا يتصل بالخادم.
  2. على حاسوب متصل افتح التفعيل بملف دون اتصال، وارفع الطلب ونزّل الاستجابة. يمكن للعميل النهائي استخدام بوابته أيضًا.
  3. أعد الاستجابة واستدعِ ImportOffline بالطلب الأصلي والاستجابة. يتحقق SDK من التوقيع ومعرّف الطلب والإصدار وهوية الجهاز ثم يحفظ الذاكرة.
  4. تحقق من الإذن باستخدام CheckFeature. الحاسوب المعزول لا يحتاج نبضات متصلة؛ تحدد السياسة مدة عدم الاتصال.

التفعيل بالملف للتراخيص المرتبطة التي تسمح بعدم الاتصال فقط. الطلب صالح 30 يومًا. يبدأ الترخيص المؤقت عند موافقة الخادم لأنه لا يعرف وقت استيراد الرد.

كيف أفك الربط دون اتصال؟

أنشئ OfflineRequest("deactivate") على الحاسوب الأصلي. يمسح SDK الذاكرة أولًا ثم قدم الطلب للمورّد أو البوابة. المسح لا يثبت غياب النسخ السابقة. للإيقاف السريع اختر سياسة تحقق متصل دوري.

الأسماء في كل لغة

اللغةإنشاء الطلباستيراد الاستجابة
GoOfflineRequest("activate") → []byteImportOffline(requestBytes, responseBytes)
JavaofflineRequest("activate") → نص JSONimportOffline(requestText, responseText)
JavaScriptofflineRequest("activate") → objectimportOffline(requestObject, responseObject)
Cln_offline_request(client, "activate")ln_import_offline(client, requestText, responseText)
C++ / C#OfflineRequest("activate") → نص JSONImportOffline (نص C++ وبايتات C#)
Pythonoffline_request("activate") → dictimport_offline(requestDict, responseDict)

في C حرر النص المرجع باستخدام ln_free_string. مرر محتوى ملف الاستجابة نفسه، لا غلاف data في API الويب.

حدود استخدام الميزات

صلاحية التصدير تختلف عن 500 تصدير شهريًا. يفحص RunFeature الصلاحية، ويؤكد RunMeteredFeature الاستخدام بعد نجاح العملية.

السماح بـ 500 تصدير شهريًا

أضف export إلى الميزات ثم حصة: export، ‏500، شهريًا. الافتراضي يرفض بعد نفادها. للسماح بزيادة اضبط أقصاها؛ يسجل النظام التجاوز لنظام طلباتك.

تتجدد الحصص اليومية والشهرية عند منتصف ليل UTC؛ التراكمية لا تتجدد. تغيير الحد لا يمسح الاستخدام السابق.

تأكيد الاستخدام بعد نجاح التصدير

مرّر دالة العملية إلى SDK. استخدم معرفًا جديدًا لكل مهمة جديدة، ونفس المعرف والميزة والكمية لإعادة المحاولة. لا تشغّل نفس المعرف بالتوازي في عمليات مختلفة.

اللغةاستدعاء عملية محسوبة
Goclient.RunMeteredFeature(ctx, "export", 1, jobID, exportReport)
Javaclient.runMeteredFeature("export", 1, jobID, this::exportReport)
Node.jsawait client.runMeteredFeature("export", 1, jobID, exportReport)
Pythonclient.run_metered_feature("export", 1, job_id, export_report)
C#await client.RunMeteredFeature("export", 1, jobID, ExportReport)
C++client.RunMeteredFeature("export", 1, jobID, exportReport)
Rustclient.run_metered_feature("export", 1, &job_id, || export_report())?
Rubyclient.run_metered_feature("export", 1, job_id) { export_report }
Cln_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.

يحفظ SDK المهام التي تنتظر التأكيد.

إذا نجح العمل وفشل التأكيد، تعيد المحاولة التأكيد فقط دون العمل. التعطل أثناء العمل يمنع إعادة التنفيذ تلقائيًا. افحص نتيجتك الدائمة ثم استخدم ResolveMeteredFeature للتأكيد أو الإلغاء. العدّ البعيد والعمل المحلي ليسا معاملة واحدة.

عند الحاجة للتحكم بالحجز بنفسك
  1. أنشئ معرّف مهمة لهذا التصدير واحفظه.
  2. احجز وحدة وابدأ التصدير فقط بعد pending. يعني committed أن العمل اكتمل؛ لا تنفذه مجددًا.
  3. بعد نجاح التصدير وحفظ النتيجة، استدعِ Commit لتأكيد الاستخدام.
  4. إذا فشل التصدير قبل اكتماله، استدعِ Cancel لإلغاء الحجز دون احتساب الاستخدام.

الحجز صالح 15 دقيقة افتراضيًا، ويُقصّر عند إعادة ضبط فترة UTC. يمكن للـ API ضبط reservation_seconds إلى 30–3600 ثانية.

اللغةحجزتأكيد / إلغاء
GoReserve(ctx, "export", 1, jobID)Commit / Cancel(ctx, hold.ID, jobID)
Java / Node.jsreserve("export", 1, jobID)commit / cancel(id, jobID)
Cln_reserve(client, "export", 1, jobID)ln_commit / ln_cancel(client, id, jobID)
C++ / C#Reserve("export", 1, jobID)Commit / Cancel(id, jobID)
Pythonreserve("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 ساعة.

يرى العميل تراخيص بريده فقط، لا إدارة المنتجات أو الفواتير أو بيانات الآخرين. اضبط خدمة البريد في إعدادات المسؤول أولًا.

ماذا لو فقد العميل مفتاحه عند تغيير الكمبيوتر؟

  1. يدخل العميل البريد المرتبط بالترخيص ويفتح رابط الدخول المرسل إليه. الرابط يسجّل الدخول فقط ولا يفك ربط الجهاز.
  2. في أجهزتي/جلساتي اختر القديم وفك الربط والنقل ثم أكد.
  3. تعرض الصفحة رمزًا مؤقتًا صالحًا حتى 15 دقيقة ولتفعيل ناجح واحد. يمكن نسخه أو اختيار إرساله لبريد العميل.
  4. افتح البرنامج على الحاسوب الجديد وأدخل الرمز المؤقت. يتعرف 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. تغيير المرشحات أو المغادرة أو التحديث يمسحه.

أدخل الأيام المضافة. غير المفعّل تزيد مدته، والمفعّل تمدد نهايته، والمنتهي يبدأ التمديد من الآن. قبل الإلغاء وسّع الاختيار وتحقق من العملاء؛ الإلغاء نهائي. أعضاء القراءة فقط لا ينفذونها.

طبّق سياسة جديدة على التراخيص الموجودة

  1. احفظ القواعد الجديدة في سياسات الترخيص.
  2. حدد تراخيص منتج واحد ثم تطبيق السياسة واختر السياسة الجديدة.
  3. راجع المدة والأجهزة/المقاعد والميزات والاستخدام والصيانة. إذا تجاوزت المقاعد المشغولة الحد الجديد أو بقيت أجهزة نشطة عند تغيير الربط، عالجها أولًا.
  4. طبّق بعد التأكيد. التحقق المتصل التالي يستلم ترخيصًا موقعًا جديدًا؛ الذاكرة المعزولة لا تتغير عن بُعد.

المعاينة صالحة 10 دقائق. عند تغير الترخيص أو السياسة أعدها. المدة الجديدة تعيد حساب الانتهاء من أول تفعيل أصلي؛ راجع التواريخ أولًا.

الأسئلة الشائعة

افحص رمز الخطأ أولًا ثم إعداداته. في الاستجابة، request_id يساعد في إيجاد العملية بالسجل؛ لا تضع المفاتيح الكاملة في السجلات أو الصور.

ماذا أفحص عند فشل التفعيل؟

تحقق من الوصول للخادم ومعرّف المنتج واكتمال رمز الترخيص وتطابق المنتج. قبل نشر الخادم لا يمكن لحاسوب العميل استخدام عنوانك 127.0.0.1 ؛ فهذا العنوان يشير إلى حاسوب العميل نفسه.

رمز الخطأالخطوة الأولى
LICENSE_INVALIDراجع معرّف المنتج والمفتاح الكامل ومنتج الترخيص
LICENSE_EXPIREDراجع الانتهاء؛ يجدده المورّد عند الحاجة
LICENSE_REVOKED
DEVICE_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 ؛ تحقق من رجوع الساعة، صححها ثم حدّث عند الاتصال.

استجابة الخطأ الكاملة

HTTP 403 · ترخيص ملغى
{
  "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 لتحديد المشكلة.

للبريد والدفع والنشر راجع الدعم واستكشاف الأخطاء.