Hamkaran Cloud Developers تلفن ابری همکارانمرجع مستندات توسعه‌دهندگان
Webhook API v1Web ServiceCID Lookupورود به پنل
● مستندات رسمی توسعه‌دهندگان

Webhook تلفن ابری همکاران

رویدادهای تماس، تغییر وضعیت داخلی‌ها، پایان مکالمه و پیام‌های صوتی را به‌صورت لحظه‌ای در CRM، ERP یا نرم‌افزار اختصاصی خود دریافت کنید.

فرمت داده: JSONروش ارسال: HTTP POSTنسخه مستند: 1.0زبان: فارسی

Webhook چیست؟

Webhook یک روش اطلاع‌رسانی خودکار بین سامانه‌هاست. هر زمان رویدادی در مرکز تماس شما رخ دهد، تلفن ابری همکاران اطلاعات آن رویداد را با یک درخواست POST به آدرس تعیین‌شده ارسال می‌کند.

رویداد لحظه‌ایدریافت شروع، پاسخ و پایان تماس بدون نیاز به استعلام دوره‌ای.
اتصال به CRM و ERPثبت تماس، نمایش پرونده مشتری و اجرای اتوماسیون‌های سازمانی.
{ }
داده استاندارد JSONقابل استفاده در PHP، Node.js، Python، C# و سایر فناوری‌ها.
تفاوت با Web Service: در Webhook، تلفن ابری رویداد را برای نرم‌افزار شما ارسال می‌کند؛ اما در Web Service، نرم‌افزار شما یک درخواست را به تلفن ابری می‌فرستد.

شروع سریع

  1. یک آدرس عمومی و امن HTTPS در نرم‌افزار خود ایجاد کنید.
  2. آدرس را در تنظیمات یکپارچه‌سازی پنل تلفن ابری ثبت کنید.
  3. درخواست‌های POST با بدنه JSON را دریافت کنید.
  4. پس از دریافت، سریعاً یک پاسخ HTTP از خانواده 2xx برگردانید.
  5. پردازش اصلی را در صف یا پردازش پس‌زمینه نرم‌افزار خود انجام دهید.
نمونه Endpoint
POST https://example.com/integrations/hamkaran/webhook
Content-Type: application/json

تنظیم آدرس مقصد

آدرس مقصد باید از اینترنت قابل دسترس باشد و درخواست‌های POST را بپذیرد.

الزامتوضیح
HTTPS معتبرگواهی TLS منقضی یا Self-signed قابل قبول نیست.
پاسخ سریعپیشنهاد می‌شود پاسخ اولیه در کمتر از ۵ ثانیه ارسال شود.
بدون Redirectآدرس نهایی را مستقیماً ثبت کنید و از تغییر مسیر 301/302 استفاده نکنید.
دسترسی عمومیFirewall و WAF باید اجازه دریافت درخواست‌های سرویس را بدهند.

ساختار درخواست

درخواست‌ها با بدنه JSON ارسال می‌شوند. فیلدهای هر رویداد ممکن است متفاوت باشند؛ اما شناسه تماس برای ارتباط‌دادن رویدادها استفاده می‌شود.

HTTP Request
POST /integrations/hamkaran/webhook HTTP/1.1
Host: example.com
Content-Type: application/json
User-Agent: Hamkaran-Cloud-Webhook/1.0

{
  "event_name": "Cdr",
  "unique_id": "1784104200.3765",
  "source": "09121234567",
  "destination": "201",
  "disposition": "ANSWERED"
}

پاسخ مورد انتظار

سرور مقصد باید پس از پذیرش رویداد، یکی از وضعیت‌های موفق HTTP را برگرداند.

Success Response
HTTP/1.1 200 OK
Content-Type: application/json

{
  "received": true
}
پیشنهاد: ابتدا رویداد را ذخیره یا وارد صف کنید، سپس پاسخ موفق بدهید. اجرای عملیات زمان‌بر پیش از پاسخ می‌تواند باعث Timeout یا ارسال مجدد شود.

امنیت و اعتبارسنجی

آدرس وب‌هوک را محرمانه نگه دارید و در سمت سرور کنترل‌های امنیتی متناسب با زیرساخت خود اعمال کنید.

  • فقط اتصال HTTPS را قبول کنید.
  • Payload دریافتی را پیش از استفاده اعتبارسنجی کنید.
  • برای جلوگیری از پردازش تکراری، unique_id و نوع رویداد را ذخیره کنید.
  • اطلاعات حساس را در Log عمومی ثبت نکنید.
  • محدودیت اندازه درخواست و Rate Limit منطقی تعریف کنید.
توجه: در صورت ارائه Secret یا امضای اختصاصی در تنظیمات حساب شما، اعتبار امضا باید با بدنه خام درخواست بررسی شود. نام دقیق Headerها باید مطابق تنظیمات فعال سرویس شما استفاده شود.

تحویل، تلاش مجدد و رویداد تکراری

در شبکه‌های توزیع‌شده ممکن است یک رویداد با تأخیر یا بیش از یک مرتبه دریافت شود. دریافت‌کننده باید Idempotent طراحی شود.

وضعیت پاسخرفتار پیشنهادی دریافت‌کننده
2xxرویداد با موفقیت پذیرفته شده است.
4xxساختار درخواست یا دسترسی را بررسی کنید.
5xxخطای موقت سرور مقصد؛ امکان تلاش مجدد وجود دارد.
Timeoutممکن است درخواست مجدداً ارسال شود؛ پردازش تکراری را کنترل کنید.

فهرست رویدادها

رویدادزمان ارسالکاربرد
Newstateتغییر وضعیت کانال تماسنمایش زنگ‌خوردن، پاسخ یا تغییر مرحله تماس
Hangupقطع کانال تماسثبت پایان یک بخش از مسیر تماس
Cdrپس از نهایی‌شدن گزارش تماسثبت نتیجه نهایی، مدت و وضعیت مکالمه
voiceMailایجاد پیام صوتیثبت و پردازش پیام صوتی جدید

رویداد Newstate

هنگامی ارسال می‌شود که وضعیت یک کانال تماس تغییر کند؛ برای مثال تماس در حال زنگ‌خوردن یا پاسخ داده شده باشد.

JSON
{
  "event_name": "Newstate",
  "unique_id": "1784104200.3765",
  "channel_state": "Ringing",
  "source": "09121234567",
  "destination": "201",
  "timestamp": "2026-07-15T10:30:02+03:30"
}
فیلدنوعتوضیح
unique_idstringشناسه یکتای کانال تماس
channel_statestringوضعیت فعلی کانال
sourcestringشماره یا داخلی مبدأ
destinationstringشماره یا داخلی مقصد

رویداد Hangup

هنگام قطع‌شدن یک کانال تماس ارسال می‌شود. در تماس‌های دارای صف، انتقال یا چند داخلی ممکن است بیش از یک Hangup برای جریان کلی تماس مشاهده شود.

JSON
{
  "event_name": "Hangup",
  "unique_id": "1784104200.3765",
  "source": "09121234567",
  "destination": "201",
  "cause": "Normal Clearing",
  "timestamp": "2026-07-15T10:32:16+03:30"
}

رویداد CDR

CDR گزارش نهایی تماس است و معمولاً بهترین رویداد برای ثبت نتیجه نهایی مکالمه در CRM محسوب می‌شود.

JSON
{
  "event_name": "Cdr",
  "unique_id": "1784104200.3765",
  "source": "09121234567",
  "destination": "201",
  "type": "incoming_call",
  "disposition": "ANSWERED",
  "duration": 136,
  "billable_seconds": 124,
  "start_time": "2026-07-15T10:30:00+03:30",
  "answer_time": "2026-07-15T10:30:12+03:30",
  "end_time": "2026-07-15T10:32:16+03:30"
}
فیلدنوعتوضیح
dispositionstringنتیجه نهایی تماس مانند ANSWERED، NO ANSWER، BUSY یا FAILED
durationintegerکل مدت تماس برحسب ثانیه
billable_secondsintegerمدت مکالمه پس از پاسخ
typestringنوع تماس ورودی یا خروجی

رویداد Voicemail

پس از ثبت پیام جدید در صندوق صوتی ارسال می‌شود و می‌تواند برای ایجاد تیکت، اعلان یا ذخیره پیام در CRM استفاده شود.

JSON
{
  "event_name": "voiceMail",
  "unique_id": "vm_L3Zhci9zcG9vbC9hc3Rlcmlzay8...",
  "source": "09121234567",
  "mailbox": "201",
  "duration": 34,
  "created_at": "2026-07-15T11:04:10+03:30"
}

ارتباط رویدادهای یک تماس

یک تماس می‌تواند در طول مسیر خود چند رویداد ایجاد کند. برای اتصال اطلاعات، شناسه‌های تماس را در نرم‌افزار خود نگهداری کنید.

Newstate: RingingNewstate: UpHangupCDR نهایی
در تماس‌های پیچیده شامل IVR، صف، انتقال و چند داخلی، ممکن است چند کانال ایجاد شود. گزارش نهایی CDR را مبنای نتیجه تماس قرار دهید و رویدادهای Newstate را برای نمایش لحظه‌ای استفاده کنید.

نمونه پیاده‌سازی با Node.js

JavaScript / Express
import express from "express";

const app = express();
app.use(express.json({ limit: "1mb" }));

app.post("/integrations/hamkaran/webhook", async (req, res) => {
  const event = req.body;

  if (!event?.event_name || !event?.unique_id) {
    return res.status(400).json({ received: false });
  }

  // پاسخ سریع به سرویس
  res.status(200).json({ received: true });

  // پردازش اصلی در Queue انجام شود
  await webhookQueue.add("hamkaran-event", event, {
    jobId: `${event.event_name}:${event.unique_id}`
  });
});

app.listen(3000);

عیب‌یابی

مشکلراه‌حل
هیچ رویدادی دریافت نمی‌شودعمومی‌بودن URL، گواهی HTTPS، Firewall و فعال‌بودن ماژول Webhook را بررسی کنید.
رویداد چند بار ثبت می‌شودپردازش Idempotent براساس شناسه تماس و نوع رویداد ایجاد کنید.
خطای 400Parser مربوط به JSON و محدودیت اندازه Body را بررسی کنید.
Timeoutپاسخ HTTP را پیش از اجرای عملیات سنگین ارسال کنید.
ترتیب رویدادها متفاوت استبر زمان رویداد و شناسه تماس تکیه کنید، نه صرفاً ترتیب دریافت.
پشتیبانی فنی: برای فعال‌سازی ماژول، بررسی لاگ تحویل یا دریافت نمونه Payload متناسب با مرکز تماس خود، از طریق پنل تلفن ابری همکاران تیکت ثبت کنید.