Passer au contenu

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 POST demandes.
  • 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

  1. Ouvrir le TSplus Remote Support console d'administration.

  2. Dans le menu de gauche, développez Intégration et cliquez Webhooks .

    Admin console: Integration menu with the Webhooks entry

  3. Cliquez Ajouter un webhook .

    Webhooks list with the Add a webhook button

  4. 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.
  5. Cliquez Sauvegarder .

    Add a webhook form

  6. 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é.

    Webhook secret shown once after creation

Sécurité : Pour votre protection, l'URL est validée lorsque vous l'enregistrez. Les points de terminaison pointant vers localhost ou 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_anormale est vrai uniquement lorsqu'une session est fermée par la plateforme après un redémarrage inattendu du relais. Dans ce cas, le transcription_de_chat est 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 :

  1. Lisez le corps de demande brut les octets exacts reçus — ne pas re-sérialiser le JSON).
  2. Calculer HMAC-SHA256(rawBody, votreSecret) et l'encoder en hexadécimal.
  3. Préfixez-le avec sha256= et le comparer à le X-Webhook-Signature en-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 hmac
import 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 429 et 5xx réponses. Autre 4xx les 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).