مركز التفضيلات: صفحة التفضيل الإلكترونية العامة
مركز التفضيلات هو صفحة عامة تدير فيها جهة الاتصال خيارات قنواتها الخاصة، ومواضيع الاشتراك، وتردد الرسائل، و (إذا فُعّل) تقديم طلب حذف البيانات — بدون حساب، بدون تسجيل دخول. تصل كل جهة اتصال إليها عبر رابط مُوقَّع: يحمل العنوان رمز HMAC-SHA256 (v1.<payload>.<signature>) ينتهي صلاحيته بعد 30 يومًا، لذا تبقى الصفحة خدمة ذاتية لكنها محصورة بجهة اتصال واحدة في منظمة واحدة.
سطح نقطة النهايات المُلخَّص يعيش أيضًا داخل حُواجز الإرسال؛ هذا الدليل هو الجولة الكاملة: كل حقل التكوين، أين يوضع الرابط، ما تُعيد API الصفحة العامة، وأي أسطح امتثال يكتب إلغاء الاشتراك أو إعادة الاشتراك.
جميع نقاط النهايات أدناه مُعرَّفة في https://api.orbit.devotel.io/api/v1/compliance.
النسخة الإنجليزية الأصلية: Preference center: the public opt-in/opt-out page.
مركز التفضيلات هو تحكم يخص المستأجر: أنت تختار القنوات والمواضيع والعلامة التجارية، ومنظمتك تحتفظ بأدلة الموافقة. Orbit يشغّل المنصة؛ قرار الموافقة يخص جهة الاتصال. هذا الدليل ليس نصيحة قانونية — أكّد التزاماتك مع مستشارك القانوني.
1. كوّن مرة واحدة: POST/GET /preference-center
عيّن التكوين بـPOST /preference-center (مفتاح API المالك/المشرف). نقطة النهاية ترفع التكوين إلى إعدادات منظمتك وتعيد الكائن المُحفوظ — أعد تشغيله لتحديث. GET /preference-center يقرأ التكوين الحالي؛ قبل التكوين يعيد enabled: false برسالة تلميح.
حقول التكوين
كل حقل مُتحقَّق منه على الخادم — POST مرفوض يعيد422 بمشاكل على مستوى الحقل (field, message) حتى تعرف أي حقل فشل.
مواضيع الاشتراك
الموضوع هو مجموعة مُسمَّاة — النشرة الإخبارية، تحديثات المنتج، تنبيهات الفوترة — تُبدِّلها جهة الاتصال دون لمس القناة كاملة. يجب أن تكونid الموضوعات فريدة وتُطابق نمط الـ slug ([a-z0-9][a-z0-9_-]{0,63})؛ كل إدخال له:
name(1–120 حرفًا) — الاسم المُعروض على الصفحة.description(اختياري، ≤500) — سطر سياق واحد معروض بجانب المفتاح.defaultOptIn(افتراضيfalse) — كيف تُعامَل جهة اتصال بدون تفضيل مُسجَّل.archived(اختياري) — المواضيع المؤرشفة تبقى في مسار التدقيق لكنها لم تعد تظهر على الصفحة.
http(s) تُرفَض مقدمًا، و id الموضوعات المكررة تفشل مع «يجب أن تكون id الموضوعات فريدة» بدلاً من الكتابة الصامتة.
2. أنشئ رابطًا لكل جهة اتصال
بعد التكوين، أول رابط لجهة اتصال واحدة كل مرة بـPOST /preference-center/link:
link — عنوان من الشكل ${DEVOTEL_WEB_URL}/preferences?token=v1…. نقاط للانتباه:
- الرابط يستهدف الصفحة المُستضافة، ليس نقطة النهاية JSON. انسخه حرفيًا في قوالب التذييل/المرسل؛ الصفحة نفسها تجلب نقطة النهاية البيانات في الخلفية.
- TTL 30 يومًا. بعد ذلك يتم التحقق من الرمز كمنتهي الصلاحية ويجب على جهة الاتصال طلب رابط جديد (إنشاء جديد يأخذ استدعاء API واحد).
- الصفحة لا تعرف اللغة عند الإنشاء. تطبيق الويب يُحل إعادة توجيه مع الحفاظ على استعلام
?token=، لذا لا تحتاج لتخمين لغة جهة الاتصال.
أين يوضع
- تذييل البريد الإلكتروني (الأساسي). أرفق الرابط المُولَّد (أو المتغير القصير المُتتبَّع الذي يستخدمه مرسلك) في منطقة إلغاء الاشتراك في قوالب التسويق.
- احتياط SMS / WhatsApp. عندما لا يحتوي الرسالة على كتلة تذييل، أرفق الرابط في السطر:
{optOutMessage}: {link}. المُساعِد الذي يبني أجسام الصادرة يقبل رابطًا قصيرًا مُسبَّقًا، لذا ما زالت نقرة إلغاء الاشتراك تأخذ التَنسِيب العادي للنقر. - إعادة اشتراك موجَّهة بالحظر. عندما تعيد جهة اتصال الاشتراك عبر تدفق آخر، يمكنك إعطاؤها رابطًا جديدًا لتأخذ نفس صفحة الخدمة الذاتية.
3. صفحة الرمز العامة
تقرأ الصفحة المُستضافة وتكتب عبر نقطتي نهاية غير مُصادَق عليهما محميتين بالرمز المُوقَّع:GET /preferences/:token— تُعيد حمولة الصفحة.PUT /preferences/:token— تُطبَّق التحديثات.
400 INVALID_TOKEN؛ الرموز المنتهية أو المُعبَّث بها تُعيد 401 TOKEN_EXPIRED مع «يرجى طلب رابط جديد.»
استجابة GET
الحمولة تجمّع حالة جهة الاتصال الحالية وتكوين المنظمة:consentHistory هو مسار تدقيق opt-in/opt-out الأحدث أولاً لجهة الاتصال، مُقيَّد بـ 20 صفًا، مُستخرَج من نفس دفتر الموافقة الذي يراه المشغّلون في لوحة التحكم.
جسم طلب PUT
channelPreferences— خريطة جزئية مسموحة (Zod سجل جزئي)؛ متطلب قناة واحدة على الأقل.frequencyPreference— اختياري، واحد منall,important_only,weekly_digest,monthly_digest.topicPreferences— خريطة{ topicId: opted_in | opted_out }اختيارية مُتحقَّقة مقابل موضوعاتك المُكوَّنة؛ الـ id غير المعروفة تُتجاهَل.requestDataDeletion— تُعيَّن طلب حذف GDPR بجانب إلغاء الاشتراك (انظر القسم 6).
4. كيف تتدفق التحديثات
إلغاء الاشتراك/إعادة الاشتراك المكتوب هنا ليس مجرد علم واجهة مستخدم — نفس أربع أسطح امتثال التي تكتب كلمة STOP تُحدَّث:- دفتر الموافقة. صف
consent_recordsواحد لكل قناة (أو لكل موضوع) يُرفَق بـsource: preference_center— مسار تدقيق عبء البراهين GDPR المادة 7. - قائمة الحظر. على أي قناة مُلغاة الاشتراك، يُدخَل الهاتف/البريد الإلكتروني القانوني لجهة الاتصال بمجال
all— حظر عبر القنوات تقرأه كل بوابة إرسال. - سور STOP. يُوضَع سور مسار سريع Redis عند إلغاء الاشتراك (ويُمحى عند إعادة الاشتراك الكامل)، لذا تُطْلع دفعات الحملات أثناء الطيران على التغيير قبل أن تنتشر الحظر الأبطأ من قاعدة البيانات.
- سجل التدقيق.
compliance.preference_center_updatedيُسجَّل عند تغيير التكوين، وأحداث opt-in/out على مستوى جهة الاتصال تُلتقَط في دفتر الموافقة.
opted_in) تُلغي صفوف الحظر النشطة لهاتف جهة الاتصال وتُمحي سور STOP، بينما يكسب دفتر الموافقة الإدخال المُعكوس.
الموضوع مقابل القناة. إلغاء اشتراك مستوى القناة يفوز دائمًا — مفتاح الموضوع يُضيِّق الموافقة داخل القنوات التي ما زالت جهة الاتصال تقبلها. id الموضوعات غير المعروفة في PUT تُتجاهَل بدلاً من أن تُثبَّت، لذا لا تستطيع نموذج قديم كتابة مفاتيح سمة عشوائية.
5. دلاليّات مفتاح حذف GDPR
عندما يكونshowGdprDelete مُفعَّلًا وتختار جهة الاتصال requestDataDeletion: true في PUT، تُسجَّل API طلب حذف GDPR قديمًا — صف pending مُعلَّم لعملية حذف البيانات — بجانب إلغاء الاشتراك. تلك العلامة متعمَّدة: مفتاح حذف مركز التفضيلات يُعلِّم جهة الاتصال، إنه لا يبدأ مسار DSAR المُتتبَّع.
6. اختبارها
مثالان curl مُعمَّل يمكنك لصقيهما في نص دخين: حفظ التكوين:201 مع التكوين المُحفوظ مُعكوسًا.
إنشاء رابط وممارسة نقاط النهايات العامة:
updated: true بالإضافة إلى التفضيلات المُطبَّقة، وعند الطلب، إدخال gdprRequest.
الفشل الشائع للتحقق: 400 INVALID_TOKEN (رمز مُشكَّل)، 401 TOKEN_EXPIRED (TTL انقضى أو عدم تطابق التوقيع — أنشئ رابطًا جديدًا)، 422 VALIDATION_ERROR (مشاكل على مستوى الحقل في التكوين أو جسم التحديث) و 404 NOT_FOUND عندما يكون مركز التفضيلات مُعطَّلًا أو id جهة الاتصال غير موجود.
متعلق
- حُواجز الإرسال وحُرَّاس ما قبل الإرسال — أين يعيش مُلخَّص مركز التفضيلات بجانب ساعات الصمت، الإيقاف الطارئ، والقِيود.
- إلغاء الاشتراك وقوائم الحظر — كيف يتعلق مجال
allواستيراد CSV الضخم بهذا السطح. - إدارة الموافقة — API جانب المُشغِّل الذي يُخزِّن نفس دفتر الموافقة.
- مرجع DSAR — مسار الحذف المُتتبَّع الذي تُوجَّه إليه طلبات
requestDataDeletion.