Open in
Webhook apžvalga
Kaip ThunderPhone perduoda įvykius realiuoju laiku, kaip patikrinti parašus ir kuo skiriasi senasis bei galinių taškų pagrindu veikiantys perdavimo modeliai.
ThunderPhone siunčia HTTP POST užklausas į jūsų serverį, kai skambučio metu
įvyksta tam tikri veiksmai — prasideda įeinantis skambutis, baigiasi skambutis, užbaigiamas vertinimas,
suveikia įspėjimas ir pan. Yra du pristatymo
modeliai:
Keli URL, kiekvieno galinio taško paslaptys, kiekvieno galinio taško įvykių filtrai
ir automatiniai pakartotiniai bandymai.
Tvarkykite naudodami GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints.
Vienas URL kiekvienai organizacijai. Perduoda skambučio ciklo įvykius, įskaitant
blokuojamuosius konfigūracijos duomenų mainus. Tvarkomas per GET/PUT /v1/webhook.
Visi įvykių kataloge išvardyti įvykių tipai
pristatomi per žiniatinklio kabliukų galinius taškus. Šeši skambučio ciklo įvykiai
(telephony.incoming, telephony.complete, telephony.tool,
web.incoming, web.complete, web.tool) taip pat siunčiami į
pasenusį vieno URL žiniatinklio kabliuką — jei turite ir pasenusį URL, ir
atitinkamą galinį tašką, įvykį gaunate abiem keliais. Blokuojamasis
veikimas (telephony.incoming / web.incoming konfigūracijos
duomenų mainai ir žiniatinklio kabliuko režimo
įrankių iškvietimas) galimas
tik pasenusiu keliu; kiekvienas pristatymas į galinį tašką yra pranešimas
be atsakymo laukimo.
Duomenų formato struktūra
Pristatymai į galinius taškus yra JSON objektas su data, event_id ir
type:
{
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
},
"event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
"type": "telephony.incoming"
}event_id yra unikalus kiekvienam išsiųstam įvykiui. Jis nesikeičia per
pakartotinius bandymus ir visuose galiniuose taškuose, kurie gauna įvykį — naudokite jį dublikatams pašalinti.
Pasenęs vieno URL žiniatinklio kabliukas siunčia tokius pačius type ir data, tačiau
be event_id:
{
"type": "telephony.incoming",
"data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}Perduodant tinklu, kiekvienas turinys serializuojamas kanoniškai — raktai surikiuojami abėcėlės tvarka, nėra tarpų, naudojama UTF-8. Gražiai suformatuoti pavyzdžiai šioje dokumentacijoje pateikiami tik dėl skaitomumo.
Visą įvykių tipų ir duomenų laukų sąrašą rasite Įvykių kataloge.
Parašo tikrinimas
Kiekviena užklausa turi du parašus, abu HMAC-SHA256 su galinio taško
secret raktu (arba jūsų organizacijos lygio webhook secret, skirtu senesniems
pristatymams):
X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex>pasirašo laiko žymą, metodą, kelią ir užklausos parametrus bei neapdorotą turinį. Patikrinkite šį parašą ir atmeskite užklausas, kuriųtnuo jūsų laikrodžio skiriasi daugiau nei 5 minutes, kad perimtos užklausos vėliau nebūtų galima pakartoti. Pakartotiniai bandymai siunčiant pasirašomi iš naujo.X-ThunderPhone-Signaturepasirašo tik neapdorotą turinį. Jis vis dar siunčiamas nepakitęs, kad esami tikrintuvai ir toliau veiktų.
Veiksmai
- Prieš bet kokį analizavimą nuskaitykite antraštę, metodą, neapdorotą kelią ir užklausą bei neapdorotą turinį.
- Naudodami savo slaptą raktą apskaičiuokite
<t>\n<METHOD>\n<path and query>\n<body>šešioliktainę HMAC-SHA256 reikšmę. - Atmeskite užklausą, jei
tskiriasi daugiau nei 300 sekundžių arba jei rezultatas neatitinkav1palyginant pastoviuoju laiku.
Turiniai yra kanoninė JSON serijinė forma (surikiuoti raktai, kompaktiški skirtukai), o mes pasirašome tiksliai tuos baitus, kuriuos perduodame. Patvirtinimo vadove pateikta tiksli pasirašyta eilutė, veikiantis pavyzdys, kodas be SDK ir senoji antraštė.
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);
},
);Pristatymo semantika
Ši semantika taikoma galinio taško pristatymams. Senasis vieno URL
webhook naudoja vieną sinchroninį bandymą be pakartotinių bandymų, išskyrus
telefono skambučio telephony.incoming
konfigūracijos apsikeitimą, kuris pakartojamas vieną kartą.
Pakartotiniai bandymai
Kiekvienas įvykis iš karto bandomas pristatyti vieną kartą. Bet kuris 2xx atsakymas
patvirtina pristatymą. Esant bet kokiam kitam rezultatui (ne 2xx,
ryšio klaida, laiko limitas), bandome dar kartą po 1 min., 5 min., 30 min., 2 val., 6 val.,
12 val. ir 24 val. nuo pirmojo bandymo — iš viso 8 bandymai per
24 valandas. Jei nepavyksta nė vienas bandymas, pristatymas sustabdomas, o galinis taškas
webhook galiniuose taškuose pažymimas
status="failing"; el. paštu informuojame jūsų organizacijos
savininkus ir administratorius bei parodome tai valdymo skydelyje. Grąžinkite 2xx, kai tik
duomenų paketas patikimai priimamas; apdorokite asinchroniškai.
Bandomosios siuntos iš galinio taško testavimo API pakartojamos vieną kartą maždaug po minutės
nuo pirmojo bandymo ir niekada nekeičia galinio taško būsenos.
Eiliškumas
Pristatymo eiliškumas užtikrinamas pagal geriausių pastangų principą. Praktikoje pristatome
įvykius jų sugeneravimo tvarka, tačiau nesėkmės atveju pakartotiniai bandymai gali pakeisti eiliškumą.
Visada deduplikuokite ir sutaikykite pagal call_id / objekto id.
Dublikatai
Pristatymas vyksta bent vieną kartą: pakartotinis bandymas po atsakymo, kurio negavome,
gali dubliuoti įvykį. Kiekvienas pakartotinis bandymas turi tą patį
event_id, todėl saugokite apdorotus identifikatorius ir praleiskite pasikartojimus. event_id taip pat
bendrinamas tarp galinių taškų — du galiniai taškai, prenumeruojantys tą patį
įvykį, gauna tą patį event_id.
Laiko limitai
Galinių taškų pristatymams taikomas 30 s laiko limitas kiekvienam bandymui. Senajame
kelyje blokuojančioms užklausoms, lemiančioms tiesioginio skambučio veikimą —
telephony.incoming / web.incoming
konfigūracijos apsikeitimui — taikoma 10 s riba pirmajam telefono skambučio
bandymui ir 13 s visam apsikeitimui, įskaitant vieną
pakartotinį bandymą, o valdiklio sesijai — 10 s. Lėtas atsakymas vėluoja
atsiliepimą į skambutį, todėl stenkitės atsakyti per kelias sekundes. Webhook režimo įrankių iškvietimas pagal numatytuosius nustatymus leidžia 20 s,
o įrankių deklaracijose gali būti nustatytas aukščiausio lygio timeout.
Šaltinio IP adresai
Siunčiami žiniatinklio pranešimai gaunami iš ThunderPhone debesijos IP adresų diapazono. Jei jūsų užkardai reikalingas leidžiamųjų adresų sąrašas, susisiekite su palaikymo komanda, ir mes pateiksime aktualius diapazonus.
Pasirinkimas tarp senųjų ir galiniais taškais pagrįstų žiniatinklio pranešimų
| Funkcija | Senasis (/v1/webhook) | Galutiniai taškai (/v1/developer/webhook-endpoints) |
|---|---|---|
| URL skaičius | 1 vienai organizacijai | Daug vienai organizacijai |
| Įvykių aprėptis | Tik telephony.* / web.* | Visi 10 įvykių tipų |
| Įvykių filtras | — | Kiekvienam galutiniam taškui |
| Pakartotiniai bandymai | Nėra, išskyrus vieną telefono skambučio konfigūracijos apsikeitimui | 8 bandymai per 24 val. |
| Vokas | type + data | type + data + event_id |
| Slaptojo rakto keitimas | Pakeičia vienintelį slaptąjį raktą | Slaptasis raktas kiekvienam galutiniam taškui |
| Išjungimas nešalinant | PUT /v1/webhook su {"url": ""} | status=disabled |
| Būsenos matomumas | — | active / disabled / failing |
| Blokuojantis konfigūracijos apsikeitimas | Taip (telephony.incoming / web.incoming) | Niekada — tik pranešimai |
| Geriausiai tinka | Dinaminei skambučių konfigūracijai | Įvykių gavimui produkcinėje aplinkoje |
Naujos integracijos turėtų apdoroti įvykius per galiniais taškais pagrįstus žiniatinklio pranešimus. Palikite (arba pridėkite) senąjį URL tik jei skambučius konfigūruojate dinamiškai jų priėmimo metu arba naudojate žiniatinklio pranešimų režimo įrankių iškvietimą — šie užklausos ir atsakymo mainai vykdomi tik senuoju keliu.
Susiję
Visi įvykių tipai ir jų duomenų paketai.
Tvarkykite kelis galinius taškus, įvykių filtrus ir paslaptis.
Blokuojanti užklausa, į kurią jūsų serveris turi atsakyti, kad sukonfigūruotų skambučius.
Po skambučio siunčiamas duomenų paketas su transkriptu, įrašu ir metrika.