← Centra Meet API · ceentra.com

دليل المطورين

توثيق تكامل ceentra.com مع Centra Meet

شرح كامل لربط منصة Centra (ceentra.com) بتطبيق Centra Meet: حجز المواعيد، إرسال الدعوات، روابط الدخول بدون تسجيل، وإعداد الحسابات عبر password_hash.

نظرة عامة

التكامل server-to-server: خادم ceentra.com يستدعي واجهة Centra Meet لإنشاء اجتماع مرتبط بموعد استشارة. المستخدمون (المستشار والعميل) يدخلون عبر روابط مباشرة دون تسجيل دخول إلزامي.

1. العميل يحجز موعد فيديو في ceentra.com
2. Centra يستدعي POST /api/centra/bookings
3. Centra Meet ينشئ الاجتماع، يوفّر الحسابات، ويرسل الإيميلات
4. الاستجابة تتضمن روابط الدخول المباشرة للمستشار والعميل
مسارات API في Centra Meet
  • POST https://meet.ceentra.com/api/centra/bookings — إنشاء/استرجاع حجز
  • POST https://meet.ceentra.com/api/centra/sso-links — رابط دخول اختياري للوحة التحكم

حالة التكامل على هذا الخادم

التكامل: مفعّل مفتاح API: مُعرَّف المزود الافتراضي: webrtc

إعدادات البيئة

في Centra Meet (.env)

CENTRA_INTEGRATION_ENABLED=true
CENTRA_API_KEY=your-shared-secret-key
CENTRA_ALLOWED_ORIGINS=https://ceentra.com,https://www.ceentra.com,http://localhost
CENTRA_SSO_TTL_MINUTES=15

MAIL_MAILER=smtp
MAIL_HOST=mail.example.com
MAIL_FROM_ADDRESS=info@ceentra.com

LIVEKIT_ENABLED=true

في Centra / ceentra.com (.env)

CENTRA_MEET_ENABLED=true
CENTRA_MEET_API_URL=https://meet.ceentra.com
CENTRA_MEET_API_KEY=your-shared-secret-key
CENTRA_MEET_SOURCE_ORIGIN=https://ceentra.com
يجب أن يتطابق CENTRA_API_KEY في Meet مع CENTRA_MEET_API_KEY في Centra، وأن يكون مصدر الطلب ضمن CENTRA_ALLOWED_ORIGINS.

المصادقة والرؤوس المطلوبة

الرأسمطلوبالوصف
Authorization: Bearer {CENTRA_API_KEY} نعم مفتاح التكامل السري
X-Centra-Source: https://ceentra.com نعم* يُثبت أن الطلب من ceentra.com (*أو Origin مسموح)
Content-Type: application/json نعم جسم الطلب JSON

المسارات محدودة بـ 60 طلب/دقيقة لكل عنوان IP.

حجز موعد — POST /api/centra/bookings

ينشئ اجتماع فيديو 1:1 مرتبطاً بـ external_booking_id. الطلب idempotent: إعادة نفس المعرّف تُرجع نفس البيانات دون تكرار الإيميلات.

session_type: "phone" يُرجع 422 — فقط video ينشئ اجتماعاً.

مخطط طلب الحجز (JSON)

{
  "external_booking_id": "appointment-1001",
  "centra_consultation_request_id": 42,
  "session_type": "video",
  "title": "استشارة تسويق رقمي",
  "description": "جلسة لمناقشة خطة التسويق للربع القادم",
  "timezone": "Asia/Riyadh",
  "scheduled_start_at": "2026-06-20T14:00",
  "duration_minutes": 60,
  "chat_enabled": true,
  "assistant_enabled": false,
  "provider": "livekit",
  "send_emails": true,
  "host": {
    "centra_user_id": 10,
    "name": "أحمد المستشار",
    "email": "consultant@ceentra.com",
    "timezone": "Asia/Riyadh",
    "password_hash": "$2y$12$..."
  },
  "participant": {
    "centra_user_id": 20,
    "name": "سارة العميلة",
    "email": "client@ceentra.com",
    "timezone": "Asia/Riyadh"
  }
}

شرح الحقول

الحقلمطلوبالوصف
external_booking_idنعممعرّف فريد للموعد في Centra (مفتاح عدم التكرار)
session_typeنعمvideo أو phone
titleنعمعنوان الاجتماع (حتى 160 حرفاً)
descriptionلايُرسل في إيميلات الدعوة
scheduled_start_atنعمصيغة YYYY-MM-DDTHH:mm حسب timezone
duration_minutesنعممن 15 إلى 480 دقيقة
send_emailsلاافتراضي true — إرسال إيميل للمستشار والعميل
host.password_hashلاهاش bcrypt من Centra لإنشاء حساب المستشار إن لم يكن موجوداً
password_hash: أرسل الحقل المشفّر المخزّن في Centra ($user->password) وليس كلمة المرور النصية. إذا وُجد الحساب مسبقاً لا تُحدَّث كلمة المرور.

مخطط الاستجابة الناجحة

HTTP 201 عند الإنشاء، أو 200 عند الاسترجاع (idempotent).

{
  "success": true,
  "message": "تم إنشاء اجتماع Centra Meet وإرسال روابط الدخول.",
  "created": true,
  "meeting": {
    "public_id": "01JXYZ...",
    "title": "استشارة تسويق رقمي",
    "description": "جلسة لمناقشة خطة التسويق",
    "scheduled_start_at": "2026-06-20 14:00",
    "url": "https://meet.ceentra.com/meetings/01JXYZ...",
    "host_join_url": "https://meet.ceentra.com/j/32charAccessTokenExampleHere12",
    "host_link_url": "https://meet.ceentra.com/j/32charAccessTokenExampleHere12",
    "participant_invitation_url": "https://meet.ceentra.com/j/32charAccessTokenExampleHere12"
  },
  "host": {
    "id": 1,
    "email": "consultant@ceentra.com",
    "name": "أحمد المستشار",
    "created": true,
    "join_url": "https://meet.ceentra.com/j/32charAccessTokenExampleHere12",
    "invitation_url": null,
    "sso_url": "https://meet.ceentra.com/centra/sso?..."
  },
  "participant": {
    "id": 2,
    "email": "client@ceentra.com",
    "name": "سارة العميلة",
    "created": true,
    "join_url": null,
    "invitation_url": "https://meet.ceentra.com/j/32charAccessTokenExampleHere12",
    "sso_url": "https://meet.ceentra.com/centra/sso?..."
  },
  "notifications": {
    "host_email_sent": true,
    "participant_email_sent": true
  }
}

روابط SSO — POST /api/centra/sso-links

اختياري — لتسجيل دخول المستخدم إلى لوحة Centra Meet (وليس للدخول المباشر للفيديو).

{
  "email": "client@ceentra.com",
  "centra_user_id": 20,
  "meeting_public_id": "01JXYZ..."
}
{
  "success": true,
  "message": "تم إنشاء رابط الدخول بنجاح.",
  "sso_url": "https://meet.ceentra.com/centra/sso?..."
}

الدخول بدون تسجيل دخول

الدورالرابط في الاستجابةالاستخدام
منشئ الاجتماع (host) host.join_url دخول مباشر لصفحة الاستعداد ثم الغرفة — بدون login
العميل (participant) participant.invitation_url دخول مباشر عبر صفحة الدعوة — بدون login
روابط sso_url للوحة التحكم فقط. للفيديو استخدم دائماً join_url و invitation_url.

من لوحة المستشار في Centra

واجهة ceentra.com الداخلية (بعد تسجيل دخول المستشار):

POST /api/consultant/appointments/{appointment_id}/meet/sync
Authorization: Bearer {consultant_token}

تستدعي داخلياً CentraMeetService::bookAppointment() وتُرجع:

{
  "success": true,
  "message": "تم إنشاء اجتماع Centra Meet وإرسال روابط الدخول إلى المشاركين.",
  "data": { ... نفس حقول استجابة Meet ... }
}

معاينة قبل التأكيد:

GET /api/consultant/appointments/{appointment_id}/meet/preview

رسائل الخطأ

صيغة موحّدة:

{
  "success": false,
  "message": "يجب أن يكون موعد الحجز في المستقبل.",
  "errors": {
    "scheduled_start_at": ["يجب أن يكون موعد الحجز في المستقبل."]
  }
}
HTTPالسببمثال رسالة
401مفتاح API خاطئمفتاح API غير صالح أو مفقود.
403مصدر غير مسموحمصدر الطلب غير مسموح به.
404التكامل معطّل في Meetتكامل Centra غير مفعّل.
422تحقق من البياناتعنوان الاجتماع مطلوب.
503مفتاح غير مهيأتكامل Centra غير مهيأ.
من Centra: تكامل Centra Meet غير مفعّل حالياً يعني CENTRA_MEET_ENABLED=false في مشروع Centra وليس Meet.

أمثلة cURL

إنشاء حجز

curl -X POST "https://meet.ceentra.com/api/centra/bookings" \
  -H "Authorization: Bearer your-shared-secret-key" \
  -H "X-Centra-Source: https://ceentra.com" \
  -H "Origin: https://ceentra.com" \
  -H "Content-Type: application/json" \
  -d '{
    "external_booking_id": "appointment-1001",
    "session_type": "video",
    "title": "استشارة تسويق",
    "description": "جلسة استشارية",
    "timezone": "Asia/Riyadh",
    "scheduled_start_at": "2026-06-20T14:00",
    "duration_minutes": 60,
    "send_emails": true,
    "host": {
      "centra_user_id": 10,
      "name": "أحمد المستشار",
      "email": "consultant@ceentra.com",
      "timezone": "Asia/Riyadh",
      "password_hash": "$2y$12$..."
    },
    "participant": {
      "centra_user_id": 20,
      "name": "سارة العميلة",
      "email": "client@ceentra.com",
      "timezone": "Asia/Riyadh"
    }
  }'

طلب رابط SSO

curl -X POST "https://meet.ceentra.com/api/centra/sso-links" \
  -H "Authorization: Bearer your-shared-secret-key" \
  -H "X-Centra-Source: https://ceentra.com" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "client@ceentra.com",
    "centra_user_id": 20,
    "meeting_public_id": "01JXYZ..."
  }'

استكشاف الأخطاء

المشكلةالحل
تكامل Centra Meet غير مفعّل حالياً في Centra: CENTRA_MEET_ENABLED=true ثم php artisan config:clear
404 من API Meet في Meet: CENTRA_INTEGRATION_ENABLED=true
401 مفتاح API طابق المفتاحين في كلا المشروعين
403 مصدر الطلب أضف نطاق Centra إلى CENTRA_ALLOWED_ORIGINS
الإيميلات لا تُرسل اضبط MAIL_MAILER=smtp وsend_emails: true
موعد في الماضي استخدم scheduled_start_at مستقبلياً بصيغة Y-m-d\TH:i
للتحقق من الإعدادات: php artisan config:show centra (في Meet) و php artisan config:show centra_meet (في Centra).

المصادر المسموحة حالياً

  • https://ceentra.com
  • https://www.ceentra.com