Otrzymuj powiadomienia w czasie rzeczywistym, gdy wydarzenia mają miejsce w Twojej organizacji. Webhooki pozwalają na budowanie reaktywnych integracji, które natychmiast reagują na skanowanie kodów QR i inne wydarzenia.
Bądź natychmiast powiadamiany, gdy wydarzenia mają miejsce, bez potrzeby odpytywania
Podpisy HMAC weryfikują, że webhooki pochodzą z iloveQR
Automatyczne ponowne próby z wykładniczym opóźnieniem dla nieudanych dostaw
Skonfiguruj webhooki za pośrednictwem pulpitu nawigacyjnego lub API, aby zacząć otrzymywać wydarzenia.
Skonfiguruj punkt końcowy HTTPS na swoim serwerze, aby odbierać ładunki webhooków.
Dodaj swój adres URL punktu końcowego i wybierz, do jakich wydarzeń chcesz się subskrybować.
Wdróż weryfikację podpisów, aby upewnić się, że ładunki są autentyczne.
curl -X POST \
"https://api.iloveqr.com/api/v1/organizations/org_abc123/webhooks" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhooks/iloveqr",
"events": ["qr.scanned", "qr.created", "qr.updated"],
"secret": "your_webhook_secret"
}'Subskrybuj wydarzenia, których potrzebujesz. Każdy typ wydarzenia ma określoną strukturę ładunku.
qr.createdUtworzono nowy kod QRqr.updatedKod QR został zaktualizowanyqr.deletedKod QR został usuniętyqr.scannedKod QR został zeskanowanyqr.archivedKod QR został zarchiwizowanyqr.restoredKod QR został przywrócony z archiwumsubscription.createdUtworzono nową subskrypcjęsubscription.updatedSubskrypcja została zaktualizowanasubscription.cancelledSubskrypcja została anulowanasubscription.payment_succeededPłatność została zrealizowanasubscription.payment_failedPłatność nie powiodła sięmember.joinedCzłonek dołączył do organizacjimember.leftCzłonek opuścił organizacjęmember.role_changedRola członka została zmienionaWszystkie ładunki webhooków mają spójną strukturę z metadanymi wydarzenia i danymi.
{
"id": "evt_1a2b3c4d5e6f",
"event": "qr.scanned",
"createdAt": "2024-01-15T14:30:00Z",
"organizationId": "org_abc123",
"data": {
"qrCodeId": "qr_xyz789",
"qrCodeName": "Product Landing Page",
"shortCode": "xyz789",
"destinationUrl": "https://example.com/product",
"scan": {
"id": "scan_123abc",
"timestamp": "2024-01-15T14:30:00Z",
"location": {
"country": "US",
"city": "New York",
"latitude": 40.7128,
"longitude": -74.0060
},
"device": {
"type": "mobile",
"os": "iOS",
"browser": "Safari"
},
"isUnique": true
}
}
}{
"id": "evt_7g8h9i0j1k2l",
"event": "qr.created",
"createdAt": "2024-01-15T10:00:00Z",
"organizationId": "org_abc123",
"data": {
"qrCode": {
"id": "qr_newcode",
"type": "URL",
"name": "New Campaign QR",
"shortUrl": "https://ilqr.co/newcode",
"destinationUrl": "https://example.com/campaign",
"createdBy": "user_abc123"
}
}
}Zawsze weryfikuj podpisy webhooków, aby upewnić się, że ładunek pochodzi z iloveQR i nie został zmieniony w trakcie przesyłania.
Każde żądanie webhooka zawiera nagłówek X-Webhook-Signature zawierający podpis HMAC-SHA256 ciała żądania.
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}
// In your webhook handler
app.post('/webhooks/iloveqr', (req, res) => {
const signature = req.headers['x-webhook-signature'];
const payload = JSON.stringify(req.body);
if (!verifyWebhookSignature(payload, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Process the webhook
const event = req.body;
console.log('Received event:', event.event);
res.status(200).send('OK');
});import hmac
import hashlib
def verify_webhook_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
# In your Flask handler
@app.route('/webhooks/iloveqr', methods=['POST'])
def handle_webhook():
signature = request.headers.get('X-Webhook-Signature')
payload = request.get_data()
if not verify_webhook_signature(payload, signature, WEBHOOK_SECRET):
return 'Invalid signature', 401
event = request.get_json()
print(f"Received event: {event['event']}")
return 'OK', 200Zwróć odpowiedź 2xx w ciągu 5 sekund. Przetwarzaj webhooki asynchronicznie, jeśli Twoje przetwarzanie zajmuje więcej czasu.
Przechowuj identyfikator zdarzenia i sprawdzaj duplikaty. Webhooki mogą być dostarczane więcej niż raz w rzadkich przypadkach.
Zawsze używaj punktów końcowych HTTPS. Nie dostarczamy webhooków do adresów URL HTTP.
Skonfiguruj monitorowanie błędów dostarczania webhooków. Sprawdź logi webhooków w panelu do debugowania.
Jeśli Twój punkt końcowy zwraca błąd lub nie odpowiada, automatycznie ponawiamy dostarczanie z wykładniczym opóźnieniem:
| Próba | Opóźnienie |
|---|---|
| 1. ponowienie | 1 minuta |
| 2. ponowienie | 5 minut |
| 3. ponowienie | 30 minut |
| 4. ponowienie | 2 godziny |
| 5. ponowienie (ostateczne) | 24 godziny |
Uwaga: Po 5 nieudanych próbach, webhook jest oznaczany jako nieudany i przestajemy ponawiać. Otrzymasz powiadomienie e-mail o niepowodzeniu.
Gotowy do rozpoczęcia? Zbadaj więcej zasobów: