Open in
Veebihaakide ülevaade
Kuidas ThunderPhone edastab reaalajas sündmusi, kuidas kontrollida allkirju ning kuidas võrrelda pärand- ja lõpp-punktipõhiseid edastusmudeleid.
ThunderPhone saadab sinu serverile HTTP POST päringuid, kui kõne ajal
midagi toimub — sissetulev kõne algab, kõne lõpeb, hindamiskäitus
lõpeb, hoiatus käivitub jne. Saadetiste jaoks on kaks mudelit:
Mitu URL-i, lõpp-punktipõhised saladused, lõpp-punktipõhised sündmusefiltrid
ja automaatsed korduskatsed.
Halda GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints kaudu.
Üks URL organisatsiooni kohta. Sisaldab kõne elutsükli sündmusi, sealhulgas
blokeerivaid seadistuste vahetusi. Haldatakse GET/PUT /v1/webhook kaudu.
Kõik sündmuste kataloogis loetletud sündmusetüübid
edastatakse veebikonksu lõpp-punktide kaudu. Kuus kõne elutsükli sündmust
(telephony.incoming, telephony.complete, telephony.tool,
web.incoming, web.complete, web.tool) saadetakse samuti
pärand-veebikonksule ühe URL-iga — kui sul on nii pärand-URL kui ka
vastav lõpp-punkt, saad sündmuse kätte mõlemal teel. Blokeeriv
käitumine (telephony.incoming / web.incoming seadistuste
vahetus ja veebikonksurežiimi
tööriista suunamine) on ainult
pärandteel; iga lõpp-punkti edastus on vastust ootamata teavitus.
Andmevorming
Lõpp-punkti edastused on JSON-objektid väljadega data, event_id ja
type:
{
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
},
"event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
"type": "telephony.incoming"
}event_id on iga väljastatud sündmuse jaoks kordumatu. See on sama nii
korduskatsete kui ka iga sündmust vastuvõtva lõpp-punkti puhul —
kasuta seda duplikaatide eemaldamiseks.
Pärand-veebikonks ühe URL-iga saadab sama type ja data, kuid
ilma event_id-ta:
{
"type": "telephony.incoming",
"data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}Edastamisel serialiseeritakse iga sisu kanooniliselt — võtmed on tähestikulises järjekorras, tühikuid pole ja kasutatakse UTF-8 kodeeringut. Nendes dokumentides olevad vormindatud näited on ainult loetavuse jaoks.
Sündmusetüüpide ja andmeväljade täieliku loendi leiad sündmuste kataloogist.
Allkirja kontrollimine
Igal päringul on kaks signatuuri, mõlemad HMAC-SHA256 algoritmiga, kasutades
lõpp-punkti secret-it (või pärandkannete puhul sinu organisatsioonitaseme webhooki secret-it):
X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex>allkirjastab ajatempli, meetodi, tee ja päringu ning töötlemata sisu. Kontrolli seda ning lükka tagasi päringud, milleterineb sinu kellaajast rohkem kui 5 minutit, et pealt võetud päringut ei saaks hiljem uuesti esitada. Uuesti proovimised allkirjastatakse saatmisel uuesti.X-ThunderPhone-Signatureallkirjastab ainult töötlemata sisu. Seda saadetakse endiselt muutmata kujul, et olemasolevad kontrollijad töötaksid edasi.
Sammud
- Loe päis, meetod, toortee ja päring ning toorkeha enne mis tahes parsimist.
- Arvuta oma saladusega stringi
<t>\n<METHOD>\n<path and query>\n<body>heksadetsimaalne HMAC-SHA256. - Lükka päring tagasi, kui
terineb rohkem kui 300 sekundi võrra või kui tulemus ei ühtiv1-ga konstantse ajaga võrdluses.
Päringukehad kasutavad kanonilist JSON-jadastust (sorditud võtmed, kompaktsed eraldajad) ning allkirjastame täpselt edastatavad baidid. Kontrollimise juhend sisaldab täpset allkirjastatud stringi, läbitöötatud näidet, SDK-ta koodi ja pärandpäist.
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);
},
);Edastamise semantika
Need semantika kehtib lõpp-punkti edastuste kohta. Pärandne ühe URL-iga
veebihaak on üks sünkroonne katse ilma korduskatseteta, välja arvatud
telefonikõne telephony.incoming
konfiguratsioonivahetus, mida proovime ühe korra uuesti.
Korduskatsed
Iga sündmust proovitakse viivitamatult üks kord. Iga 2xx vastus
kinnitab edastuse. Kõigi muude tulemuste korral (mitte-2xx,
ühenduse viga, ajalõpp) proovime uuesti 1 min, 5 min, 30 min, 2 h, 6 h,
12 h ja 24 h pärast esimest katset — 8 katset 24 tunni jooksul.
Kui kõik katsed ebaõnnestuvad, edastus peatub ja lõpp-punkt
märgitakse veebihaagi lõpp-punktides
olekuga status="failing"; saadame e-kirja sinu organisatsiooni
omanikele ja administraatoritele ning kuvame selle juhtpaneelil. Tagasta 2xx kohe,
kui koormus on püsivalt vastu võetud; töötle seda asünkroonselt.
Lõpp-punkti test-API kaudu tehtud testsaatmised saavad umbes minuti pärast
esimest katset ühe korduskatse ega muuda kunagi lõpp-punkti olekut.
Järjestus
Edastuste järjekord ei ole garanteeritud. Praktikas edastame sündmused
nende väljastamise järjekorras, kuid ebaõnnestumise korral võivad uuesti
proovimised järjekorda muuta. Deduplikeeri ja kooskõlasta alati call_id /
objekti ID järgi.
Duplikaadid
Edastamine toimub vähemalt üks kord: uuesti proovimine pärast vastust,
mida me ei saanud, võib sündmuse dubleerida. Iga uuesti proovimine sisaldab sama
event_id, seega salvesta töödeldud ID-d ja jäta kordused vahele. event_id on
jagatud ka lõpp-punktide vahel — kaks sama sündmuse tellinud lõpp-punkti
saavad sama event_id.
Ajalõpud
Lõpp-punkti edastuste iga katse ajalõpp on 30 s. Pärandteel on
reaalajas kõne käitumist juhtivad blokeerivad päringud —
telephony.incoming / web.incoming
konfiguratsioonivahetus — telefonikõne esimese katse puhul piiratud
10 s, kogu vahetuse puhul koos ühe korduskatsega 13 s ning
vidinaseansi puhul 10 s. Aeglane vastus lükkab kõne vastuvõtmist
edasi, seega püüa vastata paari sekundi jooksul. Veebihaagi režiimis tööriistade väljakutsumine võimaldab
vaikimisi 20 s ning tööriista deklaratsioonides võib juurtasemel määrata timeout.
Lähte-IP-d
Väljuvad veebikonksud pärinevad ThunderPhone'i pilve IP-vahemikust. Kui sinu tulemüür nõuab lubatud loendit, võta ühendust toega ja jagame praeguseid vahemikke.
Valimine pärand- ja lõpp-punktipõhiste veebikonksude vahel
| Funktsioon | Pärand (/v1/webhook) | Lõpp-punktid (/v1/developer/webhook-endpoints) |
|---|---|---|
| URL-ide arv | 1 organisatsiooni kohta | Mitu organisatsiooni kohta |
| Sündmuste hõlmatus | Ainult telephony.* / web.* | Kõik 10 sündmusetüüpi |
| Sündmuste filter | — | Lõpp-punkti kaupa |
| Uuesti proovimised | Puuduvad, välja arvatud üks telefonikõne konfiguratsioonivahetuse jaoks | 8 katset 24 h jooksul |
| Ümbrik | type + data | type + data + event_id |
| Salajase võtme roteerimine | Asendab ühe salajase võtme | Lõpp-punktipõhine salajane võti |
| Keelamine ilma kustutamiseta | PUT /v1/webhook with {"url": ""} | status=disabled |
| Oleku nähtavus | — | active / disabled / failing |
| Blokeeriv konfiguratsioonivahetus | Jah (telephony.incoming / web.incoming) | Mitte kunagi — ainult teavitused |
| Parim kasutusjuht | Dünaamiline kõne seadistamine | Sündmuste töötlemine tootmiskeskkonnas |
Uued integratsioonid peaksid tarbima sündmusi lõpp-punktipõhiste veebikonksude kaudu. Hoia (või lisa) pärand-URL ainult siis, kui seadistad kõnesid dünaamiliselt kõne vastuvõtmise ajal või kasutad veebikonksurežiimi tööriista väljakutsumist — need päringu/vastuse vahetused töötavad ainult pärandteel.
Seotud
Kõik sündmusetüübid ja nende andmekoormused.
Halda mitut lõpp-punkti, sündmusefiltreid ja salavõtmeid.
Blokeeriv päring, millele sinu server peab kõnede seadistamiseks vastama.
Kõnejärgne andmekoormus transkriptsiooni, salvestise ja mõõdikutega.