Tính Năng Nâng Cao
Webhooks
Nhận callback HTTP thời gian thực cho các sự kiện chính: ngưỡng chi tiêu, thay đổi trạng thái khóa API, cảnh báo giới hạn tốc độ và sự cố hệ thống.
Sự Kiện Khả Dụng
| Sự Kiện | Kích Hoạt | Hành Động Khuyến Nghị |
|---|---|---|
spending.alert | Chi tiêu hàng tháng đạt 50%, 80%, 90%, 100% ngân sách | Thông báo cho bộ phận tài chính; ở mức 100%, khóa bị tự động vô hiệu hóa |
key.disabled | Khóa API bị vô hiệu hóa (chạm trần ngân sách, thủ công hoặc bị xâm phạm) | Cảnh báo trực ban; chuyển sang khóa dự phòng |
rate_limit.warning | Mức sử dụng đạt 80% giới hạn RPM hoặc TPM | Điều tiết client; yêu cầu tăng giới hạn |
system.incident | Sự cố suy giảm hoặc gián đoạn dịch vụ được phát hiện | Kích hoạt chuyển đổi dự phòng thủ công nếu cần |
Thiết Lập
- Đăng nhập vào Bảng điều khiển tại api.tokspan.com/dashboard
- Điều hướng đến Cài đặt → Webhooks
- Nhấp Thêm Endpoint và nhập URL HTTPS của bạn
- Chọn những sự kiện để đăng ký
- Sao chép khóa bí mật ký (bắt đầu bằng
whsec_) — bạn sẽ cần khóa này để xác minh payload
Luôn xác minh chữ ký. Bất kỳ ai cũng có thể gửi yêu cầu HTTP đến endpoint webhook của bạn. Header
X-TokSpan-Signature chứa chữ ký HMAC-SHA256 của payload sử dụng khóa bí mật của bạn. Luôn xác thực trước khi xử lý.Xác Minh Chữ Ký
Mỗi lần gửi webhook bao gồm header X-TokSpan-Signature với digest hex HMAC-SHA256 của nội dung yêu cầu thô:
python
import hmac
import hashlib
import json
def verify_webhook_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
# In your webhook endpoint handler:
def handle_webhook(request):
signature = request.headers.get("X-TokSpan-Signature", "")
if not verify_webhook_signature(request.body, signature, "whsec_your_secret"):
return 401, "Invalid signature"
event = json.loads(request.body)
print(f"Received event: {event['type']}")
return 200, "OK"Định Dạng Payload
Tất cả payload webhook đều tuân theo cấu trúc này:
json — Example: spending.alert
{
"type": "spending.alert",
"created": 1700000000,
"data": {
"api_key_id": "key_abc123",
"api_key_name": "production-backend",
"threshold_pct": 80,
"monthly_budget": 500.00,
"current_spend": 400.00,
"currency": "USD"
}
}Gửi & Thử Lại
- Thời gian chờ: Endpoint của bạn phải phản hồi trong vòng 10 giây với mã trạng thái 2xx
- Thử lại: Các lần gửi thất bại được thử lại với exponential backoff: 5s → 30s → 5phút → 30phút → 1h. Sau 5 lần thất bại, lần gửi bị hủy
- Thứ tự: Sự kiện có thể đến không theo thứ tự. Hãy dùng timestamp
created, không dùng thứ tự đến - Idempotency: Cùng một sự kiện có thể được gửi nhiều lần. Dùng
idđể loại bỏ trùng lặp