ThunderPhone 2.0 je tu.Začnite sami, že od 2 ¢/min.Preberite obvestilo

Webhooks

Pregled spletnih kavljev

Kako ThunderPhone posreduje dogodke v realnem času, kako preverite podpise in kako se primerjata starejši model dostave ter model dostave, ki temelji na končnih točkah.

ThunderPhone pošlje zahteve HTTP POST na vaš strežnik, ko se med klicem nekaj zgodi — začne se dohodni klic, klic se konča, dokonča se ocenjevanje, sproži se opozorilo in podobno. Na voljo sta dva modela dostave:

Vse navedene vrste dogodkov v katalogu dogodkov so dostavljene prek končnih točk webhookov. Šest dogodkov življenjskega cikla klica (telephony.incoming, telephony.complete, telephony.tool, web.incoming, web.complete, web.tool) je prav tako poslanih v podedovani webhook z enim naslovom URL — če imate tako podedovani naslov URL kot ujemajočo se končno točko, dogodek prejmete po obeh poteh. Blokirajoče vedenje ( izmenjava konfiguracije telephony.incoming / web.incoming in pošiljanje orodij v načinu webhook) je na voljo izključno na podedovani poti; vsaka dostava na končno točko je obvestilo brez čakanja na odgovor.

Oblika koristnega tovora

Dostave na končne točke so objekt JSON z data, event_id in type:

{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}

event_id je enoličen za vsak poslan dogodek. Enak je pri ponovnih poskusih in pri vsaki končni točki, ki prejme dogodek — na njegovi podlagi odstranjujte dvojnike.

Podedovani webhook z enim naslovom URL pošlje enaka type in data, vendar brez event_id:

{
  "type": "telephony.incoming",
  "data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}

Pri prenosu je vsako telo kanonično serializirano — ključi so razvrščeni po abecedi, brez presledkov, v UTF-8. Primeri z lepim oblikovanjem v tej dokumentaciji so namenjeni le boljši berljivosti.

Za celoten seznam vrst dogodkov in polj koristnega tovora si oglejte katalog dogodkov.

Preverjanje podpisa

Vsaka zahteva vsebuje dva podpisa, oba HMAC-SHA256 s ključem secret končne točke (ali secret spletnega kavlja na ravni vaše organizacije za starejše dostave):

  • X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex> podpisuje časovni žig, metodo, pot in poizvedbo ter neobdelano telo. Preverite tega in zavrnite zahteve, pri katerih je t od vaše ure oddaljen več kot 5 minut, da prestrežene zahteve pozneje ni mogoče znova predvajati. Ponovni poskusi se ob pošiljanju znova podpišejo.
  • X-ThunderPhone-Signature podpisuje samo neobdelano telo. Še vedno se pošilja nespremenjen, da obstoječi preverjevalniki še naprej delujejo.

Koraki

  1. Preberite glavo, metodo, neobdelano pot in poizvedbo ter neobdelano telo pred kakršnim koli razčlenjevanjem.
  2. Izračunajte šestnajstiški HMAC-SHA256 za <t>\n<METHOD>\n<path and query>\n<body> s svojim skrivnim ključem.
  3. Zahtevo zavrnite, če t odstopa za več kot 300 sekund ali če se rezultat pri primerjavi v konstantnem času ne ujema z v1.

Tela so kanonična serializacija JSON (razvrščeni ključi, strnjena ločila), mi pa podpišemo natanko bajte, ki jih posredujemo. Vodnik za preverjanje vsebuje natančen podpisani niz, izdelan primer, kodo brez SDK-ja in zastarelo glavo.

Python (Flask)
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 "", 204
Node.js (Express)
import 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);
  },
);

Semantika dostave

Ta pravila veljajo za dostave na končne točke. Podedovani webhook z enim URL-jem izvede en sinhroni poskus brez ponovnih poskusov, razen izmenjave konfiguracije za telefonski klic telephony.incoming, ki se ponovi enkrat.

Ponovni poskusi

Vsak dogodek se takoj poskusi dostaviti enkrat. Vsak odgovor 2xx potrdi dostavo. Ob vsakem drugem izidu (ne-2xx, napaka povezave, časovna omejitev) dostavo ponovimo 1 minuto, 5 minut, 30 minut, 2 uri, 6 ur, 12 ur in 24 ur po prvem poskusu — skupaj 8 poskusov v 24 urah. Če vsi poskusi ne uspejo, se dostava ustavi in končna točka je v končnih točkah webhookov označena z status="failing"; lastnikom in skrbnikom vaše organizacije pošljemo e-poštno sporočilo ter to prikažemo na nadzorni plošči. 2xx vrnite takoj, ko je koristni tovor trajno sprejet; obdelajte ga asinhrono. Testna pošiljanja iz API-ja za testiranje končnih točk dobijo en ponovni poskus približno minuto po prvem poskusu in nikoli ne spremenijo stanja končne točke.

Vrstni red

Vrstni red dostave je po najboljših močeh. V praksi dostavljamo v vrstnem redu, v katerem so dogodki ustvarjeni, vendar lahko ponovitve ob napaki spremenijo vrstni red. Vedno odstranite dvojnike in uskladite podatke po call_id / ID-ju objekta.

Dvojniki

Dostava je vsaj enkratna: ponovitev po odgovoru, ki ga nikoli nismo prejeli, lahko podvoji dogodek. Vsaka ponovitev vsebuje isti event_id, zato shranite obdelane ID-je in preskočite ponovitve. event_id je skupen tudi med končnimi točkami — dve končni točki, naročeni na isti dogodek, prejmeta isti event_id.

Časovne omejitve

Dostave na končne točke imajo časovno omejitev 30 sekund na poskus. Na podedovani poti so blokirajoče zahteve, ki usmerjajo vedenje klica v živo — izmenjava konfiguracije telephony.incoming / web.incoming — omejene na 10 sekund za prvi poskus telefonskega klica in 13 sekund za celotno izmenjavo, vključno z enim ponovnim poskusom, ter na 10 sekund za sejo gradnika. Počasen odgovor zakasni sprejem klica, zato odgovorite v nekaj sekundah. Pošiljanje orodij v načinu webhook privzeto omogoča 20 sekund, deklaracije orodij pa lahko nastavijo timeout na najvišji ravni.

Izvorni IP-naslovi

Odhodni webhooki izvirajo iz obsega IP-naslovov v oblaku ThunderPhone. Če vaš požarni zid zahteva seznam dovoljenih naslovov, se obrnite na podporo in posredovali vam bomo trenutne obsege.

Izbira med podedovanimi webhooki in webhooki na podlagi končnih točk

FunkcijaPodedovano (/v1/webhook)Končne točke (/v1/developer/webhook-endpoints)
Število URL-jev1 na organizacijoVeč na organizacijo
Pokritost dogodkovSamo telephony.* / web.*Vseh 10 vrst dogodkov
Filter dogodkov—Za posamezno končno točko
Ponovni poskusiBrez, razen enega za izmenjavo konfiguracije telefonskega klica8 poskusov v 24 h
Ovojnicatype + datatype + data + event_id
Menjava skrivnostiZamenja eno skrivnostSkrivnost za posamezno končno točko
Onemogočanje brez brisanjaPUT /v1/webhook z {"url": ""}status=disabled
Vidnost stanja—active / disabled / failing
Blokirajoča izmenjava konfiguracijeDa (telephony.incoming / web.incoming)Nikoli — samo obvestila
Najprimernejše zaDinamično konfiguracijo klicevPrejemanje dogodkov v produkciji

Nove integracije naj prejemajo dogodke prek webhookov na podlagi končnih točk. Podedovani URL obdržite (ali dodajte) le, če klice dinamično konfigurirate ob prevzemu ali uporabljate pošiljanje orodij v načinu webhook — te izmenjave zahtevkov in odgovorov se izvajajo samo na podedovani poti.


Povezano