Comment soumettre des PDF à la signature d'un signataire externe ?

0000003139     -      16/05/2023

Mercator 10.10 ou ultérieur permet d'envoyer un document à la signature chez un client, un fournisseur ou une autre relation externe à l'entreprise. Cet envoi pour signature est effectué via le service Ok!Sign. Ce service est indépendant de Mercator mais Mercator dispose d'une API qui permet un interfaçage aisé. Il est donc nécessaire d'ouvrir un compte chez Ok!Sign et, éventuellement, de le doter de crédits.

(Pour une signature électronique d'un PDF effectuée localement : voir cette page)

Dans le portail Ok!Sign, il faut activer l'API en créant un token d'organisation. Une fois ce token créé (n'importe quelle chaîne comprenant uniquement ces caractères [a-zA-Z0-9-]), il faut prendre note de la valeur x-oksign-authorization.

Il est aussi nécessaire de fixer cette valeur dans CallbackURLhttps://restapi.mercator.eu/api/OkSignWebHook. Les deux autres URL peuvent rester vides.

L'interfaçage se fait via l'API fournie par Mercator qui se trouve dans MercatorTunnel.dll : MercatorSigning.Ok!Sign.

Zoom
public static OkSignResponse UploadPdfForSignature(string fileName, FormDescriptor formDescriptor, string authorizationHeader, out string error, int timeOutSec = 10, CancellationTokenSource cancellationTokenSource = null)
public static async Task<(OkSignResponse response, string error)> UploadPdfForSignatureAsync(string fileName, FormDescriptor formDescriptor, string authorizationHeader, int timeOutSec = 10)

public static bool Remove(string docId, string authorizationHeader, out string error, int timeOutSec = 10)
public static async Task<(bool result, string error)> RemoveAsync(string docId, string authorizationHeader, int timeOutSec = 10)

public static OkSignResponse.FileInfoDescriptor DocumentExists(string docId, string authorizationHeader, out string error, int timeOutSec = 10)
public static async Task<(OkSignResponse.FileInfoDescriptor result, string error)> DocumentExistsAsync(string docId, string authorizationHeader, int timeOutSec = 10)

public static byte[] DocumentRetrieve(string docId, string authorizationHeader, out string error, int timeOutSec = 10)
public static async Task<(byte[] result, string error)> DocumentRetrieveAsync(string docId, string authorizationHeader, int timeOutSec = 10)

public static DocumentStatusRet DocumentStatus(string docId, string authorizationHeader, out string error, int timeOutSec = 10)
public static async Task<(DocumentStatusRet, string error)> DocumentStatusAsync(string docId, string authorizationHeader, int timeOutSec = 10)

 

Le paramètre authorizationHeader doit contenir la valeur x-oksign-authorization.

Le processus commence toujours par l'upload du document à signer via la méthode UploadPdfForSignature ou UploadPdfForSignatureAsync. Les paramètres spécifiques à passer sont 

  • le fichier PDF, avec son chemin complet. Il peut s'agir d'un chemin compatible avec SqlFileView
  • FormDescriptor qui décrit le formulaire de signature à associer au fichier PDF.

La composition du formulaire de signature est détaillée sur cette page. Afin de faciliter sa composition, l'API de Mercator propose la classe MercatorSigning.OkSign.FormDescriptor.FormHelper. Dans l'exemple ci-dessous, on montre comment envoyer un document à la signature chez deux signataires :

  • un signataire externe (le client)
  • un signataire interne (l'expéditeur) pour lequel la contre-signature automatique a été activée dans le portail Ok!Sign, dont l'id est bt_00000000-0000-0000-0000-000569645580 (Important : dans le portail Ok!Sign, le dessin de signature doit exister et la case à cocher "Partager ma signature avec d'autres utilisateurs." doit être activée.)

Zoom
// premier signataire = le client
 MercatorSigning.OkSign.FormDescriptor.FormHelper formHelper1 = new MercatorSigning.OkSign.FormDescriptor.FormHelper
 {
     FieldMarker = "Signature_1",
     FieldWidth = 175,
     FieldHeight = 70,
     FieldSigningOptions = MercatorSigning.OkSign.FormDescriptor.FormHelper.SigningOptionsEnum.Tan | MercatorSigning.OkSign.FormDescriptor.FormHelper.SigningOptionsEnum.Eid | MercatorSigning.OkSign.FormDescriptor.FormHelper.SigningOptionsEnum.Pen | MercatorSigning.OkSign.FormDescriptor.FormHelper.SigningOptionsEnum.Itsme,
     SignerInfoName = actionEngine.ActionsRecord.NOM,
     SignerInfoMobile = actionEngine.ACTIONS["NUM_GSM"].ToString(),
     SignerInfoActingAs = actionEngine.ACTIONS["FONCTION"].ToString(),
     SignerInfoEmail = actionEngine.ActionsRecord.EMAIL,
 };
 // second signataire = contre-signature automatique autorisée via le portail OkSign
 MercatorSigning.OkSign.FormDescriptor.FormHelper formHelper2 = new MercatorSigning.OkSign.FormDescriptor.FormHelper
 {
     FieldMarker = "Signature_2",
     FieldWidth = 175,
     FieldHeight = 70,
     TeamMemberId = "bt_00000000-0000-0000-0000-000569645580"
 };
 MercatorSigning.OkSign.FormDescriptor formDescriptor = new MercatorSigning.OkSign.FormDescriptor
 {
     SendToMeEmail = "info@mercator.eu", // pas obligatoire si le mail à utiliser est celui dans le compte OkSign
     Logo = "https://www.mercator.eu/assets/images/logo.png", // pas obligatoire si le logo à utiliser est celui dans le compte OkSign
     FileName = Api.JustFName(fileToSign) // nom du fichier visible par le signataire. Peut contenir une chaîne libre terminant par .pdf
 };
 formDescriptor.FormHelpers.AddRange(formHelper1, formHelper2); // ajouter ici plusieurs signataires si nécessaire

 MercatorSigning.OkSign.OkSignResponse response = MercatorSigning.OkSign.UploadPdfForSignature(fileToSign, formDescriptor, actionEngine.TagString, out string error);
 if (!string.IsNullOrEmpty(error))
 {
     ...;
 }

 

Dans cet exemple, on voit que chaque signature va être saisie dans un cadre de 70x175 pixels. Ces deux cadres seront respectivement placés aux endroits où les mots Signature_1 et Signature_2 sont positionnés. Il est possible de déterminer différemment la position des signatures, en utilisant par exemple :

  • FieldPageNbr : numéro de la page
  • FieldPosY : position verticale
  • FieldPosX : position horizontale

On peut ne pas utiliser le FormHelper, et fournir directement la liste des Fields et des SignersInfo. Notez que les deux listes doivent avoir le même nombre d'éléments et être liées via les propriétés SignerId = Id. Cette valeur doit être incrémentée de 1 pour chaque signataire.

Zoom
FormDescriptor formDescriptor = new FormDescriptor
{
    SendToMeEmail =  "info@mercator.eu",
    FileName = "myinvoice.pdf",
    Fields = new List<FormDescriptor.Field>
    {
        new FormDescriptor.Field
        {
            Marker = "Signature_1",
            InputType = "CanvasSIG",
            Name = "SIG_FIELD_1",
            Required = true,
            Width = 175,
            Height = 70,
            SignerId = "bt_00000000-0000-0000-0000-000000000001",
            SigningOptions = new FormDescriptor.Signingoptions
            {
                Eid = new FormDescriptor.Eid(),
                Pen = new FormDescriptor.Pen(),
                Tan = new FormDescriptor.Tan(),
                //Itsme = new FormDescriptor.Itsme()
            }
        }
    },
    SignersInfo = new List<FormDescriptor.Signersinfo>
    {
        new FormDescriptor.Signersinfo
        {
            Name = "Jules Leboss",
            Mobile = "+32499799999",
            ActingAs = "Administrateur",
            Id = "bt_00000000-0000-0000-0000-000000000001",
            Email = "jules.leboss@company.com"
        }
    }
};

 

La méthode UploadPdfForSignature renvoie, en cas de succès, une MercatorSigning.OkSign.OkSignResponse. Sa propriété Result contiendra une liste d'URL de signature à faire parvenir (par mail) à chaque signataire. response.Result[i].Url


Exemples d'implémentations


Note importante concernant le RGPD

Les documents PDF sont uploadés sur les serveurs de Ok!Sign et y demeurent tant qu'ils ne sont pas supprimés. Ces fichiers peuvent être supprimés 

  • via la méthode Remove ou RemoveAsync,
  • directement dans le portail Ok!Sign.

Ces PDF peuvent contenir des données personnelles. Par ailleurs, les adresses email et numéros de GSM sont transmis. Il est donc nécessaire d'inclure Ok!Sign dans votre stratégie de mise en conformité par rapport au RGPD.

Au sens du RGPD, une signature est une donnée personnelle sensible. Son usage et sa durée de conservation doivent être strictement limités et proportionnels à l'objectif recherché. Cette donnée sensible doit être protégée. Tout ceci relève des procédures internes de l'entreprise.

Quant à Mercator, à aucun instant, il ne capte des informations issues du processus décrit ici (contenu du PDF, adresses email, numéros de GSM, ...) Aucune de ces informations personnelles ou données sensibles ne transitent par les serveurs de Mercator.

Le webhook de Mercator a pour unique usage d'établir une correspondance entre les ID des documents avant signature et après signature, ainsi que de compter le nombre de signatures. Ces informations anonymes sont donc mémorisées par Mercator :

  • accountnbr : première partie du x-oksign-authorization
  • source doc id : sous la forme 897215-59BFAC70-6257-1260-F259-6259A18EECE0
  • signed doc id : sous la forme 656858-6072474D-80A0-D54A-4937-4FD639BAE9B6
  • nombre de signatures attendues
  • nombre de signatures obtenues
  • date et heure du dernier appel au webhook par les serveurs de Ok!Sign pour ce document.

Considérations concernant la validité des signatures

Les signatures électroniques sont régies par le cadre réglementaire eIDAS. Tous les modes de signatures proposés par Ok!Sign sont compatibles avec cette réglementation; en ce compris les signatures PEN et TAN/SMS.

Toutefois, il est toujours nécessaire de vérifier, en fonction de la législation des pays concernés et du type de document à signer, si ce mode de signature numérique est valide.

Ok!Sign est une société belge. Elle n'offre pas de possibilité de signer avec des cartes d'identité ou des certificats étrangers. Le cas échéant, il est conseillé d'utiliser un code TAN/SMS.

Ok!Sign permet de signer avec d'autres certificats commerciaux (tel qu'Isabel, par exemple).

OK!Sign utilise la plate-forme de signature sécurisée Betrust.

 

Mots clés : OkSign