MAXIntégration des messages POST

Utiliser les messages POST pour l'intégration IFrame

Pour faciliter les intégrations avancées basées sur le bureau, le client d'agent MAX (My Agent eXperience) prend en charge l'abonnement aux événements via des pages Web intégrées personnalisées. MAX a la capacité d'intégrer des pages Web (IFrame) à l'aide de panneaux de contact (qui s'ouvrent et se ferment en même temps que leur contact associé) ou d'espaces de travail personnalisés (qui sont toujours ouverts et disponibles indépendamment des contacts individuels). Un cas d'utilisation courant pour les panneaux de contact serait l'ouverture d'une page Web CRM spécifique au client sous la forme d'une fenêtre contextuelle à un appel téléphonique (puis fermée lorsque l'appel est terminé). Un cas d'utilisation courant pour les espaces de travail personnalisés serait une page de base de connaissances ou un autre site qui ne sont pas directement associés à un contact ou à une interaction client.

Dans les deux cas (panneau de contact ou espace de travail personnalisé), la page Web «enfant» intégrée peut s'abonner aux événements système reçus par la fenêtre MAX «parent» via des messages POST. MAX reçoit régulièrement des informations de la plate-forme ACD avec des détails sur l'état de l'agent ou sur des contacts individuels. En vous abonnant à ces événements, la page Web IFramed peut implémenter une logique personnalisée qui répond au comportement dans MAX. Par exemple, lorsque l'agent change d'état de disponible à opérationnel et de travail à indisponible, la page Web intégrée personnalisée peut choisir de répondre en fonction de règles métier. Ou, lorsqu'un nouvel appel est reçu, la page Web peut être notifiée du nouvel appel et répondre en conséquence. Pour plus d'informations, consultez la documentation supplémentaire à l'adresse https://developer.niceincontact.com/API, https://developer.niceincontact.com/Documentation/AgentSessionEvents et https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage.

Variables d'objet de données

MAX est configuré pour recevoir un message de publication du client dans un objet de données contenant les valeurs suivantes. Toutes les clés de propriété sont sensibles à la casse. Lorsqu'elles sont spécifiées, les valeurs sont également sensibles à la casse.

  • contactCardData: Il s'agit de l'objet de données contenant le nom du client et l'image du contact téléphonique. Il a deux clés, nom et userImg. Il est sensible à la casse.
  • contactId: Ceci est un int facultatif. Si vous connaissez l'identifiant du contact, vous pouvez le fournir ici. Si vous n'avez pas l'ID de contact et qu'il est chargé dans un panneau de contacts, nous localiserons l'ID de contact du panneau associé. Les espaces de travail personnalisés généraux n'auront pas d'identifiant de contact pouvant être localisé de cette façon, ils devront donc être fournis si une entrée spécifique au contact est souhaitée.
  • émetteur: Ceci est une chaîne facultative. Il fonctionne comme un nom d'identifiant pour l'expéditeur, même s'il n'a pas besoin d'être unique. Cette chaîne facilite la journalisation pour ajouter du contexte aux journaux de la console. Lors des tests, vous constaterez peut-être que votre écouteur de message de publication récupère le message d'inscription que vous envoyez. Vous pouvez utiliser ce champ pour vérifier si le message vient de vous. MAX enverra les événements de réponse avec «MAX» comme émetteur.
  • type de message: Il s'agit d'une chaîne obligatoire. Il est sensible à la casse. Il y a deux entrées valides:
    Valeur d'entréeRésultat
    "RegisterForClientEvents"C'est ainsi que MAX sait que vous cherchez à configurer un abonnement à un événement client.
    "UnregisterFromClientEvents"Cela déconnectera votre référence de fenêtre de MAX et mettra fin à l'envoi de l'événement client. Si vous souhaitez modifier les types d'abonnement ou contactId, vous devrez l'appeler avant de vous réinscrire.

    Ne pas faire cela et utiliser la même fenêtre avec une nouvelle inscription dans contactPanel provoque des bugs.

    "ContactCardData"C'est ainsi que MAX sait qu'il reçoit le nom de client et l'image du contact téléphonique.
  • abonnementTypes: Ceci est un tableau obligatoire de chaînes. Il n'est pas sensible à la casse, car tout dans le tableau sera normalisé en minuscules. Les valeurs du tableau sont additives. Chaque option spécifie un type de message que vous recevrez. Il existe quelques entrées valides possibles:
    Valeur d'entréeRésultat
    "tout"Cela retournera tout.
    "agent"Cela renverra tout ce qui n'a pas d'identifiant de contact.
    "contact"Cela renverra des événements limités soit par l'ID de contact demandé, soit par l'ID de contact pour le panneau associé si l'IFrame est connecté à une compétence ou à un contact.
    "Contacts"Cela renverra tous les événements qui ont un ID de contact. Si vous êtes dans un panneau de contacts et souhaitez des informations supplémentaires sur le contact du panneau, ajoutez ce champ.
    "sessioninfo"Cela renverra le jeton de session d'un agent. Si vous souhaitez effectuer des appels d'API spécifiques à une session d'agent, inscrivez-vous à cet événement.

Utilisation d'un tableau vide pourabonnementTypes entraînera une erreur.

Lorsque MAX reçoit l'abonnement, avec le message d'accusé de réception, nous enverrons les états actuels des types d'abonnement demandés pour aider à configurer correctement l'espace de travail. Ces événements sont garantis au départ.

Valeur d'entrée États actuels
"tout" Retournera le AgentState actuel et tous les contacts actuels qui sont dans le cadre de MAX.
"agent" Retournera le courant AgentState. Cela n'inclut pas le jeton de session de l'agent.
"contact" Renvoie l'état actuel du contact si le contact existe dans le cadre de MAX.
"Contacts" Renvoie tous les contacts actuels qui existent dans le cadre de MAX.

Il est possible que l'inscription reçoive occasionnellement plus que la base de AgentState et contacts lors de l'initialisation. Ces événements peuvent inclure AgentLegEvent, AgentSessionStart et MchAgentSettingsChangeEvent. Vous verrez ces événements supplémentaires si votre demande d'abonnement arrive avant que nous ayons établi nos références locales à ces données. Si cela se produit, nous stockerons et passerons en revue tous les événements envoyés à MAX via l'événement get-next-event comme vous le feriez normalement pendant l'utilisation. La seule différence est que nous ne pouvons pas sélectionner les événements principaux sélectionnés pour une initialisation de base. Les mêmes filtres s'appliqueront aux données pour lesquelles vous êtes inscrit, donc aucun résultat anormal ne devrait en découler.

Commandes d'appel

Si MAX est dans un état valide pour accepter la commande donnée, il appellera cette action dans l'application. Ces commandes s'alignent étroitement avec les boutons principaux utilisés pour la gestion des contacts. Ils ne renvoient pas de messages.

Valeur d'entrée

Résultat

AnswerEvent et RefuseEvent A lieu lorsqu'il y a un appel entrant affichant la boîte de dialogue d'acceptation / de rejet.

HoldEvent, MuteEvent et MaskEvent

Traités comme des bascules. Par exemple, appelez Attente une fois et l'appel est mis en attente, appelez-le à nouveau et l'appel est rétabli.

RecordEvent Une action ponctuelle. Par exemple, une fois Record est appelé, il ne peut pas être arrêté.
HangupEvent L'appel est immédiatement interrompu sans boîte de dialogue de confirmation.

Exemple d'appel (seul messageType est nécessaire)

opener.postMessage ({messageType: 'MuteEvent'}, ''); *

Exemple d'implémentation

// Trouver la fenêtre parente (MAX) pour s'inscrire aux événements

var opener = window.opener || window.parent;

// Configurez vos abonnements

var subscriptionTypes = ['agent', 'contacts'];

 

// Commencez à écouter les messages de réponse

var doSomething = function (événements) {

espacervar événement = null;

espacer var eventIndex = null;

espacer for (eventIndex dans les événements) {

espacerespacer if (events.hasOwnProperty (eventIndex)) {

espacerespacerespacerevent = événements [eventIndex];

espacerespacer }

espacer }

};

var listenForPostMessage = fonction (événement) {

if (event.data && event.data.events && event.data.issuer === 'MAX') {

logToConsole ('=== a reçu un message avec [' + event.data.events.length + '] events ===');

doSomething (event.data.events);

}

};

// Ajout de l'écouteur pour les événements client MAX.

window.addEventListener ('message', listenForPostMessage);

// Envoie le message d'inscription à MAX

opener.postMessage ({contactId: contactId, émetteur: 'MyTestSite', messageType: 'Register-ForClientEvents', subscriptionTypes: subscriptionTypes}, '*');

L'objet de réponse

L'OBJET DE RÉPONSE

{

émetteur: «MAX»,

contactId: int (Nullable) - l'ID de contact qui a été trouvé comme panneau persistant ou qui a été transmis. Il sera nul si aucun contactId n'a été transmis ou trouvé.

événements: [objet, objet, objet ...] - Tous les événements renvoyés dans cet ensemble d'événements correspondant aux types d'abonnement ou au filtre de contact.

}

Réponse pour la forme du message de l'abonnement "SessionInfo":

{

type de message: "SessionInfo"

sessionToken: "mysessiontoken =="

}

L'ÉVÉNEMENT DE RECONNAISSANCE D'ABONNEMENT

S'il y a au moins unsubscriptionType, l'abonnement est autorisé. S'il n'y a pas de abonnementTypes, un avertissement de console est enregistré et affiche le type non valide. Le premier événement de l'ensemble des événements renvoyés sera un événement avec le type de message ClientEventSubscriptionAcknowledge. Cet événement a la structure suivante:

{

contactId: (int) - Si null, cela signifie qu'aucun contactId n'est associé à l'abonnement. C'est un moyen pour le client de voir si son abonnement "contact" a fonctionné.

type de message: ClientEventSubscriptionAcknowledge - (chaîne). Il s'agit de leur type de message d'événement d'accusé de réception spécifique.

raison: "Succès" | "Identifiant de contact non valide" | "Types d'abonnement non valides" - S'il répond avec la raison du code d'état ERREUR. Ce ne sera pas très détaillé pour ne pas ajouter trop de complexité. Il ne renverra qu'une seule raison d'échec. Nous vérifions d'abord la validité de l'ID de contact (pas ZERO ou pas une chaîne non entière). Si cela échoue mais qu'il existe également des types d'abonnement non valides, nous n'afficherons pas les erreurs secondaires jusqu'à ce qu'elles réessayent après avoir corrigé l'ID de contact. Cela signifie que nous n'avons pas gardé de référence à la fenêtre, donc l'abonnement a échoué.

statut: "OK" ou "ERROR" - Si cela renvoie une erreur, cela signifie que nous n'avons pas réussi à créer la connexion d'abonnement aux messages postés. Ils devront corriger ces erreurs et réessayer.

}

Dans certains cas, aucun accusé de réception d'abonnement n'est envoyé. Lorsque la même fenêtre demande un deuxième abonnement, sans supprimer au préalable l'abonnement existant, aucune réponse ne sera envoyée et aucun abonnement supplémentaire ne sera reconnu. Nous allons imprimer un avertissement de console qui a la structure suivante:

{

console.warn ('Erreur lors du traitement de l'abonnement client Even. Émetteur: ['+ subscriptionObject.data.issuer +'] est déjà abonné. ')

}