TAŇBA-OOH Әзірлеушілерге

Вебхук қолтаңбалары

Кез келген адам сіздің HTTPS мекенжайыңызға сұрау жібере алады. Жеткізуге сенбес бұрын қолтаңбаны тексеріңіз.

Не келеді

Әр жеткізу {"event", "occurred_at", "data"} JSON денесі бар және үш тақырыбы бар POST болады:

ТақырыпМағынасы
X-Tanba-DeliveryЖеткізу идентификаторы. Әр қайталауда бірдей
X-Tanba-EventОқиға атауы, мысалы approval.issued
X-Tanba-Signaturet=<unix секунд>,v1=<hex HMAC-SHA256>

Оқиғалар вебхуктер бетінде тізілген.

Құпия

Ұйым әкімшісі консольде вебхук жасағанда, платформа оның құпиясын бір рет көрсетеді. Ол whsec_ деп басталады. Бүкіл жолды кілт ретінде пайдаланыңыз. Оны тек өз серверіңізде сақтаңыз.

Қалай тексеру керек

  1. JSON талдамас бұрын шикі дене байттарын оқыңыз.
  2. Тақырыпты t және v1 деп бөліңіз.
  3. t сағатыңыздан 5 минуттан артық өзгешеленсе, жеткізуді қабылдамаңыз.
  4. Құпиямен кілттелген t, нүкте және шикі дене үшін HMAC-SHA256 есептеңіз. Оны hex түрінде жазыңыз.
  5. Оны 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 және басқа ішкі мекенжайлар қабылданбайды: вебхук жасалғанда да, әр жеткізу кезінде де, өйткені атау жіберу сәтінде шешіледі.