Consulter par code l'annuaire Peppol

0000003310     -      24/10/2025

L'annuaire (directory) Peppol peut être consulté par code pour vérifier l'inscription d'un participant, les documents acceptés, les données de contact, ... Le code repris ci-dessous utilise le web service Rest API du directory Peppol. Le contenu renvoyé par ce webservice ou la qualité des données de ce contenu sont en dehors du périmètre du support Mercator. Le code reprend une méthode synchrone et une méthode asynchrone.

Notez qu'ici on consulte l'annuaire et non pas les données d'adressage Peppol. Pour rappel, dans Mercator, un clic droit sur le numéro de TVA permet de vérifier la présence sur le réseau Peppol : cette fonctionnalité, au contraire du code présenté ici, consulte les données d'adressage, qui sont plus relevantes que celles de l'annuaire. Les données de l'annuaire ne sont correctes que dans la mesure où les providers agréés Peppol les mettent à jour au gré des nouvelles inscriptions dans leur réseau ou lors d'une modification de ces données.

💡 La réponse à la question : "est-il possible de vérifier par code la présence d'un client sur Peppol ?" est donc OUI. Avec ce code et en connaissance des limites indiquées ci-dessus.

Zoom
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using MercatorExtensions;

// <CompileWithRoslyn />

namespace TestTunnel
{
    public static class Class1
    {
        public static ParticipantResponse ParticipantInfo(string peppolId, out string error)
        {
            if (!peppolId.Contains(":"))
            {
                error = "Invalid peppolId!";
                return null;
            }
            string url = "https://directory.peppol.eu/search/1.0/json?participant=iso6523-actorid-upis::" + peppolId;

            MercatorExtensionsClass.JsonResultUpdater jsonResultUpdater = (jsonResult) =>
                jsonResult.Replace("-result-", "result")
                          .Replace("-page-", "page")
                          .Replace("query-terms", "queryterms")
                          .Replace("creation-dt", "creationdt");

#if (MERCATOR_CORE)
            MercatorHttpClient.HttpClient client = MercatorHttpClient.HttpClient.Create(url);
#else
            HttpWebRequest client = (HttpWebRequest)WebRequest.Create(url);
#endif
            client.Timeout = 2000;
            return client.GetData<ParticipantResponse>(jsonResultUpdater, out error);
        }

        public async static Task<(ParticipantResponse participantResponse, string error)> ParticipantInfoAsync(string peppolId)
        {
            if (!peppolId.Contains(":"))
                return (null, "Invalid peppolId!");
            
            string url = "https://directory.peppol.eu/search/1.0/json?participant=iso6523-actorid-upis::" + peppolId;

            MercatorExtensionsClass.JsonResultUpdater jsonResultUpdater = (jsonResult) =>
                jsonResult.Replace("-result-", "result")
                          .Replace("-page-", "page")
                          .Replace("query-terms", "queryterms")
                          .Replace("creation-dt", "creationdt");

#if (MERCATOR_CORE)
            MercatorHttpClient.HttpClient client = MercatorHttpClient.HttpClient.Create(url);
#else
            HttpWebRequest client = (HttpWebRequest)WebRequest.Create(url);
#endif
            client.Timeout = 2000;
            return await client.GetDataAsync<ParticipantResponse>(jsonResultUpdater);
        }
    }

    public class ParticipantResponse
    {
        public class Contact
        {
            public string type { get; set; }
            public string name { get; set; }
            public string phone { get; set; }
            public string email { get; set; }
        }

        public class DocType
        {
            public string scheme { get; set; }
            public string value { get; set; }
        }

        public class Entity
        {
            public List<Name> name { get; set; }
            public string countryCode { get; set; }
            public List<Identifier> identifiers { get; set; }
            public List<Contact> contacts { get; set; }
            public string regDate { get; set; }
        }

        public class Identifier
        {
            public string scheme { get; set; }
            public string value { get; set; }
        }

        public class Match
        {
            public ParticipantID participantID { get; set; }
            public List<DocType> docTypes { get; set; }
            public List<Entity> entities { get; set; }
        }

        public class Name
        {
            public string name { get; set; }
        }

        public class ParticipantID
        {
            public string scheme { get; set; }
            public string value { get; set; }
        }

        public string version { get; set; }
        public int totalresultcount { get; set; }
        public int usedresultcount { get; set; }
        public int resultpageindex { get; set; }
        public int resultpagecount { get; set; }
        public int firstresultindex { get; set; }
        public int lastresultindex { get; set; }
        public string queryterms { get; set; }
        public DateTime creationdt { get; set; }
        public List<Match> matches { get; set; }
    }
}

 

Le code synchrone peut être appelé avec ce code :

Zoom
ParticipantResponse participantInfo = Class1.ParticipantInfo("9925:be0411223337", out string error);

 

Le code asynchrone peut être appelé avec ce code :

Zoom
(ParticipantResponse participantInfo, string error) = await Class1.ParticipantInfoAsync("9925:be0411223337");


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)