Webhook تلفن ابری همکاران
رویدادهای تماس، تغییر وضعیت داخلیها، پایان مکالمه و پیامهای صوتی را بهصورت لحظهای در CRM، ERP یا نرمافزار اختصاصی خود دریافت کنید.
Webhook چیست؟
Webhook یک روش اطلاعرسانی خودکار بین سامانههاست. هر زمان رویدادی در مرکز تماس شما رخ دهد، تلفن ابری همکاران اطلاعات آن رویداد را با یک درخواست POST به آدرس تعیینشده ارسال میکند.
شروع سریع
- یک آدرس عمومی و امن HTTPS در نرمافزار خود ایجاد کنید.
- آدرس را در تنظیمات یکپارچهسازی پنل تلفن ابری ثبت کنید.
- درخواستهای POST با بدنه JSON را دریافت کنید.
- پس از دریافت، سریعاً یک پاسخ HTTP از خانواده
2xxبرگردانید. - پردازش اصلی را در صف یا پردازش پسزمینه نرمافزار خود انجام دهید.
POST https://example.com/integrations/hamkaran/webhook Content-Type: application/json
تنظیم آدرس مقصد
آدرس مقصد باید از اینترنت قابل دسترس باشد و درخواستهای POST را بپذیرد.
| الزام | توضیح |
|---|---|
| HTTPS معتبر | گواهی TLS منقضی یا Self-signed قابل قبول نیست. |
| پاسخ سریع | پیشنهاد میشود پاسخ اولیه در کمتر از ۵ ثانیه ارسال شود. |
| بدون Redirect | آدرس نهایی را مستقیماً ثبت کنید و از تغییر مسیر 301/302 استفاده نکنید. |
| دسترسی عمومی | Firewall و WAF باید اجازه دریافت درخواستهای سرویس را بدهند. |
ساختار درخواست
درخواستها با بدنه JSON ارسال میشوند. فیلدهای هر رویداد ممکن است متفاوت باشند؛ اما شناسه تماس برای ارتباطدادن رویدادها استفاده میشود.
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 را برگرداند.
HTTP/1.1 200 OK
Content-Type: application/json
{
"received": true
}امنیت و اعتبارسنجی
آدرس وبهوک را محرمانه نگه دارید و در سمت سرور کنترلهای امنیتی متناسب با زیرساخت خود اعمال کنید.
- فقط اتصال HTTPS را قبول کنید.
- Payload دریافتی را پیش از استفاده اعتبارسنجی کنید.
- برای جلوگیری از پردازش تکراری،
unique_idو نوع رویداد را ذخیره کنید. - اطلاعات حساس را در Log عمومی ثبت نکنید.
- محدودیت اندازه درخواست و Rate Limit منطقی تعریف کنید.
تحویل، تلاش مجدد و رویداد تکراری
در شبکههای توزیعشده ممکن است یک رویداد با تأخیر یا بیش از یک مرتبه دریافت شود. دریافتکننده باید Idempotent طراحی شود.
| وضعیت پاسخ | رفتار پیشنهادی دریافتکننده |
|---|---|
2xx | رویداد با موفقیت پذیرفته شده است. |
4xx | ساختار درخواست یا دسترسی را بررسی کنید. |
5xx | خطای موقت سرور مقصد؛ امکان تلاش مجدد وجود دارد. |
| Timeout | ممکن است درخواست مجدداً ارسال شود؛ پردازش تکراری را کنترل کنید. |
فهرست رویدادها
| رویداد | زمان ارسال | کاربرد |
|---|---|---|
| Newstate | تغییر وضعیت کانال تماس | نمایش زنگخوردن، پاسخ یا تغییر مرحله تماس |
| Hangup | قطع کانال تماس | ثبت پایان یک بخش از مسیر تماس |
| Cdr | پس از نهاییشدن گزارش تماس | ثبت نتیجه نهایی، مدت و وضعیت مکالمه |
| voiceMail | ایجاد پیام صوتی | ثبت و پردازش پیام صوتی جدید |
رویداد Newstate
هنگامی ارسال میشود که وضعیت یک کانال تماس تغییر کند؛ برای مثال تماس در حال زنگخوردن یا پاسخ داده شده باشد.
{
"event_name": "Newstate",
"unique_id": "1784104200.3765",
"channel_state": "Ringing",
"source": "09121234567",
"destination": "201",
"timestamp": "2026-07-15T10:30:02+03:30"
}| فیلد | نوع | توضیح |
|---|---|---|
unique_id | string | شناسه یکتای کانال تماس |
channel_state | string | وضعیت فعلی کانال |
source | string | شماره یا داخلی مبدأ |
destination | string | شماره یا داخلی مقصد |
رویداد Hangup
هنگام قطعشدن یک کانال تماس ارسال میشود. در تماسهای دارای صف، انتقال یا چند داخلی ممکن است بیش از یک Hangup برای جریان کلی تماس مشاهده شود.
{
"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 محسوب میشود.
{
"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"
}| فیلد | نوع | توضیح |
|---|---|---|
disposition | string | نتیجه نهایی تماس مانند ANSWERED، NO ANSWER، BUSY یا FAILED |
duration | integer | کل مدت تماس برحسب ثانیه |
billable_seconds | integer | مدت مکالمه پس از پاسخ |
type | string | نوع تماس ورودی یا خروجی |
رویداد Voicemail
پس از ثبت پیام جدید در صندوق صوتی ارسال میشود و میتواند برای ایجاد تیکت، اعلان یا ذخیره پیام در CRM استفاده شود.
{
"event_name": "voiceMail",
"unique_id": "vm_L3Zhci9zcG9vbC9hc3Rlcmlzay8...",
"source": "09121234567",
"mailbox": "201",
"duration": 34,
"created_at": "2026-07-15T11:04:10+03:30"
}ارتباط رویدادهای یک تماس
یک تماس میتواند در طول مسیر خود چند رویداد ایجاد کند. برای اتصال اطلاعات، شناسههای تماس را در نرمافزار خود نگهداری کنید.
نمونه پیادهسازی با Node.js
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 براساس شناسه تماس و نوع رویداد ایجاد کنید. |
| خطای 400 | Parser مربوط به JSON و محدودیت اندازه Body را بررسی کنید. |
| Timeout | پاسخ HTTP را پیش از اجرای عملیات سنگین ارسال کنید. |
| ترتیب رویدادها متفاوت است | بر زمان رویداد و شناسه تماس تکیه کنید، نه صرفاً ترتیب دریافت. |
