TicketWave Logo
Webhooks

Επισκόπηση

Λάβετε συμβάντα TicketWave ως υπογεγραμμένα αιτήματα HTTP στη δική σας εφαρμογή.

Webhooks

Ένα webhook είναι ένα αίτημα HTTP που σας στέλνει το TicketWave. Κάθε φορά που συμβαίνει κάτι στον διακομιστή σας — ανοίγει ένα ticket, ένα μέλος μπαίνει στη μαύρη λίστα — το TicketWave κάνει POST ένα σώμα JSON σε ένα URL που ελέγχετε εσείς.

Αυτή είναι η διαφορά σε σχέση με τα Log Channels: τα log channels γράφουν ένα embed στο Discord για να το διαβάζουν άνθρωποι, ενώ τα webhooks παραδίδουν το ακατέργαστο συμβάν στον κώδικά σας.

Τα webhooks είναι λειτουργία premium. Χωρίς premium, δεν μπορούν να δημιουργηθούν endpoints και δεν παραδίδονται συμβάντα.

Δημιουργία Endpoint

Ανοίξτε τη σελίδα endpoints

Πίνακας ελέγχου διακομιστή → WebhooksEndpoints.

Προσθέστε ένα endpoint

Κάντε κλικ στο Add Endpoint και συμπληρώστε δύο πεδία:

FieldDescription
Endpoint URLΤο URL https:// που λαμβάνει τα αιτήματα
Event TypesΠοια συμβάντα πρέπει να λαμβάνει αυτό το endpoint

Ένα endpoint λαμβάνει μόνο τους τύπους που επιλέγετε. Δεν επιτρέπεται να μην επιλέξετε κανέναν — επιλέξτε τουλάχιστον έναν.

Αντιγράψτε το signing secret

Το TicketWave δημιουργεί ένα signing secret (whsec_…) τη στιγμή που δημιουργείται το endpoint. Ανοίξτε τη λίστα endpoints, αποκαλύψτε το με το εικονίδιο του ματιού και αντιγράψτε το στη ρύθμιση της εφαρμογής σας.

Αντιμετωπίστε το secret σαν κωδικό πρόσβασης. Όποιος το έχει μπορεί να πλαστογραφήσει αιτήματα που περνούν τον έλεγχο υπογραφής σας. Κρατήστε το σε μεταβλητή περιβάλλοντος, ποτέ στο αποθετήριό σας.

Στείλτε ένα δοκιμαστικό συμβάν

Χρησιμοποιήστε το κουμπί Send test event (το χάρτινο αεροπλανάκι) στη γραμμή του endpoint. Στέλνει ένα πραγματικό, πλήρως υπογεγραμμένο αίτημα με "test": true στο payload, ώστε να επιβεβαιώσετε ότι ο δέκτης σας λειτουργεί πριν εξαρτηθεί από αυτόν ένα πραγματικό ticket.

Το αποτέλεσμα εμφανίζεται στο ιστορικό Webhooks όπως κάθε άλλη παράδοση.

Απαιτήσεις Endpoint

RequirementDetail
SchemeΜόνο https:// — το http:// απορρίπτεται
HostΠρέπει να επιλύεται δημόσια. Ιδιωτικές, loopback, link-local και διευθύνσεις CGNAT απορρίπτονται
ResponseΟποιαδήποτε κατάσταση 2xx μετρά ως επιτυχία
TimeoutΈχετε 10 δευτερόλεπτα για να απαντήσετε
RedirectsΔεν ακολουθούνται. Ένα 3xx μετρά ως αποτυχία
LimitΈως 5 endpoints ανά διακομιστή

Ο έλεγχος του host γίνεται τόσο όταν αποθηκεύετε το endpoint όσο και πριν από κάθε μεμονωμένη παράδοση, οπότε ένας τομέας που αργότερα αρχίζει να επιλύεται σε εσωτερική διεύθυνση σταματά να δέχεται παραδόσεις.

Το Αίτημα

Κάθε παράδοση είναι ένα POST με σώμα JSON.

Headers

HeaderExampleMeaning
Content-Typeapplication/jsonΠάντα JSON
User-AgentTicketWave-Webhooks/1.0.5Η έκδοση του bot που το έστειλε
X-TicketWave-Eventticket.createdΟ τύπος συμβάντος
X-TicketWave-Deliverywh_3f2a…Μοναδικό id για αυτή την παράδοση
X-TicketWave-Timestamp1786224191Unix seconds, μέρος της υπογραφής
X-TicketWave-Signaturesha256=9f86d0…HMAC του αιτήματος

Body

Κάθε payload χρησιμοποιεί το ίδιο περίβλημα. Μόνο το data διαφέρει ανά τύπο συμβάντος:

{
  "event": "ticket.created",
  "timestamp": "2026-08-26T08:23:11.000Z",
  "guild_id": "123456789012345678",
  "data": {
    "ticket_id": "ticket-1042",
    "ticket_num_id": 1042,
    "channel_id": "998877665544332211",
    "category": "🤖 Support",
    "user": { "id": "987654321098765432", "username": "Luna" },
    "created_at": "2026-08-26T08:23:11.000Z"
  }
}

Δείτε το Event Reference για το αντικείμενο data κάθε τύπου.

Επαλήθευση της Υπογραφής

Όποιος ανακαλύψει το URL του endpoint σας μπορεί να του στείλει ένα αίτημα POST. Η υπογραφή είναι ο τρόπος με τον οποίο ξεχωρίζετε μια πραγματική παράδοση TicketWave από μια πλαστογραφημένη.

Να επαληθεύετε πάντα. Ένα μη επαληθευμένο endpoint που δημιουργεί ή κλείνει πράγματα στο σύστημά σας είναι ανοιχτή πόρτα.

Πώς δημιουργείται η υπογραφή

Το TicketWave ενώνει το timestamp και το ακατέργαστο σώμα του αιτήματος με μια τελεία και εκτελεί HMAC-SHA256 στο αποτέλεσμα χρησιμοποιώντας το secret του endpoint σας:

signed_payload = X-TicketWave-Timestamp + "." + raw_request_body
signature      = HMAC_SHA256(signed_payload, your_endpoint_secret)

Το header μεταφέρει αυτό το digest σε hex μορφή και με πρόθεμα: sha256=<digest>.

Τι πρέπει να κάνει ο δέκτης σας

Διαβάστε το ακατέργαστο body. Επαληθεύστε με βάση τα ακριβή bytes που λάβατε. Αν το framework σας κάνει πρώτα parse το JSON και μετά το ξανα-serialise, η σειρά των κλειδιών ή τα κενά μπορεί να αλλάξουν και το digest δεν θα ταιριάξει.

Υπολογίστε ξανά το HMAC πάνω στο timestamp + "." + rawBody με το secret σας.

Συγκρίνετε σε σταθερό χρόνο (crypto.timingSafeEqual στο Node). Ένα απλό === διαρρέει πληροφορίες χρονισμού.

Ελέγξτε ότι το timestamp είναι πρόσφατο — πέντε λεπτά ανοχής είναι μια καλή προεπιλογή. Το timestamp βρίσκεται μέσα στο υπογεγραμμένο payload, άρα ένας επιτιθέμενος δεν μπορεί να επαναλάβει ένα παλιό αίτημα με φρέσκο timestamp.

Μια πλήρης υλοποίηση υπάρχει στη σελίδα Example Server.

Επαναπροσπάθειες

Μια παράδοση που αποτυγχάνει επαναλαμβάνεται αυτόματα.

Attempts3 (η πρώτη προσπάθεια συν 2 επαναπροσπάθειες)
Backoff1 δευτερόλεπτο, μετά 5 δευτερόλεπτα
Retried onΣφάλματα δικτύου, timeouts, 408, 429 και οποιοδήποτε 5xx
Not retried onΚάθε άλλο 4xx — αυτά σημαίνουν ότι το endpoint σας απέρριψε το αίτημα επίτηδες

Λόγω των επαναπροσπαθειών, το endpoint σας μπορεί να λάβει το ίδιο συμβάν δύο φορές. Χρησιμοποιήστε το X-TicketWave-Delivery ως idempotency key: θυμηθείτε τα ids που έχετε επεξεργαστεί και αγνοήστε τις επαναλήψεις.

Οι παραδόσεις δεν είναι ταξινομημένες. Αν δημιουργηθούν δύο tickets την ίδια στιγμή, τα αιτήματα μπορούν να φτάσουν με οποιαδήποτε σειρά — χρησιμοποιήστε το πεδίο timestamp στο body αν η σειρά σας ενδιαφέρει.

Ιστορικό Παραδόσεων

Η σελίδα Webhooks στον πίνακα ελέγχου εμφανίζει κάθε παράδοση με την κατάστασή της, τον κωδικό απόκρισης, τη διάρκεια και τον αριθμό προσπαθειών. Ανοίξτε μια γραμμή για να δείτε το ακριβές payload του αιτήματος που στάλθηκε και την απόκριση που επέστρεψε ο διακομιστής σας.

Οι αποτυχημένες παραδόσεις μπορούν να σταλούν ξανά από τη σελίδα λεπτομερειών με το Retry Webhook. Στέλνει ξανά το αρχικό payload στο ίδιο endpoint και καταγράφει μια νέα παράδοση.

Το ιστορικό διατηρείται για 30 ημέρες, και μετά καθαρίζεται αυτόματα.

Αντιμετώπιση Προβλημάτων

ProblemFix
Το endpoint δεν μπορεί να αποθηκευτείΤο URL πρέπει να είναι https:// και να επιλύεται σε δημόσια διεύθυνση
Όλα εμφανίζονται ως αποτυχημένα χωρίς κωδικό απόκρισηςΤο αίτημα δεν έφτασε ποτέ σε εσάς — timeout, αποτυχία DNS ή connection refused
Η υπογραφή δεν ταιριάζει ποτέΚάνετε hash στο parsed body αντί για τα ακατέργαστα bytes ή ξεχάσατε το πρόθεμα timestamp + "."
Οι παραδόσεις σταματούν μετά από λίγοΕλέγξτε αν ο host σας άρχισε να επιστρέφει 4xx — αυτά δεν επαναλαμβάνονται
Ένα συμβάν δεν φτάνει ποτέΤο endpoint δεν είναι εγγεγραμμένο σε αυτόν τον τύπο ή ο διακομιστής έχασε το premium
Διπλά συμβάνταΑναμενόμενο στις επαναπροσπάθειες — κάντε deduplicate με βάση το X-TicketWave-Delivery

Επόμενα Βήματα

  • Event Reference (Κάθε συμβάν και το payload του)
  • Example Server (Ένας εκτελέσιμος Express δέκτης)
  • Log Channels (Τα ίδια συμβάντα, αλλά δημοσιευμένα στο Discord)

How is this guide?