Skip to main content

مركز التفضيلات: صفحة التفضيل/إلغاء الاشتراك العامة

النسخة الإنجليزية الأصلية: Preference center: the public opt-in/opt-out page.
مركز التفضيلات صفحة عامة تدير فيها جهة الاتصال اشتراكاتها في القنوات، وموضوعات الاشتراك، وتكرر الرسائل، وتقدّم (إن فعّلتَ الخيار) طلب حذف البيانات — من دون حساب ومن دون تسجيل دخول. تصل كل جهة اتصال إليها عبر رابط موقّع: يحمل الرابط رمز HMAC-SHA256 بصيغة v1.<payload>.<signature> تنتهي صلاحيته بعد 30 يومًا، فتبقى الصفحة ذاتية الخدمة ومقتصرة في الوقت نفسه على جهة اتصال واحدة في منظمة واحدة بالضبط. توجد نسخة ملخّصة من سطح النقاط النهاية أيضًا داخل بوابات الإرسال؛ هذا الدليل هو الاستعراض الكامل: كل حقل تكوين، وأين تضع الرابط، وما الذي تعيده واجهة الصفحة العامة، وأي أسطح امتثال يكتبها إلغاء الاشتراك أو التفضيل. جذر جميع النقاط النهاية أدناه هو https://api.orbit.devotel.io/api/v1/compliance.
مركز التفضيلات تحكم تملكه أنت المستأجر: أنت تختار القنوات والموضوعات والعلامة التجارية، وتحتفظ منظمتك بأدلة الموافقة. Orbit تدير المنصة؛ أما قرار الموافقة فيعود إلى جهة الاتصال. هذا الدليل ليس استشارة قانونية — تأكّد من التزاماتك لدى مستشارك القانوني.

1. كوّن مرة واحدة: POST/GET /preference-center

اضبط التكوين عبر POST /preference-center (مفتاح API بصلاحية owner/admin). تكتب النقطة النهاية التكوين في إعدادات منظمتك وتعيد الكائن المحفوظ — نفّذها مجددًا للتحديث. تقرأ GET /preference-center التكوين الحالي؛ قبل التكوين تعيد enabled: false مع رسالة تلميح.

حقول التكوين

يُتحقق من كل حقل في الخادم — يعيد طلب POST المرفوض 422 مع مسائل لكل حقل (field، message) لتعرف أيّها فشل.

موضوعات الاشتراك

الموضوع مجموعة مسماة — نشرة بريدية، تحديثات منتج، تنبيهات فوترة — يمكن لجهة الاتصال الاشتراك فيها أو الانسحاب منها من دون مسّ القناة كاملة. يجب أن تكون معرّفات id للموضوعات فريدة ومطابقة لنمط السلاغ ([a-z0-9][a-z0-9_-]{0,63})؛ ولكل مدخل:
  • name (1–120 محرفًا) — الاسم الظاهر في الصفحة.
  • description (اختياري، ≤500) — سطر سياق واحد يظهر بجانب المفتاح.
  • defaultOptIn (الافتراضي false) — كيف تُعامل جهة الاتصال التي لا تفضيل مسجلًا لها.
  • archived (اختياري) — تبقى الموضوعات المؤرشفة في سجل التدقيق لكنها لم تعد تظهر في الصفحة.
ملاحظات على مستوى اللينّت: تُرفض الروابط التي تفشل تنقية مخطط http(s) مسبقًا، وتفشل معرّفات الموضوعات المكررة برسالة “Topic ids must be unique” بدلًا من أن تُستبدل صمتًا.

2. أنشئ رابطًا لكل جهة اتصال

بعد التكوين، أنشئ رابطًا لجهة اتصال واحدة في كل مرة عبر POST /preference-center/link:
يعيد الاستجابة link — رابطًا بصيغة ${DEVOTEL_WEB_URL}/preferences?token=v1…. نقاط يجدر الانتباه إليها:
  • يستهدف الرابط الصفحة المستضافة لا نقطة النهاية JSON. انسخه كما هو في قوالب التذييل/المرسل لديك؛ تجلب الصفحة نفسها نقطة النهاية البيانات تحت الغطاء.
  • صلاحية 30 يومًا. بعدها يتحقق الرمز منتهيَ الصلاحية وعلى جهة الاتصال طلب رابط جديد (إنشاء رابط جديد يستدعي API مرة واحدة).
  • الصفحة محايدة Locale وقت الإنشاء. يحل تطبيق الويب عملية إعادة توجيه مع إبقاء استعلام ?token=، فلا تحتاج إلى تخمين locale جهة الاتصال.

أين تضعه

  • إرسالات تسويقية بنص حر: يُضاف نيابةً عنك. لا تحتاج إلى وضع الرابط. تُلحق Orbit سطر {optOutMessage}: {link} بكل إرسال تسويقي بنص حر ما دام مركز التفضيلات مفعّلًا — على sms وwhatsapp عبر نطاقك القصير المميز، وعلى email وبقية قنوات النص الحر كرابط مرمّز خام — وتُستثنى الإرسالات القالبية. الصفحة نفسها تشرح متى يظهر التذييل، وماذا يكتب النقر الملحق، وكيف يرتبط بصيغة “Reply STOP” لدى الناقل: انظر مركز التفضيلات: متى تلحق Orbit تذييل إلغاء الاشتراك نيابة عنك.
  • الإرسالات التعاملية والقالبية: ضعه بنفسك. لا تحمل هذه الإرسالات التذييل الملحق أبدًا، لذا الرابط المنشأ أعلاه هو وسيلتها للحصول على إلغاء اشتراك بلمسة واحدة: انسخه كما هو في موضع إلغاء الاشتراك من قوالب بريدك، وأدرجه في النسخ القالبية أو المتون التعاملية حيث تريد واحدًا. إنشاء رابط قصير متتبع لكل موضع اختياري؛ إن فشل إنشاء الرابط القصير يظل الرابط الخام يعمل — البديل إضافي ولا يكون أبدًا ركيزة امتثال.
  • إعادة تفضيل مدفوعة بالكبت. حين تعاود جهة الاتصال التفضيل عبر مسار آخر، يمكنك منحها رابطًا جديدًا لتحصل على الصفحة الذاتية نفسها.

3. صفحة الرمز العامة

تقرأ الصفحة المستضافة وتكتب عبر نقطتي نهاية غير موثّقتين تُحصران بالرمز الموقّع:
  • GET /preferences/:token — يعيد حمولة الصفحة.
  • PUT /preferences/:token — يطبّق التحديثات.
تعيد أشكال الرموز غير الصالحة 400 INVALID_TOKEN؛ وتعيد الرموز المنتهية أو المعدّلة 401 TOKEN_EXPIRED مع “Please request a new link.”

استجابة GET

تجمع الحمولة الحالة الحالية لجهة الاتصال وتكوين المنظمة:
البريد والهاتف مقنّعان في الاستجابة العامة — لا تُظهر الصفحة أبدًا المعرّف الخام الذي تُستدعى به. وconsentHistory هو سجل تدقيق التفضيل/إلغاء التفضيل لجهة الاتصال بترتيب الأحدث أولًا، بسقف 20 صفًا، مرسومًا من دفتر الموافقات نفسه الذي يراه مشغّلوك في لوحة التحكم.

جسم طلب PUT

  • channelPreferences — يُسمح بخريطة جزئية (سجل جزئي في Zod)؛ تُطلب قناة واحدة على الأقل.
  • frequencyPreference — اختياري، إحدى all، important_only، weekly_digest، monthly_digest.
  • topicPreferences — خريطة اختيارية بصيغة { topicId: opted_in | opted_out } يُتحقق منها مقابل موضوعاتك المكوّنة؛ تُتجاهل المعرّفات غير المعروفة.
  • requestDataDeletion — يسجّل طلب حذف GDPR إلى جانب إلغاء الاشتراك (انظر القسم 6).
تحمل استجابة 422 مسائل لكل حقل ليشير النموذج المستضاف إلى الخيار غير الصالح.

4. كيف تجري التحديثات

التفضيل/إلغاء التفضيل المكتوب هنا ليس مجرد علم واجهة — تُحدَّث أسطح الامتثال الأربعة نفسها التي تكتبها كلمة STOP المفتاحية:
  • دفتر الموافقات. يُضاف صف consent_records واحد لكل قناة (أو لكل موضوع) مع source: preference_center — سجل تدقيق عبء الإثبات وفق GDPR Art 7 لديك.
  • قائمة الكبت. عند أي قناة ملغاة، يُدرج هاتف/بريد جهة الاتصال المقنّن بنطاق all — حجب عابر للقنوات تقرأه كل بوابات الإرسال.
  • سور STOP. يُضبط سور Redis سريع المسار عند إلغاء الاشتراك (ويُمسح عند إعادة التفضيل الكاملة)، فترى دفعات الحملات الجارية التغيير قبل أن يسري الكبت الأبطأ في قاعدة البيانات.
  • سجل التدقيق. يُسجَّل compliance.preference_center_updated عند تغيير التكوين، وتُلتقط أحداث التفضيل/الإلغاء على مستوى جهة الاتصال في دفتر الموافقات.
إعادة التفضيل متناظرة: التفضيل الكامل (كل القنوات opted_in) يُبطل صفوف الكبت النشطة لهاتف جهة الاتصال ويمسح سور STOP، فيما يكسب دفتر الموافقات المدخل المعكوس.
الموضوع مقابل القناة. إلغاء الاشتراك على مستوى القناة يفوز دائمًا — مفتاح الموضوع يضيّق الموافقة داخل القنوات التي ما تزال جهة الاتصال تقبلها. معرّفات الموضوعات غير المعروفة في PUT تُتجاهل بدل حفظها، فلا يستطيع نموذج قديم كتابة مفاتيح سمات اعتباطية.

5. دلالات مفتاح حذف GDPR

حين يكون showGdprDelete مفعّلًا وتؤشر جهة الاتصال requestDataDeletion: true في PUT، تسجّل الواجهة طلب حذف GDPR تقليديًا — صف pending موسومًا لعملية حذف البيانات لديك — إلى جانب إلغاء الاشتراك. هذا الوسم مقصود: مفتاح الحذف في مركز التفضيلات يوسم جهة الاتصال، لكنه لا يشغّل خط أنابيب DSAR المتتبع.
ليس لمفتاح الحذف في مركز التفضيلات ساعة SLA، ولا تصدير بيانات مفكوك التشفير، ولا شهادة محو وفق المادة 17. لطلب حق المحو الذي يحتاج مسؤول حماية البيانات (DPO) لديك إلى تتبّعه، قدّمه عبر نقطة نهاية DSAR (POST /compliance/dsar، بصلاحية owner/admin) — انظر طلبات الوصول من أصحاب البيانات ودليل DSAR + سجل الخروقات.

6. اختباره

مثالان(curl) جاهزان يمكنك لصقهما في سكربت تدخين: حفظ التكوين:
المتوقع: 201 مع صدى التكوين المحفوظ. إنشاء رابط وتجربة النقاط العامة:
المتوقع: يعيد GET تفضيلات جهة الاتصال الحالية؛ ويعيد PUT updated: true مع التفضيلات المطبّقة، وعند الطلب مدخل gdprRequest. أشهر الإخفاقات التي تفحصها: 400 INVALID_TOKEN (رمز مشوّه)، 401 TOKEN_EXPIRED (انقضاء الصلاحية أو عدم تطابق التوقيع — أنشئ رابطًا جديدًا)، 422 VALIDATION_ERROR (مسائل على مستوى الحقول في جسم التكوين أو التحديث)، و404 NOT_FOUND عند تعطيل مركز التفضيلات أو عدم وجود معرّف جهة الاتصال.