Intégration des Webhooks avec TSplus Remote Support
Aperçu
Webhooks vous permettent de connecter TSplus Remote Support à vos propres systèmes (billetterie, CRM, SIEM, outils internes). Lorsqu'un événement se produit dans votre abonnement, Remote Support envoie un HTTP
POST
demande — contenant une charge utile JSON décrivant l'événement — à une URL que vous contrôlez.
Chaque demande est signé de manière cryptographique afin que votre serveur puisse vérifier qu'il provient réellement de Remote Support et n'a pas été altéré.
Cas d'utilisation typiques :
- Créer ou mettre à jour automatiquement un ticket lorsque la session de support se termine.
- Archivez les transcriptions de session de chat dans votre propre stockage.
- Déclencher des notifications internes ou des flux de travail d'automatisation.
Prérequis
Pour configurer les webhooks, assurez-vous d'avoir :
- Un abonnement administrateur compte.
-
Un accès public
HTTPS
point de terminaison capable de recevoir
POSTdemandes. - La capacité de lire les en-têtes de requête HTTP et le corps brut de la requête sur votre serveur (nécessaire pour vérifier la signature).
Configurer un webhook
-
Ouvrir le TSplus Remote Support console d'administration.
-
Dans le menu de gauche, développez Intégration et cliquez Webhooks .
-
Cliquez Ajouter un webhook .
-
Remplissez le formulaire :
- URL — le point de terminaison HTTPS qui recevra les événements.
- Description optionnel — une étiquette pour vous aider à identifier ce point de terminaison.
- Événements — sélectionnez au moins un type d'événement auquel vous abonner.
-
Cliquez Sauvegarder .
-
A secret est généré et affiché une fois Copiez-le maintenant et conservez-le en toute sécurité — il est utilisé pour vérifier la signature des demandes entrantes et ne sera plus affiché.
Sécurité : Pour votre protection, l'URL est validée lorsque vous l'enregistrez. Les points de terminaison pointant vers
localhostou les adresses IP privées/internes sont rejetées.
Gérer vos webhooks
Depuis la liste des Webhooks, vous pouvez :
- Envoyer un événement de test (icone de flacon) — met en file d'attente une livraison d'échantillon afin que vous puissiez confirmer que votre point de terminaison reçoit et accepte les demandes.
- Modifier (icône de crayon) — changez l'URL, la description, les événements abonnés ou activez/désactivez le point de terminaison.
- Supprimer (icone de poubelle) — supprimer définitivement le point de terminaison.
Chaque point de terminaison affiche un statut :
- Actif — le point de terminaison est activé et reçoit des événements.
- Désactivé — le point de terminaison a été désactivé manuellement.
- Auto-désactivé — Le support à distance a automatiquement désactivé le point de terminaison après 10 livraisons consécutives échouées Corrigez le point de terminaison et réactivez-le depuis le formulaire de modification.
Pour inspecter les tentatives de livraison individuelles, filtrer les événements passés ou réessayer une livraison échouée, voir Suivi de livraison par Webhook .
Format de charge utile
Chaque événement est livré sous forme de
POST
demande avec un corps JSON et les en-têtes suivants :
| En-tête | Description |
|---|---|
Type de contenu
|
application/json
|
X-Webhook-Signature
|
signature HMAC-SHA256 du corps brut, préfixée par
sha256=
|
X-Webhook-Id
|
Identifiant d'événement unique (utilisez-le pour l'idempotence de votre côté) |
X-Webhook-Timestamp
|
Horodatage ISO 8601 de la livraison |
Agent utilisateur
|
RemoteSupport-Webhook/1.0
|
Tous les événements partagent une enveloppe commune. Seul le contenu de
données
changements en fonction du type d'événement :
{ "id": "evt_abc123def456", "type": "session.ended", "created_at": "2026-07-10T15:00:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { }}
session.démarrée
Envoyé lorsqu'une nouvelle session de support est créée (le premier agent se connecte à un ordinateur).
{ "id": "evt_abc123def456", "type": "session.started", "created_at": "2026-07-10T14:30:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "started_at": "2026-07-10T14:30:00Z" }}
session.terminée
Envoyé lorsque la session de support se termine (tous les participants sont déconnectés). La charge utile comprend la transcription complète du chat collectée pendant la session.
{ "id": "evt_xyz789ghi012", "type": "session.ended", "created_at": "2026-07-10T15:00:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "started_at": "2026-07-10T14:30:00Z", "ended_at": "2026-07-10T15:00:00Z", "duration_seconds": 1800, "is_abnormal_closure": false, "chat_transcript": [ { "timestamp": "2026-07-10T14:31:00Z", "sender": "agent", "message": "Hello, how can I help you?" }, { "timestamp": "2026-07-10T14:31:30Z", "sender": "client", "message": "My screen is black" } ] }}
est_fermeture_anormaleestvraiuniquement lorsqu'une session est fermée par la plateforme après un redémarrage inattendu du relais. Dans ce cas, letranscription_de_chatest vide.
participant.a_rejoint
Envoyé lorsqu'un agent rejoint une session.
{ "id": "evt_join789abc", "type": "participant.joined", "created_at": "2026-07-10T14:32:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "user_name": "Jane Doe", "joined_at": "2026-07-10T14:32:00Z" }}
participant.gauche
Envoyé lorsqu'un agent quitte une session.
durée_en_secondes
c'est la durée pendant laquelle cet agent était connecté.
{ "id": "evt_left456def", "type": "participant.left", "created_at": "2026-07-10T14:37:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "user_name": "Jane Doe", "duration_seconds": 300, "left_at": "2026-07-10T14:37:00Z" }}
non surveillé.connecté
Envoyé lorsqu'une session est établie via un accès non surveillé (un agent se connectant avec un mot de passe à un ordinateur déjà en ligne, par opposition à un utilisateur en direct partageant manuellement son écran). Cela se déclenche exactement comme
session.démarrée
, mais uniquement pour les sessions d'accès sans surveillance.
nom d'utilisateur
identifie l'agent se connectant.
{ "id": "evt_unatt123on", "type": "unattended.connected", "created_at": "2026-07-10T14:30:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "user_name": "Jane Doe", "connected_at": "2026-07-10T14:30:00Z" }}
non assisté.déconnecté
Envoyé lorsqu'une session d'accès non surveillé se termine (tous les participants déconnectés). Cela se déclenche exactement comme
session.terminée
, mais uniquement pour les sessions d'accès sans surveillance ; aucun participant unique n'est attribué puisque la session dans son ensemble se termine.
durée_en_secondes
c'est la durée de la session.
{ "id": "evt_unatt456off", "type": "unattended.disconnected", "created_at": "2026-07-10T15:30:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "computer_name": "Front-desk PC", "duration_seconds": 3600, "disconnected_at": "2026-07-10T15:30:00Z" }}
fichier.transféré
Envoyé lorsqu'un fichier est transféré pendant une session. Seulement
métadonnées
est envoyé — le contenu du fichier n'est jamais stocké ni transmis.
direction
est
télécharger
(agent vers machine distante) ou
télécharger
(machine distante à l'agent).
nom d'utilisateur
identifie l'agent, et peut être vide lorsqu'un téléchargement ne peut pas être attribué à un seul agent.
{ "id": "evt_file456abc", "type": "file.transferred", "created_at": "2026-07-10T14:45:00Z", "subscription_key": "XXXX-XXXX-XXXX", "data": { "remote_support_id": "ABC123", "user_name": "Jane Doe", "file_name": "diagnostic.zip", "file_size_bytes": 2048576, "direction": "download", "timestamp": "2026-07-10T14:45:00Z" }}
Vérification de la signature
Votre point de terminaison doit toujours vérifier la signature avant de faire confiance à une demande. Quiconque connaît votre URL pourrait sinon envoyer de faux événements ; sans le secret, ils ne peuvent pas produire une signature valide.
Pour vérifier une demande :
- Lisez le corps de demande brut les octets exacts reçus — ne pas re-sérialiser le JSON).
-
Calculer
HMAC-SHA256(rawBody, votreSecret)et l'encoder en hexadécimal. -
Préfixez-le avec
sha256=et le comparer à leX-Webhook-Signatureen-tête utilisant une comparaison en temps constant.
Node.js
const crypto = require('crypto');
function verifyWebhook(rawBody, signatureHeader, secret) { const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(rawBody, 'utf8') .digest('hex');
const a = Buffer.from(expected); const b = Buffer.from(signatureHeader || ''); return a.length === b.length && crypto.timingSafeEqual(a, b);}
Python
import hmacimport hashlib
def verify_webhook(raw_body: bytes, signature_header: str, secret: str) -> bool: expected = "sha256=" + hmac.new( secret.encode("utf-8"), raw_body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature_header or "")
Livraison et réessais
- Votre point de terminaison devrait répondre avec un 2xx code d'état aussi rapidement que possible. La demande expire après 10 secondes .
- Si une livraison échoue, le support à distance réessaie avec un calendrier de retour exponentiel : 10s, 30s, 1min, 5min, 15min, 1h, 4h, 24h (jusqu'à 8 tentatives sur 24 heures).
-
Les tentatives se produisent en cas d'erreurs de connexion, HTTP
429et5xxréponses. Autre4xxles réponses sont considérées comme des échecs permanents et sont non réessayé. - Après 10 livraisons échouées consécutives , le point de terminaison est automatiquement désactivé .
Pour éviter de traiter le même événement deux fois (par exemple après une nouvelle tentative), utilisez le
X-Webhook-Id
en-tête (ou le
id
champ dans la charge utile) comme clé d'idempotence.
Événements disponibles
| Événement | Description |
|---|---|
session.démarrée
|
Une nouvelle session de support a été créée (le premier agent se connecte). |
session.terminée
|
Une session de support est terminée. Comprend la durée et la transcription complète du chat. |
participant.a_rejoint
|
Un agent a rejoint une session. |
participant.gauche
|
Un agent a quitté une session. Comprend combien de temps ils étaient connectés. |
non surveillé.connecté
|
Un ordinateur sans surveillance est devenu en ligne. |
non assisté.déconnecté
|
Un ordinateur non surveillé est hors ligne. Comprend combien de temps il est resté connecté. |
fichier.transféré
|
Un fichier a été transféré pendant une session (métadonnées uniquement : nom, taille, direction). |