Muhtasari wa Webhook
ThunderPhone hutuma maombi ya HTTP POST kwenye seva yako mambo
yanapotokea wakati wa simu — simu inayoingia inaanza, simu inaisha, utekelezaji wa
ukadiriaji unakamilika, tahadhari inawashwa, na kadhalika. Kuna miundo miwili ya
uwasilishaji:
URL nyingi, siri kwa kila kituo, vichujio vya matukio kwa kila kituo,
na majaribio ya kiotomatiki.
Dhibiti kupitia GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints.
URL moja kwa kila shirika. Hubeba matukio ya mzunguko wa simu, ikijumuisha
ubadilishanaji wa usanidi wa kuzuia. Dhibitiwa kwenye GET/PUT /v1/webhook.
Aina zote kumi za matukio katika katalogi ya matukio
huwasilishwa kupitia vituo vya webhook. Matukio sita ya mzunguko wa simu
(telephony.incoming, telephony.complete, telephony.tool,
web.incoming, web.complete, web.tool) pia hutumwa kwenye
webhook ya urithi ya URL moja — ukiwa na URL ya urithi na kituo
kinacholingana, unapokea tukio kwenye njia zote mbili. Tabia ya kuzuia
(ubadilishanaji wa usanidi wa telephony.incoming / web.incoming
na utumaji wa zana katika hali ya webhook)
upo pekee kwenye njia ya urithi; kila uwasilishaji wa kituo ni arifa ya
kutuma-bila-kusubiri.
Muundo wa payload
Uwasilishaji wa kituo ni kitu cha JSON chenye data, event_id, na
type:
{
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
},
"event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
"type": "telephony.incoming"
}
event_id ni ya kipekee kwa kila tukio linalotolewa. Inabaki sawa katika majaribio
na katika kila kituo kinachopokea tukio — ondoa nakala kwa kuitumia.
Webhook ya urithi ya URL moja hutuma type na data zilezile lakini
bila event_id:
{
"type": "telephony.incoming",
"data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}
Kwenye mtandao, kila body huwekwa katika mpangilio wa kawaida — funguo hupangwa kialfabeti, bila nafasi nyeupe, UTF-8. Mifano yenye mpangilio wa kusomeka katika nyaraka hizi ni kwa urahisi wa kusoma pekee.
Tazama Katalogi ya matukio kwa orodha kamili ya aina za matukio na sehemu za payload.
Uthibitishaji wa sahihi
Kila ombi hubeba sahihi ya HMAC-SHA256 juu ya mwili ghafi wa ombi
katika kichwa cha X-ThunderPhone-Signature. Ufunguo wa kutia sahihi ni
secret ya endpoint (au secret ya webhook ya kiwango cha org yako kwa
utumaji wa urithi).
Hatua
- Soma mwili ghafi wa ombi kabla ya uchanganuzi wowote.
- Kokotoa
hmac_sha256(secret, body).hexdigest(). - Linganisha kwa muda usiobadilika na kichwa cha
X-ThunderPhone-Signature.
Tunatia sahihi bayti kamili tunazotuma, na bayti hizo ni usawazishaji wa kawaida wa JSON (funguo zilizopangwa, vitenganishi vya mkato). Kwa hiyo kuthibitisha dhidi ya mwili ghafi hufanya kazi daima — na ikiwa framework yako inakupa JSON iliyochanganuliwa pekee, kuisawazisha tena kwa funguo zilizopangwa na vitenganishi vya mkato hutoa bayti zilezile. Mbinu zote mbili zimeelezwa katika mwongozo wa uthibitishaji.
import hmac
import hashlib
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode("utf-8"),
body,
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, signature or "")
# Example Flask handler
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/thunderphone-webhook")
def handle():
body = request.get_data()
sig = request.headers.get("X-ThunderPhone-Signature", "")
if not verify_signature(body, sig, WEBHOOK_SECRET):
abort(401)
event = request.get_json()
# dispatch on event["type"] …
return "", 204
import crypto from "node:crypto";
import express from "express";
function verifySignature(body, signature, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
if (!signature || expected.length !== signature.length) return false;
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature),
);
}
const app = express();
app.post(
"/thunderphone-webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const sig = req.header("X-ThunderPhone-Signature") || "";
if (!verifySignature(req.body, sig, process.env.WEBHOOK_SECRET)) {
return res.sendStatus(401);
}
const event = JSON.parse(req.body.toString("utf8"));
// dispatch on event.type …
res.sendStatus(204);
},
);
Semantiki za uwasilishaji
Semantiki hizi zinatumika kwa uwasilishaji wa endpoint. Webhook ya urithi ya URL moja ni jaribio moja la usawazishaji lisilo na majaribio ya kurudia.
Majaribio ya kurudia
Kila tukio hujaribiwa mara moja mara moja. Jibu lolote la 2xx
hukubali uwasilishaji. Kwa matokeo mengine yoyote (yasiyo ya 2xx,
hitilafu ya muunganisho, muda kuisha) tunajaribu tena baada ya dakika 1, dakika 5, dakika 30, saa 2, saa 6,
saa 12, na saa 24 baada ya jaribio la kwanza — majaribio 8 ndani ya
saa 24. Ikiwa kila jaribio litashindwa, uwasilishaji husimama na endpoint
huwekwa alama ya status="failing" katika
endpoint za webhook. Rudisha 2xx punde tu
payload inapokubaliwa kwa uhakika; ichakate kwa usawazishaji usio wa moja kwa moja.
Mpangilio
Mpangilio wa uwasilishaji hutegemea juhudi bora. Kwa vitendo tunawasilisha kwa
mpangilio ambao matukio hutolewa, lakini majaribio ya kurudia yanaweza kubadilisha mpangilio yakishindwa.
Daima ondoa nakala na linganisha kwa call_id / kitambulisho cha kitu.
Nakala rudufu
Uwasilishaji ni wa angalau mara moja: jaribio la kurudia baada ya jibu ambalo hatukuwahi
kuliona linaweza kurudia tukio. Kila jaribio la kurudia hubeba
event_id ileile, kwa hivyo hifadhi vitambulisho vilivyochakatiwa na uruke vinavyojirudia. event_id pia
hushirikiwa kati ya endpoint — endpoint mbili zilizojiandikisha kwa
tukio lilelile hupokea event_id ileile.
Muda kuisha
Uwasilishaji wa endpoint una muda wa kuisha wa sekunde 30 kwa kila jaribio. Kwenye
njia ya urithi, maombi yanayozuia ambayo huendesha tabia ya simu ya moja kwa moja —
ubadilishanaji wa usanidi wa telephony.incoming / web.incoming —
muda wake huisha baada ya sekunde 10, lakini jibu la polepole huchelewesha kupokea simu, kwa hivyo
lenga kujibu ndani ya sekunde chache. Utumaji wa zana wa hali ya webhook huruhusu sekunde 20.
IP za chanzo
Webhook zinazotoka hutoka kwenye masafa ya IP ya wingu la ThunderPhone. Ikiwa firewall yako inahitaji orodha ya kuruhusu, wasiliana na usaidizi nasi tutashiriki masafa ya sasa.
Kuchagua kati ya webhook za urithi na webhook zinazotegemea endpoint
| Kipengele | Urithi (/v1/webhook) | Endpoint (/v1/developer/webhook-endpoints) |
|---|---|---|
| Idadi ya URL | 1 kwa kila shirika | Nyingi kwa kila shirika |
| Ufunikaji wa matukio | telephony.* / web.* pekee | Aina zote 10 za matukio |
| Kichujio cha tukio | — | Kwa kila endpoint |
| Majaribio ya kurudia | Hakuna | Majaribio 8 ndani ya saa 24 |
| Bahasha | type + data | type + data + event_id |
| Kubadilisha siri | Hubadilisha siri moja | Siri kwa kila endpoint |
| Kuzima bila kufuta | — | status=disabled |
| Uonekano wa hali | — | active / disabled / failing |
| Ubadilishanaji wa usanidi unaozuia | Ndiyo (telephony.incoming / web.incoming) | Kamwe — arifa pekee |
| Bora kwa | Usanidi wa simu unaobadilika | Utumiaji wa matukio katika uzalishaji |
Miunganisho mipya inapaswa kutumia matukio kupitia webhook zinazotegemea endpoint. Hifadhi (au ongeza) URL ya urithi tu ikiwa unasanidi simu kwa kubadilika wakati wa kupokea au unatumia utumaji wa zana wa hali ya webhook — ubadilishanaji huo wa ombi/jibu huendeshwa kwenye njia ya urithi pekee.
Yanayohusiana
Aina zote za matukio na payload zake.
Dhibiti endpoint nyingi, vichujio vya matukio, na siri.
Ombi linalozuia ambalo seva yako lazima ijibu ili kusanidi simu.
Payload baada ya simu yenye transkripti, rekodi, na vipimo.