ThunderPhone 2.0 jau čia.Viską atlikite savarankiškai – nuo 2 ct/min.Skaityti pranešimą

Webhooks

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:

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ų t nuo 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-Signature pasirašo tik neapdorotą turinį. Jis vis dar siunčiamas nepakitęs, kad esami tikrintuvai ir toliau veiktų.

Veiksmai

  1. Prieš bet kokį analizavimą nuskaitykite antraštę, metodą, neapdorotą kelią ir užklausą bei neapdorotą turinį.
  2. Naudodami savo slaptą raktą apskaičiuokite <t>\n<METHOD>\n<path and query>\n<body> šešioliktainę HMAC-SHA256 reikšmę.
  3. Atmeskite užklausą, jei t skiriasi daugiau nei 300 sekundžių arba jei rezultatas neatitinka v1 palyginant 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ė.

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);
  },
);

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ų

FunkcijaSenasis (/v1/webhook)Galutiniai taškai (/v1/developer/webhook-endpoints)
URL skaičius1 vienai organizacijaiDaug vienai organizacijai
Įvykių aprėptisTik telephony.* / web.*Visi 10 įvykių tipų
Įvykių filtras—Kiekvienam galutiniam taškui
Pakartotiniai bandymaiNėra, išskyrus vieną telefono skambučio konfigūracijos apsikeitimui8 bandymai per 24 val.
Vokastype + datatype + data + event_id
Slaptojo rakto keitimasPakeičia vienintelį slaptąjį raktąSlaptasis raktas kiekvienam galutiniam taškui
Išjungimas nešalinantPUT /v1/webhook su {"url": ""}status=disabled
Būsenos matomumas—active / disabled / failing
Blokuojantis konfigūracijos apsikeitimasTaip (telephony.incoming / web.incoming)Niekada — tik pranešimai
Geriausiai tinkaDinaminei 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ę