Open in
वेबहुक्सचा आढावा
ThunderPhone रिअल-टाइम इव्हेंट्स कसे वितरित करते, स्वाक्षऱ्या कशा पडताळायच्या आणि लेगसी व एंडपॉइंट-आधारित वितरण मॉडेल्सची तुलना कशी होते.
ThunderPhone कॉलदरम्यान घडणाऱ्या घटनांवर तुमच्या सर्व्हरला HTTP POST विनंत्या पाठवते — इनबाउंड कॉल सुरू होतो, कॉल संपतो, ग्रेडिंग रन पूर्ण होते, अलर्ट ट्रिगर होतो, इत्यादी. दोन वितरण मॉडेल आहेत:
अनेक URL, प्रत्येक एंडपॉइंटसाठी स्वतंत्र secrets, प्रत्येक एंडपॉइंटसाठी इव्हेंट फिल्टर्स,
आणि स्वयंचलित पुनःप्रयत्न.
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. या दस्तऐवजांमधील सुंदर स्वरूपातील उदाहरणे केवळ वाचनीयतेसाठी आहेत.
इव्हेंट प्रकारांची आणि पेलोड फील्ड्सची संपूर्ण यादी पाहण्यासाठी इव्हेंट्स कॅटलॉग पहा.
स्वाक्षरी पडताळणी
प्रत्येक विनंतीमध्ये दोन स्वाक्षऱ्या असतात. दोन्ही endpoint च्या secret ने HMAC-SHA256 की केलेल्या असतात (किंवा legacy वितरणांसाठी तुमच्या संस्थास्तरीय webhook secret ने):
X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex>टाइमस्टॅम्प, पद्धत, पथ व क्वेरी आणि रॉ बॉडीवर स्वाक्षरी करते. ही तपासा आणि ज्या विनंत्यांमधीलtतुमच्या घड्याळापेक्षा 5 मिनिटांपेक्षा जास्त फरकाचा आहे त्या नाकारा, जेणेकरून पकडलेली विनंती नंतर पुन्हा पाठवता येणार नाही. रिट्राय पाठवताना त्यांवर पुन्हा स्वाक्षरी केली जाते.X-ThunderPhone-Signatureफक्त रॉ बॉडीवर स्वाक्षरी करते. विद्यमान पडताळक कार्यरत राहावेत म्हणून ती अजूनही बदल न करता पाठवली जाते.
पायऱ्या
- कोणतेही parsing करण्यापूर्वी header, method, raw path आणि query, तसेच raw body वाचा.
- तुमच्या secret सह
<t>\n<METHOD>\n<path and query>\n<body>चे hex HMAC-SHA256 गणना करा. t300 सेकंदांपेक्षा जास्त फरकाने दूर असल्यास किंवा constant-time तुलनेत परिणामv1शी जुळत नसल्यास विनंती नाकारा.
Bodies हे canonical JSON serialization (क्रमबद्ध keys, compact separators) आहेत आणि आम्ही पाठवतो तेच bytes नेमके sign करतो. सत्यापन मार्गदर्शक मध्ये अचूक signed string, कार्य केलेले उदाहरण, SDK शिवायचा code आणि legacy header आहे.
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);
},
);वितरण अर्थविषयक नियम
हे नियम एंडपॉइंट वितरणांना लागू होतात. लेगसी सिंगल-URL
webhook हा पुनःप्रयत्नांशिवाय एक समकालिक प्रयत्न असतो, अपवाद म्हणजे
फोन-कॉल telephony.incoming
कॉन्फिगरेशन एक्सचेंज, ज्याचा एकदा पुनःप्रयत्न केला जातो.
पुनःप्रयत्न
प्रत्येक इव्हेंटचा त्वरित एकदा प्रयत्न केला जातो. कोणताही 2xx प्रतिसाद
वितरण स्वीकारल्याची पुष्टी करतो. इतर कोणत्याही परिणामावर (non-2xx,
कनेक्शन त्रुटी, कालबाह्यता) आम्ही पहिल्या प्रयत्नानंतर 1 मिनिट, 5 मिनिटे, 30 मिनिटे, 2 तास, 6 तास,
12 तास आणि 24 तासांनी पुनःप्रयत्न करतो — 24 तासांमध्ये
एकूण 8 प्रयत्न. प्रत्येक प्रयत्न अयशस्वी झाल्यास, वितरण थांबते आणि एंडपॉइंटला
webhook endpoints मध्ये status="failing" म्हणून
चिन्हांकित केले जाते; आम्ही तुमच्या संस्थेच्या मालकांना आणि प्रशासकांना ईमेल पाठवतो
आणि ते डॅशबोर्डमध्ये दाखवतो. payload कायमस्वरूपी स्वीकारला जाताच 2xx परत करा;
असमकालिकपणे प्रक्रिया करा.
एंडपॉइंट चाचणी API कडून केलेल्या चाचणी पाठवण्यांना पहिल्या प्रयत्नानंतर सुमारे एक मिनिटाने
एक पुनःप्रयत्न मिळतो आणि ते एंडपॉइंटची स्थिती कधीही बदलत नाहीत.
क्रमवारी
वितरण क्रमवारी सर्वोत्तम-प्रयत्न तत्त्वावर असते. प्रत्यक्षात आम्ही इव्हेंट उत्सर्जित
होतात त्या क्रमाने वितरित करतो, परंतु अपयश झाल्यास पुनःप्रयत्नांमुळे क्रम बदलू शकतो.
नेहमी call_id / ऑब्जेक्ट id द्वारे डुप्लिकेट काढून टाका आणि पडताळणी करा.
डुप्लिकेट
वितरण किमान-एकदा असते: आम्हाला न दिसलेल्या प्रतिसादानंतरचा पुनःप्रयत्न
एखादा इव्हेंट डुप्लिकेट करू शकतो. प्रत्येक पुनःप्रयत्नात समान
event_id असतो, म्हणून प्रक्रिया केलेले id साठवा आणि पुनरावृत्ती वगळा. event_id
एंडपॉइंट्समध्येही सामायिक असतो — त्याच इव्हेंटची सदस्यता घेतलेल्या दोन एंडपॉइंट्सना
समान event_id मिळतो.
कालबाह्यता
एंडपॉइंट वितरणांसाठी प्रत्येक प्रयत्नाला 30 सेकंदांची कालबाह्यता असते. लेगसी
मार्गावर, थेट कॉलचे वर्तन नियंत्रित करणाऱ्या ब्लॉकिंग विनंत्या —
telephony.incoming / web.incoming
कॉन्फिगरेशन एक्सचेंज — फोन कॉलच्या पहिल्या प्रयत्नासाठी 10 सेकंदांपर्यंत
आणि त्याच्या एका पुनःप्रयत्नासह संपूर्ण एक्सचेंजसाठी 13 सेकंदांपर्यंत,
तसेच विजेट सत्रासाठी 10 सेकंदांपर्यंत मर्यादित असतात. धीमा प्रतिसाद
कॉल उचलण्यास विलंब करतो, म्हणून काही सेकंदांत उत्तर देण्याचे उद्दिष्ट ठेवा. Webhook-मोड tool dispatch मध्ये
डीफॉल्टनुसार 20 सेकंदांची परवानगी असते आणि टूल घोषणांमध्ये उच्च-स्तरीय timeout सेट करता येतो.
स्रोत IP
आउटबाउंड webhooks ThunderPhone च्या क्लाउड IP श्रेणीतून येतात. तुमच्या फायरवॉलला अनुमतीसूची आवश्यक असल्यास, सपोर्टशी संपर्क साधा आणि आम्ही सध्याच्या श्रेणी सामायिक करू.
लेगसी आणि एंडपॉइंट-आधारित webhooks यांपैकी निवडणे
| वैशिष्ट्य | लेगसी (/v1/webhook) | एंडपॉइंट्स (/v1/developer/webhook-endpoints) |
|---|---|---|
| URL ची संख्या | प्रत्येक संस्थेसाठी 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) | कधीही नाही — फक्त सूचना |
| यासाठी सर्वोत्तम | डायनॅमिक कॉल कॉन्फिगरेशन | उत्पादनातील इव्हेंट वापर |
नवीन एकत्रीकरणांनी एंडपॉइंट-आधारित webhooks द्वारे इव्हेंट वापरावेत. फक्त कॉल उचलतानाच्या वेळी तुम्ही कॉल डायनॅमिकरीत्या कॉन्फिगर करत असल्यास किंवा webhook-मोड टूल डिस्पॅच वापरत असल्यास लेगसी URL ठेवा (किंवा जोडा) — त्या विनंती/प्रतिसाद देवाणघेवाणी फक्त लेगसी मार्गावर चालतात.
संबंधित
सर्व इव्हेंट प्रकार आणि त्यांचे पेलोड.
अनेक एंडपॉइंट्स, इव्हेंट फिल्टर्स आणि सीक्रेट्स व्यवस्थापित करा.
कॉल कॉन्फिगर करण्यासाठी तुमच्या सर्व्हरने उत्तर देणे आवश्यक असलेली ब्लॉकिंग विनंती.
ट्रान्सक्रिप्ट, रेकॉर्डिंग आणि मेट्रिक्ससह कॉलनंतरचा पेलोड.