Вебхук қолтаңбалары
Кез келген адам сіздің HTTPS мекенжайыңызға сұрау жібере алады. Жеткізуге сенбес бұрын қолтаңбаны тексеріңіз.
Не келеді
Әр жеткізу {"event", "occurred_at", "data"} JSON денесі бар және үш тақырыбы бар POST болады:
| Тақырып | Мағынасы |
|---|---|
X-Tanba-Delivery | Жеткізу идентификаторы. Әр қайталауда бірдей |
X-Tanba-Event | Оқиға атауы, мысалы approval.issued |
X-Tanba-Signature | t=<unix секунд>,v1=<hex HMAC-SHA256> |
Оқиғалар вебхуктер бетінде тізілген.
Құпия
Ұйым әкімшісі консольде вебхук жасағанда, платформа оның құпиясын бір рет көрсетеді. Ол whsec_ деп басталады. Бүкіл жолды кілт ретінде пайдаланыңыз. Оны тек өз серверіңізде сақтаңыз.
Қалай тексеру керек
- JSON талдамас бұрын шикі дене байттарын оқыңыз.
- Тақырыпты
tжәнеv1деп бөліңіз. tсағатыңыздан 5 минуттан артық өзгешеленсе, жеткізуді қабылдамаңыз.- Құпиямен кілттелген
t, нүкте және шикі дене үшін HMAC-SHA256 есептеңіз. Оны hex түрінде жазыңыз. - Оны
v1мәнімен тұрақты уақытта салыстырыңыз.
Python:
import hmac, hashlib, time
def verify(secret: str, header: str, body: bytes, tolerance=300) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
t, sig = parts["t"], parts["v1"]
if abs(time.time() - int(t)) > tolerance:
return False
mac = hmac.new(secret.encode(), t.encode() + b"." + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(mac, sig)
Go:
func verify(secret string, header string, body []byte, now time.Time) bool {
var t, sig string
for _, part := range strings.Split(header, ",") {
k, v, _ := strings.Cut(part, "=")
switch k {
case "t":
t = v
case "v1":
sig = v
}
}
secs, err := strconv.ParseInt(t, 10, 64)
if err != nil || now.Sub(time.Unix(secs, 0)).Abs() > 5*time.Minute {
return false
}
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(t + "."))
mac.Write(body)
want, err := hex.DecodeString(sig)
return err == nil && hmac.Equal(mac.Sum(nil), want)
}
Қайталаулар және қайталама жеткізулер
Кез келген 2xx статусымен 10 секунд ішінде жауап беріңіз. Басқасы қайталанады: бірінші қайталау 1 минуттан кейін, содан кейін күту уақыты 6 сағатқа дейін екі есе өседі, барлығы көбі 12 әрекет. Одан кейін жеткізу failed деп белгіленеді.
Жеткізу бірнеше рет келуі мүмкін. X-Tanba-Delivery мәнін сақтап, өңдеп қойған жеткізуді өткізіп жіберіңіз. Ауыр жұмысты жауап бергеннен кейін жасаңыз.
Қабылданбайтын мекенжайлар
Loopback, жеке, link-local және басқа ішкі мекенжайлар қабылданбайды: вебхук жасалғанда да, әр жеткізу кезінде де, өйткені атау жіберу сәтінде шешіледі.