Développeurs d'enseignes OneSpan : Enregistrement d'une salle virtuelle - Partie 3

Duo Liang,

Dans les blogs des parties 1 et 2, nous avons décrit le processus de configuration d'une transaction pour l'enregistrement d'une salle virtuelle. Nous avons ensuite présenté deux méthodes pour les notifications d'état et le téléchargement des enregistrements vidéo.

Dans la troisième partie de cette série de blogs, nous allons approfondir la prise en charge des notifications par callback de la fonctionnalité Virtual Room et présenter un exemple pratique dans le code .NET. Sans plus attendre, commençons !

Notification d'événement pour l'enregistrement vidéo

Une fois que tous les signataires ont fini de signer une transaction en salle virtuelle, la session enregistrée commence à être traitée en coulisses. En plus d'être notifié par courriel, vous pouvez également enregistrer la notification de rappel "Enregistrements vidéo prêts" via le portail de l'interface utilisateur de l'expéditeur, comme indiqué ci-dessous :

6-8-1

Une fois que les enregistrements sont prêts à être téléchargés et que cette configuration est établie, OneSpan Sign envoie une requête HTTP POST à votre point de terminaison d'écoute enregistré avec une charge utile similaire au JSON ci-dessous :

{"@class" : "com.silanis.esl.packages.event.ESLProcessEvent", "name" : "RECORDINGS_READY", "sessionUser" : "ATQOPd60xE4V", "packageId" : "t0xp9WDwJrisseOl3JkIMXe_X0Y=", "message":null, "documentId":null, "createdDate" : "2022-06-03T14:46:36.808Z"}

Si le nom de l'événement est "RECORDINGS_READY", votre application d'écoute sait qu'il est temps d'extraire la liste des enregistrements et de télécharger chaque session individuelle.

La notification d'événements en action

Dans cette section, nous allons vous montrer comment mettre en œuvre un récepteur de rappel et traiter l'événement "enregistrement prêt". Il s'agit d'un projet d'application ASP.NET Web API, et le code complet peut être téléchargé ici.

La première étape consiste à exposer un contrôleur API qui gère les demandes de rappel du système OneSpan Sign :

    public class CallbackController : ApiController
    {
        // POST api/
        public ActionResult Post(JObject jsonResult)
        {
            #region "check callback key if applicable"
            string callbackKey = Request.Headers.GetValues("Authorization").First() ;
            Debug.WriteLine("callback key : "+callbackKey) ;
            #endregion

            #region "Extraire les données de la requête"
            string name = jsonResult["name"].ToString() ;
            string sessionUser = jsonResult["sessionUser"].ToString() ;
            string packageId = jsonResult["packageId"].ToString() ;
            string message = jsonResult["message"].ToString() ;
            string documentId = jsonResult["documentId"].ToString() ;
            string createdDate = jsonResult["createdDate"].ToString() ;

            OssCallbackVo ossCallbackVo = new OssCallbackVo
            {
                Name = nom,
                SessionUser = sessionUser,
                PackageId = packageId,
                Message = message,
                DocumentId = documentId,
                CreatedDate = createdDate
            } ;

            Debug.WriteLine("callback payload : " + jsonResult.ToString()) ;
            #endregion

            #region "process callback"
            OssCallbackHandler callbackHandlder = new OssCallbackHandler() ;
            Task.Run(async () => await callbackHandlder.ProcessOssCallback(ossCallbackVo)) ;
            #endregion

            return new HttpStatusCodeResult(200) ;
        }
    }

Dans le code ci-dessus, toute requête POST ciblant la route "/api/Callback" sera traitée par notre contrôleur.

Ensuite, nous distribuerons différentes fonctions de service en fonction de l'événement de rappel. Une classe de service avec une méthode asynchrone a été utilisée pour gérer cette logique métier.

    public class OssCallbackHandler
    {
        public Task ProcessOssCallback(OssCallbackVo ossCallbackVo)
        {
            switch (ossCallbackVo.Name)
            {
                case C.OssCallbackEvents.PACKAGE_CREATE :
                    break ;
                case C.OssCallbackEvents.PACKAGE_ACTIVATE :
                    OssCallback_PACKAGE_ACTIVATE(ossCallbackVo) ;
                    break ;
                case C.OssCallbackEvents.PACKAGE_DEACTIVATE :
                    break ;
                case C.OssCallbackEvents.PACKAGE_READY_FOR_COMPLETION :
                    break ;
                case C.OssCallbackEvents.RECORDINGS_READY :
                    OssCallback_RECORDINGS_READY(ossCallbackVo) ;
                    break ; 
                 .....
            }

            return Task.CompletedTask ;
        }

Nous avons maintenant déclaré toutes les fonctions auxiliaires possibles pour gérer les événements de rappel dans notre code. Dans cet exemple, l'événement "RECORDINGS_READY" a été surveillé et a déclenché la fonction de service correspondante :

            //étape 1 : vérification de l'état de l'enregistrement
            //GET /virtual-room-video/{packageId}/recordings
            HttpClient myClient = new HttpClient() ;
            myClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", C.OSS.API_KEY) ;
            myClient.DefaultRequestHeaders.Add("Accept", "application/json") ;

            var result = myClient.GetAsync(new Uri(C.OSS.BASE_URL + $"/virtual-room-video/{packageId}/recordings")).Result ;
            Debug.WriteLine(result.Content.ReadAsStringAsync().Result) ;
            JArray returnJSON = JArray.Parse(result.Content.ReadAsStringAsync().Result) ;
            if (returnJSON != null && returnJSON.Count > 0)
            {
                foreach (JObject item in returnJSON) 
                {
                    string uid = item.GetValue("uid").ToString() ;
                    string fileName = item.GetValue("fileName").ToString() ;
                    string creationDate = item.GetValue("creationDate").ToString() ;
                    string fileSize = item.GetValue("fileSize").ToString() ;
                    string fileFormat = item.GetValue("fileFormat").ToString() ;
                    string status = item.GetValue("status").ToString() ;
                    string md5Hash = item.GetValue("md5Hash").ToString() ;
                    string deletionDate = item.GetValue("deletionDate").ToString() ;

                    if (status == "completed") {
                        //step2 : download individual recordings
                        //GET /virtual-room-video/{packageId}/download-recording/{recording_uid}
                        HttpClient myClient2 = new HttpClient() ;
                        myClient2.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", C.OSS.API_KEY) ;
                        myClient2.DefaultRequestHeaders.Add("Accept", "video/mp4") ;
                        var result2 = myClient2.GetAsync(new Uri(C.OSS.BASE_URL + $"/virtual-room-video/{packageId}/download-recording/{uid}")).Result ;
                        var stream = result2.Content.ReadAsStreamAsync().Result ;
                        string fileLocation = C.SIGNED_DOCUMENTS_STORAGE_PATH + "\" + Regex.Replace(fileName, "[^a-zA-Z0-9_.]+", "_", RegexOptions.Compiled) ;
                        Debug.WriteLine("chemin d'enregistrement du fichier : " + fileLocation) ;
                        using (var fileStream = new FileStream(fileLocation, FileMode.Create))
                        {
                            stream.CopyToAsync(fileStream) ;
                        }               
                    }
                }
            }

Comme nous l'avons vu dans la partie 2, les étapes suggérées consistent à récupérer d'abord l'état des enregistrements, puis à télécharger ceux qui ont été traités avec succès par leur UID.

Avant d'exécuter le code, n'oubliez pas d'ajuster les configurations liées à OneSpan Sign dans le fichier Constants.cs.

Effectuez un test

Il est maintenant temps d'effectuer un test rapide. Si nous avons créé une transaction de signature en salle virtuelle et que nous l'avons signée rapidement, vous devriez pouvoir trouver les fichiers d'enregistrement téléchargés à l'emplacement de votre choix.

Si vous avez des questions concernant ce blog ou tout autre sujet relatif à l'intégration de OneSpan Sign dans votre application, visitez les forums de la communauté des développeurs. Vos commentaires nous intéressent !