Open in
વેબહુક્સનો પરિચય
ThunderPhone રીઅલ-ટાઇમ ઇવેન્ટ્સ કેવી રીતે પહોંચાડે છે, સહી કેવી રીતે ચકાસવી અને લેગસી તથા એન્ડપોઇન્ટ-આધારિત ડિલિવરી મોડલ્સની સરખામણી કેવી રીતે થાય છે.
ThunderPhone કૉલ દરમિયાન ઘટનાઓ બને ત્યારે તમારા સર્વર પર HTTP POST વિનંતીઓ મોકલે છે — ઇનબાઉન્ડ કૉલ શરૂ થાય, કૉલ સમાપ્ત થાય, ગ્રેડિંગ રન પૂર્ણ થાય, એલર્ટ ટ્રિગર થાય, વગેરે. બે ડિલિવરી મોડલ્સ છે:
એકથી વધુ URL, દરેક એન્ડપૉઇન્ટ માટે સિક્રેટ્સ, દરેક એન્ડપૉઇન્ટ માટે ઇવેન્ટ ફિલ્ટર્સ,
અને સ્વચાલિત રિટ્રાય.
GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints દ્વારા મેનેજ કરો.
દરેક ઑર્ગ માટે એક URL. તેમાં બ્લૉકિંગ કૉન્ફિગરેશન એક્સચેન્જ સહિત
કૉલ-લાઇફસાયકલ ઇવેન્ટ્સ હોય છે. GET/PUT /v1/webhook પર મેનેજ કરવામાં આવે છે.
ઇવેન્ટ્સ કેટલોગમાંના તમામ 10 ઇવેન્ટ પ્રકારો
વેબહૂક એન્ડપૉઇન્ટ્સ દ્વારા ડિલિવર થાય છે. 6 કૉલ-લાઇફસાયકલ ઇવેન્ટ્સ
(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 છે
(અથવા લેગસી ડિલિવરી માટે તમારું org-સ્તરનું webhook 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 / ઑબ્જેક્ટ id દ્વારા ડિડુપ કરો અને સમાધાન કરો.
ડુપ્લિકેટ્સ
ડિલિવરી ઓછામાં-ઓછું-એકવાર છે: જે પ્રતિસાદ અમે ક્યારેય
જોયો નથી તે પછીનો પુનઃપ્રયાસ ઇવેન્ટની ડુપ્લિકેટ બનાવી શકે છે. દરેક પુનઃપ્રયાસમાં સમાન
event_id હોય છે, તેથી પ્રક્રિયા કરેલી ids સંગ્રહો અને પુનરાવર્તનો છોડો. event_id
એન્ડપોઇન્ટ્સ વચ્ચે પણ શેર થાય છે — એક જ ઇવેન્ટ માટે સબ્સ્ક્રાઇબ થયેલા બે
એન્ડપોઇન્ટ્સને સમાન event_id મળે છે.
સમયસમાપ્તિઓ
એન્ડપોઇન્ટ ડિલિવરીમાં દરેક પ્રયાસ માટે 30 સેકન્ડની સમયસમાપ્તિ હોય છે. લેગસી
પાથ પર, લાઇવ કૉલ વર્તન નિયંત્રિત કરતી બ્લોકિંગ વિનંતીઓ —
telephony.incoming / web.incoming
કન્ફિગરેશન વિનિમય — 10 સેકન્ડ પછી સમયસમાપ્ત થાય છે, પરંતુ ધીમો
પ્રતિસાદ કૉલ ઉપાડવામાં વિલંબ કરે છે, તેથી બે-એક સેકન્ડમાં જવાબ આપવાનો
પ્રયાસ કરો. વેબહુક-મોડ ટૂલ ડિસ્પેચ માટે ડિફૉલ્ટ રૂપે 20 સેકન્ડ
મંજૂર છે, અને ટૂલ ઘોષણાઓ ટોપ-લેવલ timeout સેટ કરી શકે છે.
સ્ત્રોત IPs
આઉટબાઉન્ડ વેબહુક્સ ThunderPhoneની ક્લાઉડ IP રેન્જમાંથી આવે છે. જો તમારા ફાયરવૉલને allowlist જરૂરી હોય, તો સપોર્ટનો સંપર્ક કરો અને અમે વર્તમાન રેન્જ શેર કરીશું.
લેગસી અને એન્ડપોઇન્ટ-આધારિત વેબહુક્સ વચ્ચે પસંદગી
| સુવિધા | લેગસી (/v1/webhook) | એન્ડપોઇન્ટ્સ (/v1/developer/webhook-endpoints) |
|---|---|---|
| URLsની સંખ્યા | પ્રતિ સંસ્થા 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 રાખો (અથવા ઉમેરો) — તે વિનંતી/પ્રતિસાદ વિનિમયો માત્ર લેગસી પાથ પર ચાલે છે.
સંબંધિત
તમામ ઇવેન્ટ પ્રકારો અને તેમના પેલોડ્સ.
ઘણા એન્ડપોઇન્ટ્સ, ઇવેન્ટ ફિલ્ટર્સ અને સિક્રેટ્સ મેનેજ કરો.
કૉલ્સ કન્ફિગર કરવા માટે તમારા સર્વરે જવાબ આપવી જરૂરી એવી બ્લોકિંગ વિનંતી.
ટ્રાન્સક્રિપ્ટ, રેકોર્ડિંગ અને મેટ્રિક્સ સાથેનો કૉલ-પછીનો પેલોડ.