← API Key JS Staff

توثيق API

أرسل إشعارات إلى الموظفين من أنظمة أخرى — سكربتات، مهام كرون على خوادم أخرى، n8n، ويب هوك، بوتات واتساب.

احصل على مفتاح API

المالك: اذهب إلى إدارة ← 🔑 مفتاح API، أعطه اسمًا، اضغط إنشاء مفتاح.

المفتاح على شكل jss_ + 64 حرفًا، ويُعرض مرة واحدة فقط. الخادم يخزّن بصمته فقط، فإذا فقدته لن يستطيع أحد إظهاره لك مجددًا — ولا نحن أيضًا. ألغِ القديم وأنشئ واحدًا جديدًا.

احفظه في متغيّر بيئة أو ملف إعدادات خارج docroot. ولا تضعه أبدًا في كود يُرفَع إلى git.

2 · أرسل المفتاح

أحد هذين الترويستين — اختر ما هو أسهل لأداتك:

Authorization: Bearer jss_xxxxxxxx...
X-API-Key: jss_xxxxxxxx...

المفتاح يحدّد الشركة. لا توجد معلمة مستأجر (tenant) في أي نقطة نهاية — لو وُجدت، لكفى مفتاح واحد مسرَّب لإرسال رسائل إلى جميع الشركات على هذه المنصة.

لا توجد حماية CSRF هنا، وهذا صحيح. يحمي CSRF من الطلبات التي يُطلقها متصفح شخص آخر مستغلًّا ملفات تعريف ارتباطه. الطلبات المعتمدة على المفتاح لا تحمل أي ملفات تعريف ارتباط لأحد — لا يوجد ما يُستغَل.

ما الذي يمكن أن يفعله هذا المفتاح

يرسل الإشعارات فقط إلى موظفي الشركة المالكة، بالإضافة إلى قراءة قائمة أسماء الموظفين ومعرّفاتهم (حتى تحصل على user_id دون تخمين).

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

3 · تحقّق من أن المفتاح نشط

GET/api/v1/notif.php?aksi=ping

curl "https://staff.jidanshoppu.com/api/v1/notif.php?aksi=ping" \
  -H "Authorization: Bearer jss_xxx"
{ "ok": true, "key": "n8n produksi", "perusahaan": "Perusahaan Kamu" }

4 · احصل على قائمة الموظفين

GET/api/v1/notif.php?aksi=karyawan — للحصول على user_id.

curl "https://staff.jidanshoppu.com/api/v1/notif.php?aksi=karyawan" \
  -H "Authorization: Bearer jss_xxx"
{
  "ok": true,
  "karyawan": [
    { "user_id": 3, "nama": "Sela",   "peran": "staff" },
    { "user_id": 5, "nama": "Syauqi", "peran": "staff" }
  ]
}

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

5 · أرسل إشعارًا

POST/api/v1/notif.php — يقبل JSON أو بيانات النموذج.

الحقلمطلوبالوصف
judulنعمالحد الأقصى 120 حرفًا
isiنعمالحد الأقصى 255 حرفًا
user_idلا معرّف الموظف. 0 أو عدم الإرسال = جميع الموظفين النشطين
jenisلا info (افتراضي)، kasbon (سلفة)، gaji (راتب)، bonus (مكافأة)، timer (مؤقّت)، absen (حضور). يحدّد الأيقونة فقط؛ القيم غير المعروفة تؤول إلى info
urlلا يجب أن يكون مسارًا داخليًا يبدأ بـ /

إلى جميع الموظفين

curl -X POST https://staff.jidanshoppu.com/api/v1/notif.php \
  -H "Authorization: Bearer jss_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "judul": "Besok libur",
    "isi": "Tanggal 17 libur, timer tidak perlu dinyalakan."
  }'
{ "ok": true, "terkirim": 5 }

إلى شخص واحد، مع رابط

curl -X POST https://staff.jidanshoppu.com/api/v1/notif.php \
  -H "X-API-Key: jss_xxx" \
  -d "user_id=3" \
  -d "judul=Cek transaksi kamu" \
  -d "isi=Ada penyesuaian baru bulan ini." \
  -d "jenis=gaji" \
  -d "url=/staff/transaksi.php"
يجب أن يكون url مسارًا داخليًا. يُرفض https://… و //evil.com برمز 400.

السبب: إشعار يبدو رسميًا ويمكن أن يشير إلى أي مكان هو أداة تصيّد مثالية — يضغط الموظفون دون شك تحديدًا لأن البوابة هي من أوصلته. مفتاح واحد مسرَّب يكفي لبثّ "اضغط للاطلاع على راتبك" إلى صفحة دخول مزيّفة.

يُرفض أيضًا //evil.com، رغم أنه يبدأ بشرطة مائلة: تقرأه المتصفحات كعنوان لمضيف آخر.

ما يحدث بعد الإرسال

الموظفون الذين لديهم البوابة مفتوحة يسمعون صوتًا ويرون نافذة منبثقة خلال ≤20 ثانية. من ليست البوابة مفتوحة لديه سيُستقبَل في المرة القادمة التي يسجّل فيها الدخول. كل شيء يصل إلى صفحة إشعاراتهم، وكل إرسال عبر API يُسجَّل في سجل التدقيق باسم المفتاح.

حد المعدل

60 طلبًا في الدقيقة لكل مفتاح. كل استجابة تحمل:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57

عند تجاوز الحد ← 429 + Retry-After: 60.

رموز الحالة

الرمزالمعنى
200نجاح
400معلمة خاطئة، أو جسم JSON تالف، أو url ليس مسارًا داخليًا
401المفتاح غير مُرسَل، أو خاطئ، أو تم إلغاؤه بالفعل
404user_id ليس موظفًا في هذه الشركة
405طريقة خاطئة
429تم تجاوز حد المعدل

إذا فشل

العرضالسبب غالبًا
401 رغم أن المفتاح صحيح بعض الخوادم تُسقِط ترويسة Authorization قبل وصولها إلى PHP. جرّب X-API-Key — وهي ترويسة عادية لا يلمسها الخادم أبدًا. إن نجحت تلك ولم ينجح Bearer، أخبرنا.
401 فجأة رغم أنه كان يعمل من قبل قام المالك بإلغاء المفتاح. تحقّق في صفحة مفتاح API.
400 "يجب أن يكون url مسارًا داخليًا" أرسلت https://…. استخدم بدلًا منه /staff/transaksi.php.
200 لكن "terkirim": 0 الموظف غير نشط، أو أن الشركة ليس لديها موظفون نشطون بعد.

القيود الصريحة

هل تحتاج أن يسجّل الموظفون الدخول إلى تطبيقك بحساب JS Staff الخاص بهم (وليس فقط تلقّي الإشعارات)؟ هذا هو SSO — دليل الإعداد هنا.