Open in
વેબહુક્સનો અવલોકન
ThunderPhone રીઅલ-ટાઇમ ઇવેન્ટ્સ કેવી રીતે પહોંચાડે છે, સહીની ચકાસણી કેવી રીતે કરવી, અને લેગસી તથા એન્ડપોઇન્ટ-આધારિત ડિલિવરી મોડલ્સની તુલના કેવી રીતે થાય છે.
ThunderPhone કૉલ દરમિયાન ઘટનાઓ બને ત્યારે તમારા સર્વરને HTTP POST રિક્વેસ્ટ મોકલે છે — ઇનબાઉન્ડ કૉલ શરૂ થાય, કૉલ સમાપ્ત થાય, ગ્રેડિંગ રન પૂર્ણ થાય, એલર્ટ ટ્રિગર થાય, વગેરે. બે ડિલિવરી મોડલ્સ છે:
બહુવિધ URLs, દરેક એન્ડપોઇન્ટ માટે અલગ સિક્રેટ્સ, દરેક એન્ડપોઇન્ટ માટે ઇવેન્ટ ફિલ્ટર્સ,
અને સ્વચાલિત રિટ્રાય.
GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints દ્વારા મેનેજ કરો.
દરેક org માટે એક 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 (અથવા legacy ડિલિવરી માટે તમારા org-સ્તરના webhook secret) વડે કી કરાયેલ HMAC-SHA256 છે:
X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex>timestamp, method, path અને query, તેમજ raw body પર સહી કરે છે. આની ચકાસણી કરો અને એવા વિનંતીઓ નકારી કાઢો જેમનુંtતમારી ઘડિયાળ કરતાં 5 મિનિટથી વધુ દૂર હોય, જેથી કૅપ્ચર કરેલી વિનંતી પછીથી ફરી ચલાવી ન શકાય. ફરી પ્રયાસો મોકલાય ત્યારે તેમની પર ફરીથી સહી કરવામાં આવે છે.X-ThunderPhone-Signatureમાત્ર raw body પર સહી કરે છે. હાલના verifiers કાર્યરત રહે તે માટે તે હજી પણ અપરિવર્તિત રીતે મોકલવામાં આવે છે.
પગલાં
- કોઈપણ પાર્સિંગ પહેલાં હેડર, મેથડ, રૉ પાથ અને ક્વેરી, તથા રૉ બોડી વાંચો.
- તમારા સિક્રેટ સાથે
<t>\n<METHOD>\n<path and query>\n<body>નો હેક્સ HMAC-SHA256 ગણો. - જો
t300 સેકન્ડથી વધુ સમયથી અલગ હોય અથવા કોન્સ્ટન્ટ-ટાઇમ સરખામણીમાં પરિણામv1સાથે મેળ ખાતું ન હોય, તો રિક્વેસ્ટ નકારી કાઢો.
બોડીઝ કેનોનિકલ 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);
},
);ડિલિવરી સીમેન્ટિક્સ
આ અર્થઘટનો એન્ડપૉઇન્ટ ડિલિવરીઓ પર લાગુ પડે છે. લેગસી સિંગલ-URL
વેબહૂક એક જ સમકાલીન પ્રયાસ છે જેમાં કોઈ પુનઃપ્રયાસ નથી, સિવાય કે
ફોન-કૉલ telephony.incoming
રૂપરેખાંકન વિનિમય, જેને એક વાર ફરી પ્રયાસ કરવામાં આવે છે.
પુનઃપ્રયાસ
દરેક ઇવેન્ટનો તરત જ એક વાર પ્રયાસ કરવામાં આવે છે. કોઈપણ 2xx પ્રતિસાદ
ડિલિવરીની પુષ્ટિ કરે છે. અન્ય કોઈપણ પરિણામમાં (non-2xx,
કનેક્શન ભૂલ, સમયસમાપ્તિ), અમે પ્રથમ પ્રયાસ પછી 1 મિનિટ, 5 મિનિટ, 30 મિનિટ, 2 કલાક, 6 કલાક,
12 કલાક અને 24 કલાકે ફરી પ્રયાસ કરીએ છીએ — 24 કલાકમાં કુલ 8 પ્રયાસો.
જો દરેક પ્રયાસ નિષ્ફળ જાય, તો ડિલિવરી બંધ થાય છે અને એન્ડપૉઇન્ટને
વેબહૂક એન્ડપૉઇન્ટ્સમાં status="failing" તરીકે
ચિહ્નિત કરવામાં આવે છે; અમે તમારી સંસ્થાના માલિકો અને એડમિન્સને ઇમેઇલ કરીએ છીએ
અને તેને ડેશબોર્ડમાં બતાવીએ છીએ. પેલોડ સ્થાયી રીતે સ્વીકારવામાં આવે કે તરત 2xx
પરત કરો; અસિંક્રોનસ રીતે પ્રક્રિયા કરો.
એન્ડપૉઇન્ટ ટેસ્ટ APIમાંથી ટેસ્ટ મોકલણોને પ્રથમ પ્રયાસ પછી લગભગ એક મિનિટે એક પુનઃપ્રયાસ મળે છે
અને તે એન્ડપૉઇન્ટની સ્થિતિ ક્યારેય બદલતા નથી.
ક્રમ
ડિલિવરી ક્રમ શક્ય તેટલો જાળવવામાં આવે છે. વ્યવહારમાં અમે ઇવેન્ટ્સ ઉત્સર્જિત થાય તે
ક્રમમાં ડિલિવર કરીએ છીએ, પરંતુ નિષ્ફળતા પર પુનઃપ્રયાસો ક્રમ બદલી શકે છે.
હંમેશાં call_id / ઑબ્જેક્ટ id દ્વારા ડિડુપ્લિકેટ કરો અને સમાધાન કરો.
ડુપ્લિકેટ્સ
ડિલિવરી ઓછામાં ઓછી એક વખત છે: જે પ્રતિસાદ અમે ક્યારેય જોયો નથી તે પછીનો
પુનઃપ્રયાસ ઇવેન્ટની ડુપ્લિકેટ બનાવી શકે છે. દરેક પુનઃપ્રયાસમાં સમાન
event_id હોય છે, તેથી પ્રક્રિયા કરેલ ids સંગ્રહિત કરો અને પુનરાવર્તનો છોડો. event_id
એન્ડપોઇન્ટ્સ વચ્ચે પણ શેર થાય છે — સમાન ઇવેન્ટ માટે સબ્સ્ક્રાઇબ કરેલા બે
એન્ડપોઇન્ટ્સને સમાન event_id મળે છે.
સમયસમાપ્તિઓ
એન્ડપૉઇન્ટ ડિલિવરીમાં પ્રતિ પ્રયાસ 30 સેકન્ડની સમયસમાપ્તિ હોય છે. લેગસી
પાથ પર, લાઇવ કૉલના વર્તનને નિયંત્રિત કરતી અવરોધક વિનંતીઓ —
telephony.incoming / web.incoming
રૂપરેખાંકન વિનિમય — ફોન કૉલના પ્રથમ પ્રયાસ માટે 10 સેકન્ડ સુધી
અને તેના એક પુનઃપ્રયાસ સહિત સમગ્ર વિનિમય માટે 13 સેકન્ડ સુધી,
તેમજ વિજેટ સત્ર માટે 10 સેકન્ડ સુધી મર્યાદિત છે. ધીમો પ્રતિસાદ
કૉલ ઉપાડવામાં વિલંબ કરે છે, તેથી થોડા સેકન્ડમાં જવાબ આપવાનો પ્રયાસ કરો. વેબહૂક-મોડ ટૂલ ડિસ્પૅચ મૂળભૂત રીતે 20 સેકન્ડ
આપે છે, અને ટૂલ ઘોષણાઓ ટોચના સ્તરનું timeout સેટ કરી શકે છે.
સ્રોત IPs
આઉટબાઉન્ડ વેબહૂક્સ ThunderPhoneની ક્લાઉડ IP રેન્જમાંથી ઉદ્ભવે છે. જો તમારા ફાયરવૉલને અનુમતિસૂચિની જરૂર હોય, તો સપોર્ટનો સંપર્ક કરો અને અમે વર્તમાન રેન્જો શેર કરીશું.
લેગસી અને એન્ડપોઇન્ટ-આધારિત વેબહૂક્સ વચ્ચે પસંદગી
| સુવિધા | લેગસી (/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) | ક્યારેય નહીં — માત્ર નોટિફિકેશન્સ |
| આ માટે શ્રેષ્ઠ | ડાયનેમિક કૉલ કૉન્ફિગરેશન | પ્રોડક્શનમાં ઇવેન્ટ વપરાશ |
નવી ઇન્ટિગ્રેશન્સે એન્ડપોઇન્ટ-આધારિત વેબહૂક્સ દ્વારા ઇવેન્ટ્સ વાપરવી જોઈએ. જો તમે પિકઅપ સમયે કૉલ્સને ડાયનેમિક રીતે કન્ફિગર કરો છો અથવા વેબહૂક-મોડ ટૂલ ડિસ્પેચ વાપરો છો, તો જ લેગસી URL રાખો (અથવા ઉમેરો) — આ વિનંતી/પ્રતિસાદ વિનિમયો માત્ર લેગસી પાથ પર ચાલે છે.
સંબંધિત
તમામ ઇવેન્ટ પ્રકારો અને તેમના પેલોડ્સ.
અનેક એન્ડપોઇન્ટ્સ, ઇવેન્ટ ફિલ્ટર્સ અને સિક્રેટ્સનું સંચાલન કરો.
કૉલ્સ કૉન્ફિગર કરવા માટે તમારા સર્વરે જવાબ આપવો આવશ્યક હોય તેવી બ્લોકિંગ રિક્વેસ્ટ.
ટ્રાન્સક્રિપ્ટ, રેકોર્ડિંગ અને મેટ્રિક્સ સાથેનો કૉલ પછીનો પેલોડ.