# مثال محول ترخيص يملكه التاجر

ينفذ مثال Python 3.10+ هذا جسر HTTP الخارجي لـ Launch مع حفظ أحداث/nonce في SQLite وعامل استعادة. وهو **لا** ينشئ تراخيص ولا يتحقق من الميزات المحمية ولا يحل محل نظام الترخيص الخاص بك.

نفّذ وحدة Python بالخطافات التالية:

```python
def apply_snapshot(snapshot):
    # Call your licensing system with snapshot["event_id"] as its durable
    # idempotency key. Apply desired_state and the absolute purchased dates.
    # Return only after confirming the original operation was applied.
    # Raise ValueError for a result requiring manual review.
    ...

def delivery(snapshot):
    # Read an existing result owned by this purchase; do not issue here.
    return {"type": "instructions", "value": "Your own delivery instructions", "expires_at": None}
```

استبدل `...` بالتكامل الفعلي قبل إعداد الخلفية. إذا لم تُهيأ وحدة خلفية، تطلق الخطافات المضمنة `NotImplementedError`؛ وتدخل الأحداث المراجعة اليدوية ولا تدعي إصدار ترخيص. يمكن للعامل في المثال إعادة محاولة خطاف بعد تعطل أو خطأ غير مؤكد، لذا يجب على خلفية الترخيص إزالة التكرار/الاستعادة باستخدام معرّف الحدث نفسه.

هيئ المحول بمتغيرات البيئة مع إبقاء المفتاح خارج التحكم بالمصدر وسجل shell:

- `CUSTOM_LICENSING_KEY`: ترميز Base64 قياسي لـ 32–128 بايت عشوائيًا، مطابق لـ Launch.
- `CUSTOM_LICENSING_KEY_ID`: القيمة `key-1` أو معرّف المفتاح الذي أعددته.
- `CUSTOM_LICENSING_CONNECTION_REF`: مرجع الاتصال المطابق.
- `CUSTOM_LICENSING_ENVIRONMENT`: القيمة `sandbox` أو `live`.
- `CUSTOM_LICENSING_DATABASE`: مسار SQLite خاص قابل للكتابة خارج نسخة العمل؛ احتفظ به عبر إعادة التشغيل.
- `CUSTOM_LICENSING_BACKEND`: وحدة قابلة للاستيراد تنفذ الخطافات أعلاه.
- `CUSTOM_LICENSING_PORT`: منفذ الاستماع المحلي، والافتراضي `18883`.

شغّل `python server.py`. لاختبار sandbox المحلي، اضبط `http://127.0.0.1:18883` في Launch وفعّل استثناء HTTP للعنوان الحلقي صراحة. للإنتاج استخدم إنهاء HTTPS والإشراف على العملية ونسخ قاعدة بيانات محمية والتحقق من SDK/بيئة التشغيل الخاصة بالخلفية. أعلن فقط أنواع الشراء/التسليم التي تدعمها الخلفية فعليًا؛ وعدّل `capabilities` وفق ذلك.

بعد إصلاح مشكلة الخلفية، يعيد `python server.py --retry-event ORIGINAL_EVENT_UUID` إدراج الحمولة المخزنة نفسها محليًا في الطابور. أعد أيضًا محاولة الحدث الأصلي في صفحة مهام الترخيص في Launch. لا تغير المعرّفات أو تضف وقتًا مرة أخرى لاستعادة استجابة.

المثال نقطة بداية وليس تأهيلًا للإنتاج. مدة إيجار العامل 60 ثانية؛ قيّد استدعاءات الخطاف بمهلة أقصر أو جدّد الإيجار. أضف المراقبة وإجراءات التدوير وفحوص الأعمال/المخطط الأكثر صرامة وضوابط تشغيل النشر قبل قبول مشتريات live. يحدد [دليل التكامل](/ar/launch-documents/external-licensing/) و[OpenAPI](/ar/assets/launch/external-licensing-openapi.json) البروتوكول. لا تستخدم استجابة حالة Launch مطلقًا كإذن لتنفيذ رمز محمي.
