Open in
ویب ہکس کا جائزہ
ThunderPhone ریئل ٹائم ایونٹس کیسے فراہم کرتا ہے، دستخطوں کی تصدیق کیسے کریں، اور لیگیسی اور اینڈپوائنٹ پر مبنی ڈیلیوری ماڈلز کا موازنہ۔
ThunderPhone آپ کے سرور کو HTTP POST درخواستیں بھیجتا ہے جب کال کے دوران کوئی واقعہ پیش آتا ہے — ایک ان باؤنڈ کال شروع ہوتی ہے، کال ختم ہوتی ہے، گریڈنگ رن مکمل ہوتا ہے، الرٹ فعال ہوتا ہے، وغیرہ۔ ترسیل کے دو ماڈل ہیں:
متعدد URLs، ہر اینڈپوائنٹ کے لیے الگ سیکرٹس، ہر اینڈپوائنٹ کے لیے ایونٹ فلٹرز،
اور خودکار دوبارہ کوششیں۔
GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints کے ذریعے نظم کریں۔
ہر تنظیم کے لیے ایک URL۔ کال لائف سائیکل کے ایونٹس، بشمول
بلاکنگ کنفیگریشن تبادلوں، پر مشتمل ہے۔ GET/PUT /v1/webhook پر منظم کیا جاتا ہے۔
ایونٹس کیٹلاگ میں درج تمام ایونٹ اقسام ویب ہک
اینڈپوائنٹس کے ذریعے ڈیلیور کی جاتی ہیں۔ کال لائف سائیکل کے چھ ایونٹس
(telephony.incoming, telephony.complete, telephony.tool,
web.incoming, web.complete, web.tool) بھی لیگیسی سنگل-URL
ویب ہک کو بھیجے جاتے ہیں — اگر آپ کے پاس لیگیسی URL اور اس سے مطابقت رکھنے والا
اینڈپوائنٹ دونوں موجود ہوں، تو آپ کو ایونٹ دونوں راستوں پر ملتا ہے۔ بلاکنگ
رویّہ (telephony.incoming / web.incoming کنفیگریشن
تبادلہ اور ویب ہک موڈ میں
ٹول ڈسپیچ) صرف لیگیسی راستے پر موجود ہے؛
ہر اینڈپوائنٹ ڈیلیوری فائر اینڈ فارگیٹ اطلاع ہوتی ہے۔
پے لوڈ فارمیٹ
اینڈپوائنٹ ڈیلیوریز data، event_id، اور type پر مشتمل ایک JSON آبجیکٹ ہوتی ہیں:
{
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
},
"event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
"type": "telephony.incoming"
}event_id ہر جاری کیے گئے ایونٹ کے لیے منفرد ہوتا ہے۔ یہ دوبارہ کوششوں کے
اور ایونٹ وصول کرنے والے ہر اینڈپوائنٹ کے درمیان یکساں رہتا ہے — اسی کی بنیاد پر
ڈی ڈپلیکیٹ کریں۔
لیگیسی سنگل-URL ویب ہک وہی type اور data بھیجتا ہے، لیکن
event_id کے بغیر:
{
"type": "telephony.incoming",
"data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}ترسیل کے دوران، ہر باڈی معیاری طور پر سیریلائز ہوتی ہے — کلیدیں حروفِ تہجی کے لحاظ سے ترتیب دی جاتی ہیں، کوئی خالی جگہ نہیں ہوتی، اور UTF-8 استعمال ہوتا ہے۔ ان دستاویزات میں خوب صورت انداز سے فارمیٹ کی گئی مثالیں صرف پڑھنے میں آسانی کے لیے ہیں۔
ایونٹ اقسام اور پے لوڈ فیلڈز کی مکمل فہرست کے لیے ایونٹس کیٹلاگ دیکھیں۔
دستخط کی تصدیق
ہر درخواست میں دو دستخط شامل ہوتے ہیں، دونوں endpoint کے secret (یا پرانی ڈیلیوریز کے لیے آپ کے تنظیمی سطح کے webhook secret) کے ساتھ HMAC-SHA256 استعمال کرتے ہیں:
X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex>ٹائم اسٹیمپ، طریقہ، path اور query، اور خام body پر دستخط کرتا ہے۔ اس کی تصدیق کریں، اور ان درخواستوں کو مسترد کریں جن کاtآپ کی گھڑی سے 5 منٹ سے زیادہ مختلف ہو، تاکہ پکڑی گئی درخواست کو بعد میں دوبارہ چلایا نہ جا سکے۔ دوبارہ کوششیں بھیجے جانے پر دوبارہ دستخط کی جاتی ہیں۔X-ThunderPhone-Signatureصرف خام body پر دستخط کرتا ہے۔ اسے بغیر تبدیلی کے اب بھی بھیجا جاتا ہے تاکہ موجودہ تصدیق کنندگان کام کرتے رہیں۔
مراحل
- ہیڈر، طریقہ، خام path اور query، اور خام body کو کسی بھی parsing سے پہلے پڑھیں۔
- اپنے secret کے ساتھ
<t>\n<METHOD>\n<path and query>\n<body>کا hex HMAC-SHA256 حساب کریں۔ - اگر
tمیں 300 سیکنڈ سے زیادہ فرق ہو، یا نتیجہ مستقل وقت کے تقابل میںv1سے مطابقت نہ رکھتا ہو، تو درخواست مسترد کریں۔
Bodies معیاری JSON سیریلائزیشن ہیں (ترتیب شدہ کلیدیں، مختصر جداکار)، اور ہم بالکل انہی بائٹس پر دستخط کرتے ہیں جو ہم منتقل کرتے ہیں۔ تصدیق کا رہنما میں دستخط شدہ عین سٹرنگ، ایک عملی مثال، SDK کے بغیر کوڈ، اور پرانا ہیڈر شامل ہیں۔
from flask import Flask, abort, request
from thunderphone import verify_signature
app = Flask(__name__)
@app.post("/thunderphone-webhook")
def handle():
query = request.query_string.decode()
if not verify_signature(
request.headers.get("X-ThunderPhone-Signature-V2"),
secret=WEBHOOK_SECRET,
method=request.method,
path=request.path + (f"?{query}" if query else ""),
body=request.get_data(), # raw bytes
):
abort(401)
event = request.get_json()
# dispatch on event["type"] …
return "", 204import express from "express";
import { verifySignature } from "@thunderphone/sdk";
const app = express();
app.post(
"/thunderphone-webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const ok = verifySignature({
header: req.header("X-ThunderPhone-Signature-V2"),
secret: process.env.WEBHOOK_SECRET,
method: req.method,
path: req.originalUrl,
body: req.body,
});
if (!ok) return res.sendStatus(401);
const event = JSON.parse(req.body.toString("utf8"));
// dispatch on event.type …
res.sendStatus(204);
},
);ترسیل کی معنویات
یہ semantics اینڈپوائنٹ ڈیلیوریز پر لاگو ہوتے ہیں۔ پرانا واحد-URL
ویب ہک دوبارہ کوششوں کے بغیر ایک ہی synchronous کوشش ہے، سوائے
فون کال کے telephony.incoming
configuration تبادلے کے، جس کی ایک بار دوبارہ کوشش کی جاتی ہے۔
دوبارہ کوششیں
ہر ایونٹ کی فوری طور پر ایک بار کوشش کی جاتی ہے۔ کوئی بھی 2xx جواب
ڈیلیوری کی تصدیق کرتا ہے۔ کسی بھی دوسرے نتیجے کی صورت میں (non-2xx،
کنکشن کی خرابی، timeout) ہم پہلی کوشش کے بعد 1 منٹ، 5 منٹ، 30 منٹ، 2 گھنٹے، 6 گھنٹے،
12 گھنٹے، اور 24 گھنٹے پر دوبارہ کوشش کرتے ہیں — 24 گھنٹوں
پر مشتمل 8 کوششیں۔ اگر ہر کوشش ناکام ہو جائے تو ڈیلیوری رک جاتی ہے اور اینڈپوائنٹ
کو ویب ہک اینڈپوائنٹس میں
status="failing" کے طور پر نشان زد کر دیا جاتا ہے؛ ہم آپ کی تنظیم کے
مالکان اور منتظمین کو ای میل کرتے ہیں اور اسے ڈیش بورڈ میں دکھاتے ہیں۔ جیسے ہی
payload پائیدار طور پر قبول ہو، 2xx واپس کریں؛ اسے asynchronous طور پر پراسیس کریں۔
اینڈپوائنٹ ٹیسٹ API سے ٹیسٹ بھیجنے پر پہلی کوشش کے تقریباً ایک منٹ بعد
ایک دوبارہ کوشش کی جاتی ہے اور اینڈپوائنٹ کی status کبھی تبدیل نہیں ہوتی۔
ترتیب
ترسیل کی ترتیب بہترین ممکنہ کوشش کے تحت ہے۔ عملی طور پر ہم ایونٹس کو ان کے
اخراج کی ترتیب میں پہنچاتے ہیں، لیکن ناکامی کی صورت میں دوبارہ کوششیں ترتیب
بدل سکتی ہیں۔ ہمیشہ call_id / آبجیکٹ id کے ذریعے نقل ہٹائیں اور مطابقت پیدا کریں۔
نقلیں
ترسیل کم از کم ایک بار ہوتی ہے: ایسے جواب کے بعد دوبارہ کوشش جو ہمیں کبھی
موصول نہ ہوا ہو، کسی ایونٹ کی نقل بنا سکتی ہے۔ ہر دوبارہ کوشش میں وہی
event_id ہوتا ہے، لہٰذا پراسیس شدہ ids محفوظ کریں اور دہرائی جانے والی
ترسیلات کو چھوڑ دیں۔ event_id اینڈپوائنٹس کے درمیان بھی مشترک ہوتا ہے —
ایک ہی ایونٹ کو سبسکرائب کرنے والے دو اینڈپوائنٹس کو ایک ہی event_id ملتا ہے۔
ٹائم آؤٹس
اینڈپوائنٹ ڈیلیوریز میں ہر کوشش کے لیے 30 سیکنڈ کا timeout ہوتا ہے۔ پرانے
راستے میں، لائیو کال کے رویّے کو کنٹرول کرنے والی بلاکنگ درخواستیں — یعنی
telephony.incoming / web.incoming
configuration تبادلہ — فون کال کی پہلی کوشش کے لیے 10 سیکنڈ تک،
اور اس کی ایک دوبارہ کوشش سمیت پورے تبادلے کے لیے 13 سیکنڈ تک،
اور widget سیشن کے لیے 10 سیکنڈ تک محدود ہیں۔ سست جواب
کال اٹھانے میں تاخیر کرتا ہے، اس لیے چند سیکنڈ کے اندر جواب دینے کی کوشش کریں۔ ویب ہک موڈ ٹول ڈسپیچ میں
بذریعہ ڈیفالٹ 20 سیکنڈ کی اجازت ہے، اور ٹول declarations اعلیٰ سطح کا timeout مقرر کر سکتی ہیں۔
سورس IPs
آؤٹ باؤنڈ ویب ہکس ThunderPhone کی کلاؤڈ IP رینج سے آتے ہیں۔ اگر آپ کے فائر وال کو اجازت فہرست درکار ہو تو سپورٹ سے رابطہ کریں، اور ہم موجودہ رینجز فراہم کریں گے۔
لیگیسی اور اینڈپوائنٹ پر مبنی ویب ہکس کے درمیان انتخاب
| خصوصیت | لیگیسی (/v1/webhook) | اینڈ پوائنٹس (/v1/developer/webhook-endpoints) |
|---|---|---|
| URLs کی تعداد | ہر ادارے کے لیے 1 | ہر ادارے کے لیے متعدد |
| ایونٹ کوریج | صرف telephony.* / web.* | تمام 10 ایونٹ اقسام |
| ایونٹ فلٹر | — | ہر اینڈ پوائنٹ کے لیے |
| دوبارہ کوششیں | کوئی نہیں، فون کال کنفیگریشن کے تبادلے کے لیے ایک کے علاوہ | 24 گھنٹوں میں 8 کوششیں |
| اینویلپ | type + data | type + data + event_id |
| سیکرٹ کی گردش | واحد سیکرٹ کو تبدیل کرتا ہے | ہر اینڈ پوائنٹ کے لیے سیکرٹ |
| حذف کیے بغیر غیر فعال کرنا | PUT /v1/webhook کے ساتھ {"url": ""} | status=disabled |
| اسٹیٹس کی مرئیت | — | active / disabled / failing |
| بلاک کرنے والا کنفیگ تبادلہ | ہاں (telephony.incoming / web.incoming) | کبھی نہیں — صرف نوٹیفکیشنز |
| بہترین استعمال | متحرک کال کنفیگریشن | پروڈکشن میں ایونٹ کا استعمال |
نئی انٹیگریشنز کو اینڈپوائنٹ پر مبنی ویب ہکس کے ذریعے ایونٹس استعمال کرنے چاہییں۔ لیگیسی URL صرف اسی صورت میں رکھیں (یا شامل کریں) جب آپ کال اٹھانے کے وقت کالز کو متحرک طور پر کنفیگر کرتے ہوں یا ویب ہک موڈ ٹول ڈسپیچ استعمال کرتے ہوں — یہ درخواست/جواب تبادلے صرف لیگیسی راستے پر چلتے ہیں۔
متعلقہ
ایونٹ کی تمام اقسام اور ان کے پے لوڈز۔
متعدد اینڈ پوائنٹس، ایونٹ فلٹرز، اور سیکرٹس کا نظم کریں۔
کالز کنفیگر کرنے کے لیے وہ بلاکنگ درخواست جس کا آپ کے سرور کو جواب دینا ضروری ہے۔
ٹرانسکرپٹ، ریکارڈنگ، اور میٹرکس کے ساتھ کال کے بعد کا پے لوڈ۔