Open in
वेबहुक्सचा आढावा
ThunderPhone रिअल-टाइम इव्हेंट्स कसे वितरित करते, स्वाक्षऱ्या कशा पडताळायच्या आणि लेगसी व एंडपॉइंट-आधारित वितरण मॉडेल्सची तुलना कशी होते.
ThunderPhone कॉलदरम्यान घटना घडल्यावर तुमच्या सर्व्हरला HTTP POST विनंत्या पाठवते — इनबाउंड कॉल सुरू होतो, कॉल संपतो, ग्रेडिंग रन पूर्ण होते, अलर्ट ट्रिगर होतो इत्यादी. दोन वितरण मॉडेल्स आहेत:
अनेक URLs, प्रत्येक एंडपॉइंटसाठी स्वतंत्र सीक्रेट्स, प्रत्येक एंडपॉइंटसाठी इव्हेंट फिल्टर्स,
आणि स्वयंचलित पुनर्प्रयत्न.
GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints द्वारे व्यवस्थापित करा.
प्रत्येक ऑर्गसाठी एक URL. अवरोधक कॉन्फिगरेशन एक्सचेंजेससह
कॉल-लाइफसायकल इव्हेंट्स समाविष्ट करतो. GET/PUT /v1/webhook येथे व्यवस्थापित केला जातो.
इव्हेंट्स कॅटलॉग मधील सर्व दहा इव्हेंट प्रकार webhook एंडपॉइंट्सद्वारे
वितरित केले जातात. सहा कॉल-लाइफसायकल इव्हेंट्स
(telephony.incoming, telephony.complete, telephony.tool,
web.incoming, web.complete, web.tool) तसेच लेगसी सिंगल-URL
webhook वर पाठवले जातात — तुमच्याकडे लेगसी URL आणि जुळणारा एंडपॉइंट दोन्ही असल्यास,
तुम्हाला इव्हेंट दोन्ही मार्गांवर प्राप्त होतो. अवरोधक वर्तन
(telephony.incoming / web.incoming कॉन्फिगरेशन
एक्सचेंज आणि webhook-मोड
टूल डिस्पॅच) केवळ लेगसी मार्गावर असते;
प्रत्येक एंडपॉइंट वितरण फायर-अँड-फॉरगेट सूचना असते.
पेलोड स्वरूप
एंडपॉइंट वितरणांमध्ये 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 webhook तोच type आणि data पाठवतो, पण
event_id विना:
{
"type": "telephony.incoming",
"data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}वायरवर, प्रत्येक बॉडी कॅनॉनिकली सिरिअलाइझ केली जाते — कीज वर्णानुक्रमाने क्रमबद्ध, व्हाइटस्पेस नाही, UTF-8. या दस्तऐवजांमधील प्रीटी-प्रिंट केलेली उदाहरणे केवळ वाचनीयतेसाठी आहेत.
इव्हेंट प्रकारांची आणि पेलोड फील्ड्सची संपूर्ण यादी पाहण्यासाठी इव्हेंट्स कॅटलॉग पहा.
स्वाक्षरी पडताळणी
प्रत्येक विनंतीमध्ये X-ThunderPhone-Signature हेडरमध्ये कच्च्या विनंतीच्या
बॉडीवर HMAC-SHA256 स्वाक्षरी असते. स्वाक्षरी की म्हणजे एंडपॉइंटचा
secret (किंवा लेगसी डिलिव्हरींसाठी तुमच्या संस्थास्तरीय वेबहुकचा
secret) आहे.
पायऱ्या
- कोणतेही पार्सिंग करण्यापूर्वी कच्ची विनंती बॉडी वाचा.
hmac_sha256(secret, body).hexdigest()ची गणना करा.X-ThunderPhone-Signatureहेडरशी स्थिर वेळेत तुलना करा.
आम्ही प्रसारित केलेल्या नेमक्या बाइट्सवर स्वाक्षरी करतो आणि ते बाइट्स कॅनॉनिकल JSON सिरीयलायझेशनचे असतात (क्रमबद्ध की, कॉम्पॅक्ट विभाजक). त्यामुळे कच्च्या बॉडीवर पडताळणी नेहमी कार्य करते — आणि तुमचे फ्रेमवर्क तुम्हाला फक्त पार्स केलेला JSON देत असल्यास, तो क्रमबद्ध की आणि कॉम्पॅक्ट विभाजकांसह पुन्हा सिरीयलाइज केल्यास एकसारखे बाइट्स तयार होतात. दोन्ही पद्धती पडताळणी मार्गदर्शिकेत समाविष्ट आहेत.
import hmac
import hashlib
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode("utf-8"),
body,
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, signature or "")
# Example Flask handler
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/thunderphone-webhook")
def handle():
body = request.get_data()
sig = request.headers.get("X-ThunderPhone-Signature", "")
if not verify_signature(body, sig, WEBHOOK_SECRET):
abort(401)
event = request.get_json()
# dispatch on event["type"] …
return "", 204import crypto from "node:crypto";
import express from "express";
function verifySignature(body, signature, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
if (!signature || expected.length !== signature.length) return false;
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature),
);
}
const app = express();
app.post(
"/thunderphone-webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const sig = req.header("X-ThunderPhone-Signature") || "";
if (!verifySignature(req.body, sig, process.env.WEBHOOK_SECRET)) {
return res.sendStatus(401);
}
const event = JSON.parse(req.body.toString("utf8"));
// dispatch on event.type …
res.sendStatus(204);
},
);डिलिव्हरी अर्थविषयक नियम
हे नियम एंडपॉइंट डिलिव्हरींना लागू होतात. जुन्या एकल-URL वेबहुकमध्ये पुन्हा प्रयत्नांशिवाय एकच समकालिक प्रयत्न असतो.
पुन्हा प्रयत्न
प्रत्येक इव्हेंटचा लगेच एकदा प्रयत्न केला जातो. कोणताही 2xx प्रतिसाद
डिलिव्हरीची पावती देतो. इतर कोणताही परिणाम झाल्यास (non-2xx,
कनेक्शन त्रुटी, टाइमआउट), आम्ही पहिल्या प्रयत्नानंतर 1 मिनिट, 5 मिनिटे, 30 मिनिटे, 2 तास, 6 तास,
12 तास आणि 24 तासांनी पुन्हा प्रयत्न करतो — 24 तासांमध्ये पसरलेले
8 प्रयत्न. प्रत्येक प्रयत्न अयशस्वी झाल्यास, डिलिव्हरी थांबते आणि एंडपॉइंटला
वेबहुक एंडपॉइंट्स मध्ये
status="failing" म्हणून चिन्हांकित केले जाते. पेलोड टिकाऊपणे स्वीकारला
जाताच 2xx परत करा; प्रक्रिया असमकालिकपणे करा.
क्रमवारी
डिलिव्हरीची क्रमवारी सर्वोत्तम-प्रयत्न तत्त्वावर असते. प्रत्यक्षात, इव्हेंट
जारी होतात त्या क्रमाने आम्ही ते डिलिव्हर करतो, परंतु अयशस्वी झाल्यास
पुन्हा प्रयत्नांमुळे क्रम बदलू शकतो. नेहमी डुप्लिकेट काढून टाका आणि
call_id / ऑब्जेक्ट आयडी नुसार समेट करा.
डुप्लिकेट
डिलिव्हरी किमान-एकदा असते: आम्हाला न मिळालेल्या प्रतिसादानंतरचा
पुन्हा प्रयत्न एखादा इव्हेंट डुप्लिकेट करू शकतो. प्रत्येक पुन्हा प्रयत्नात
तोच event_id असतो, त्यामुळे प्रक्रिया केलेले आयडी संग्रहित करा आणि
पुनरावृत्ती वगळा. event_id एंडपॉइंट्समध्येही सामायिक असतो — त्याच
इव्हेंटसाठी सदस्यता घेतलेल्या दोन एंडपॉइंट्सना तोच event_id मिळतो.
टाइमआउट
एंडपॉइंट डिलिव्हरींमध्ये प्रत्येक प्रयत्नासाठी 30 सेकंदांचा टाइमआउट असतो. जुन्या मार्गावर,
थेट कॉलचे वर्तन नियंत्रित करणाऱ्या ब्लॉकिंग विनंत्या —
telephony.incoming / web.incoming
कॉन्फिगरेशन देवाणघेवाण — 10 सेकंदांनंतर टाइमआउट होतात, परंतु धीमा
प्रतिसाद कॉल उचलण्यास विलंब करतो, त्यामुळे काही सेकंदांत उत्तर देण्याचा
प्रयत्न करा. वेबहुक-मोड टूल डिस्पॅच मध्ये डीफॉल्टनुसार
20 सेकंद उपलब्ध असतात आणि टूल घोषणांमध्ये शीर्ष-स्तरीय timeout सेट केला जाऊ शकतो.
स्रोत IP
आउटबाउंड वेबहुक ThunderPhone च्या क्लाउड IP श्रेणीतून येतात. तुमच्या फायरवॉलला अनुमत यादी आवश्यक असल्यास, सपोर्टशी संपर्क साधा आणि आम्ही सध्याच्या श्रेणी सामायिक करू.
जुने आणि एंडपॉइंट-आधारित वेबहुक यांपैकी निवड
| वैशिष्ट्य | जुने (/v1/webhook) | एंडपॉइंट्स (/v1/developer/webhook-endpoints) |
|---|---|---|
| URL ची संख्या | प्रत्येक संस्थेसाठी 1 | प्रत्येक संस्थेसाठी अनेक |
| इव्हेंट व्याप्ती | फक्त telephony.* / web.* | सर्व 10 इव्हेंट प्रकार |
| इव्हेंट फिल्टर | — | प्रत्येक एंडपॉइंटनुसार |
| पुन्हा प्रयत्न | नाही | 24 तासांत 8 प्रयत्न |
| एन्व्हलप | type + data | type + data + event_id |
| सिक्रेट रोटेशन | एकमेव सिक्रेट बदलते | प्रत्येक एंडपॉइंटसाठी सिक्रेट |
| हटविल्याशिवाय निष्क्रिय करणे | {"url": ""} सह PUT /v1/webhook | status=disabled |
| स्टेटस दृश्यमानता | — | active / disabled / failing |
| ब्लॉकिंग कॉन्फिगरेशन देवाणघेवाण | होय (telephony.incoming / web.incoming) | कधीही नाही — फक्त सूचना |
| यासाठी सर्वोत्तम | डायनॅमिक कॉल कॉन्फिगरेशन | प्रॉडक्शनमधील इव्हेंट वापर |
नवीन इंटिग्रेशननी एंडपॉइंट-आधारित वेबहुकद्वारे इव्हेंट वापरावेत. तुम्ही कॉल उचलण्याच्या वेळी कॉल डायनॅमिकपणे कॉन्फिगर करत असाल किंवा वेबहुक-मोड टूल डिस्पॅच वापरत असाल तरच जुना URL ठेवा (किंवा जोडा) — त्या विनंती/प्रतिसाद देवाणघेवाणी फक्त जुन्या मार्गावर चालतात.
संबंधित
सर्व इव्हेंट प्रकार आणि त्यांचे पेलोड.
अनेक एंडपॉइंट्स, इव्हेंट फिल्टर्स आणि सिक्रेट्स व्यवस्थापित करा.
कॉल कॉन्फिगर करण्यासाठी तुमच्या सर्व्हरने उत्तर द्यावी लागणारी ब्लॉकिंग विनंती.
ट्रान्स्क्रिप्ट, रेकॉर्डिंग आणि मेट्रिक्ससह कॉलनंतरचा पेलोड.