Open in
వెబ్హుక్స్ అవలోకనం
ThunderPhone రియల్-టైమ్ ఈవెంట్లను ఎలా అందిస్తుందో, సంతకాలను ఎలా ధృవీకరించాలో, అలాగే లెగసీ మరియు ఎండ్పాయింట్-ఆధారిత డెలివరీ మోడల్లను ఎలా పోల్చాలో తెలుసుకోండి.
ThunderPhone కాల్ సమయంలో సంఘటనలు జరిగినప్పుడు మీ సర్వర్కు HTTP POST అభ్యర్థనలను పంపుతుంది — ఇన్బౌండ్ కాల్ ప్రారంభమైనప్పుడు, కాల్ ముగిసినప్పుడు, గ్రేడింగ్ రన్ పూర్తైనప్పుడు, అలర్ట్ ట్రిగర్ అయినప్పుడు మొదలైనవి. రెండు డెలివరీ మోడళ్లు ఉన్నాయి:
బహుళ URLలు, ప్రతి ఎండ్పాయింట్కు ప్రత్యేక సీక్రెట్లు, ప్రతి ఎండ్పాయింట్కు ప్రత్యేక ఈవెంట్ ఫిల్టర్లు,
మరియు ఆటోమేటిక్ రీట్రైలు.
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 ఉపయోగించబడుతుంది. ఈ డాక్యుమెంటేషన్లోని చదవడానికి సులభమైన ఉదాహరణలు స్పష్టత కోసం మాత్రమే.
ఈవెంట్ రకాలు మరియు పేలోడ్ ఫీల్డ్ల పూర్తి జాబితా కోసం ఈవెంట్ల కేటలాగ్ చూడండి.
సిగ్నేచర్ ధృవీకరణ
ప్రతి రిక్వెస్ట్లో 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 ప్రతిస్పందన
డెలివరీని అంగీకరిస్తుంది. ఇతర ఏ ఫలితం వచ్చినా (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ను ఉంచండి (లేదా జోడించండి) — ఆ అభ్యర్థన/ప్రతిస్పందన మార్పిడులు లెగసీ మార్గంలో మాత్రమే నడుస్తాయి.
సంబంధిత
అన్ని ఈవెంట్ రకాలు మరియు వాటి పేలోడ్లు.
బహుళ ఎండ్పాయింట్లు, ఈవెంట్ ఫిల్టర్లు మరియు సీక్రెట్లను నిర్వహించండి.
కాల్లను కాన్ఫిగర్ చేయడానికి మీ సర్వర్ తప్పనిసరిగా సమాధానం ఇవ్వాల్సిన బ్లాకింగ్ అభ్యర్థన.
ట్రాన్స్క్రిప్ట్, రికార్డింగ్ మరియు మెట్రిక్లతో కూడిన కాల్ తర్వాతి పేలోడ్.