Open in
Webhook
ThunderPhone
ThunderPhone, bir çağrı sırasında gerçekleşen olaylarda — gelen çağrının başlaması, çağrının bitmesi, bir değerlendirme çalışmasının tamamlanması, bir uyarının tetiklenmesi vb. — sunucunuza HTTP POST istekleri gönderir. İki teslim modeli vardır:
Birden çok URL, uç nokta başına gizli anahtarlar, uç nokta başına olay filtreleri
ve otomatik yeniden denemeler.
GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints üzerinden yönetin.
Kuruluş başına bir URL. Bloklayıcı yapılandırma alışverişleri
dahil olmak üzere çağrı yaşam döngüsü olaylarını taşır. GET/PUT /v1/webhook üzerinden yönetilir.
Olay kataloğunda listelenen tüm olay türleri webhook uç noktaları üzerinden
teslim edilir. Altı çağrı yaşam döngüsü olayı
(telephony.incoming, telephony.complete, telephony.tool,
web.incoming, web.complete, web.tool) ayrıca eski tek URL'li
webhook'a da gönderilir — hem eski bir URL'niz hem de eşleşen bir uç noktanız varsa,
olayı her iki yolda da alırsınız. Bloklayıcı davranış (
telephony.incoming / web.incoming yapılandırma
alışverişi ve webhook modu
araç yönlendirmesi) yalnızca eski yolda
bulunur; her uç nokta teslimi, yanıt beklemeden gönderilen bir bildirimdir.
Yük biçimi
Uç nokta teslimleri data, event_id ve type içeren bir JSON nesnesidir:
{
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
},
"event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
"type": "telephony.incoming"
}event_id, yayımlanan her olay için benzersizdir. Yeniden denemelerde
ve olayı alan her uç noktada aynıdır — tekilleştirme için bunu kullanın.
Eski tek URL'li webhook aynı type ve data değerlerini ancak
event_id olmadan gönderir:
{
"type": "telephony.incoming",
"data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}Aktarım sırasında her gövde kanonik olarak serileştirilir — anahtarlar alfabetik olarak sıralanır, boşluk kullanılmaz, UTF-8 kullanılır. Bu belgelerdeki okunabilir biçimlendirilmiş örnekler yalnızca okunabilirlik içindir.
Olay türleri ve yük alanlarının tam listesi için Olaylar kataloğuna bakın.
İmza doğrulama
Her istek, ikisi de uç noktanın secret anahtarıyla (veya eski teslimatlar için kuruluş düzeyindeki webhook secret anahtarınızla) HMAC-SHA256 kullanılarak oluşturulmuş iki imza taşır:
X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex>, zaman damgasını, yöntemi, yolu ve sorguyu ve ham gövdeyi imzalar. Bunu doğrulayın ve yakalanmış bir isteğin daha sonra yeniden oynatılmasını önlemek içintdeğeri saatinizden 5 dakikadan fazla farklı olan istekleri reddedin. Yeniden denemeler gönderildiklerinde yeniden imzalanır.X-ThunderPhone-Signatureyalnızca ham gövdeyi imzalar. Mevcut doğrulayıcıların çalışmaya devam etmesi için değişmeden gönderilmeye devam eder.
Adımlar
- Ayrıştırmadan önce üst bilgiyi, yöntemi, ham yolu ve sorguyu ve ham gövdeyi okuyun.
- Sırrınızı kullanarak
<t>\n<METHOD>\n<path and query>\n<body>öğesinin onaltılık HMAC-SHA256 değerini hesaplayın. t300 saniyeden fazla sapmışsa veya sonuç sabit zamanlı bir karşılaştırmadav1ile eşleşmiyorsa isteği reddedin.
Gövde, kanonik JSON serileştirmesidir (anahtarlar sıralı, ayırıcılar sıkıştırılmıştır) ve ilettiğimiz baytları tam olarak imzalarız. Doğrulama kılavuzu, imzalanan tam dizeyi, uygulamalı bir örneği, SDK olmadan kodu ve eski üst bilgiyi içerir.
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);
},
);Teslim semantiği
Bu anlamlar uç nokta teslimatları için geçerlidir. Eski tek URL'li
webhook, telefon görüşmesi telephony.incoming
yapılandırma alışverişi hariç, yeniden denemesi olmayan tek bir eşzamanlı denemedir;
bu alışveriş bir kez yeniden denenir.
Yeniden denemeler
Her olay hemen bir kez denenir. Herhangi bir 2xx yanıtı
teslimatı onaylar. Diğer tüm sonuçlarda (2xx dışı,
bağlantı hatası, zaman aşımı), ilk denemeden 1 dk., 5 dk., 30 dk., 2 sa.,
6 sa., 12 sa. ve 24 sa. sonra yeniden deneriz — 24 saate yayılan
8 deneme. Her deneme başarısız olursa teslimat durur ve uç nokta,
webhook uç noktaları bölümünde status="failing" olarak
işaretlenir; kuruluşunuzun sahiplerine ve yöneticilerine e-posta gönderir,
ayrıca bunu kontrol panelinde gösteririz. Yük kalıcı olarak kabul edilir edilmez
2xx döndürün; eşzamansız olarak işleyin.
Uç nokta test API'sinden yapılan test gönderimleri, ilk denemeden yaklaşık bir
dakika sonra bir kez yeniden denenir ve uç noktanın durumunu asla değiştirmez.
Sıralama
Teslimat sıralaması en iyi çaba esasına dayanır. Uygulamada olayları
yayımlandıkları sırayla teslim ederiz, ancak yeniden denemeler başarısızlık
durumunda sıralamayı değiştirebilir.
Her zaman call_id / nesne kimliğine göre yinelenenleri ayıklayın ve uzlaştırın.
Yinelenenler
Teslimat en az bir kez gerçekleşir: görmediğimiz bir yanıttan sonraki
yeniden deneme bir olayı yineleyebilir. Her yeniden deneme aynı
event_id değerini taşır; bu nedenle işlenen kimlikleri depolayın ve
tekrarları atlayın. event_id, uç noktalar arasında da paylaşılır —
aynı olaya abone olan iki uç nokta aynı event_id değerini alır.
Zaman aşımları
Uç nokta teslimatlarında deneme başına 30 sn. zaman aşımı vardır. Eski
yolda, canlı çağrı davranışını yönlendiren engelleyici istekler —
telephony.incoming / web.incoming
yapılandırma alışverişi — telefon görüşmesinin ilk denemesi için 10 sn.,
tek yeniden deneme dahil tüm alışveriş için 13 sn. ve bir bileşen
oturumu için 10 sn. ile sınırlıdır. Yavaş bir yanıt çağrının
cevaplanmasını geciktirir; bu nedenle birkaç saniye içinde yanıt vermeyi hedefleyin. Webhook modundaki araç gönderimi varsayılan olarak 20 sn.
tanır ve araç bildirimleri üst düzey bir timeout ayarlayabilir.
Kaynak IP'ler
Giden webhook'lar ThunderPhone'ın bulut IP aralığından kaynaklanır. Güvenlik duvarınız izin listesi gerektiriyorsa destek ekibiyle iletişime geçin; güncel aralıkları paylaşırız.
Eski ve uç nokta tabanlı webhook'lar arasında seçim yapma
| Özellik | Eski (/v1/webhook) | Uç noktalar (/v1/developer/webhook-endpoints) |
|---|---|---|
| URL sayısı | Kuruluş başına 1 | Kuruluş başına çok sayıda |
| Etkinlik kapsamı | Yalnızca telephony.* / web.* | 10 etkinlik türünün tamamı |
| Etkinlik filtresi | — | Uç nokta başına |
| Yeniden denemeler | Telefon araması yapılandırma alışverişi için bir deneme dışında yok | 24 saat içinde 8 deneme |
| Zarf | type + data | type + data + event_id |
| Gizli anahtar rotasyonu | Tek gizli anahtarı değiştirir | Uç nokta başına gizli anahtar |
| Silmeden devre dışı bırakma | {"url": ""} ile PUT /v1/webhook | status=disabled |
| Durum görünürlüğü | — | active / disabled / failing |
| Engelleyici yapılandırma alışverişi | Evet (telephony.incoming / web.incoming) | Asla — yalnızca bildirimler |
| En uygun kullanım | Dinamik arama yapılandırması | Üretimde etkinlik tüketimi |
Yeni entegrasyonlar, olayları uç nokta tabanlı webhook'lar aracılığıyla tüketmelidir. Yalnızca çağrıları yanıtlanma anında dinamik olarak yapılandırıyorsanız veya webhook modunda araç yönlendirme kullanıyorsanız eski bir URL'yi koruyun (veya ekleyin) — bu istek/yanıt alışverişleri yalnızca eski yolda çalışır.
İlgili
Tüm etkinlik türleri ve yükleri.
Birden fazla uç noktayı, etkinlik filtresini ve gizli anahtarı yönetin.
Aramaları yapılandırmak için sunucunuzun yanıtlaması gereken engelleyici istek.
Transkript, kayıt ve metrikleri içeren arama sonrası yük.