Tracking

Un exemple de bout en bout, pensé comme un fil conducteur, construire une petite boutique en ligne dont la livraison s'appuie sur Boxtal. On y combine l'API v1 pour la cotation, l'API v3 pour les expéditions et le suivi, et le composant Carte pour les points relais. Chaque étape renvoie au guide d'intégration API v1 & v3 pour le détail technique.

Exemple d'intégration illustratif, inspiré d'une intégration réelle (la boutique « Comptoir »). Les URLs et paramètres exacts sont à confirmer sur la documentation officielle Boxtal.

Le projet

Objectif, une boutique légère qui vend quelques dizaines de références et livre en France et en Europe, en point relais et à domicile, avec des frais de port justes.

Le principe d'intégration tient en trois rendez-vous avec Boxtal. Au panier, on cote et on affiche les modes. Après le paiement, on crée l'expédition. Pendant le trajet, on reçoit le suivi. Tout se passe côté serveur, le navigateur du client ne voit jamais les clés.

BesoinBrique Boxtal
Afficher des frais de port calculésAPI v1 (cotation)
Créer l'expédition, récupérer l'étiquette, suivreAPI v3
Laisser le client choisir son point relaisComposant Carte
Être prévenu des événementsWebhooks (API v3)
Les étapes

Sept étapes, du compte Boxtal au suivi du colis. Chaque étape pointe vers la partie correspondante du guide.

1 Préparer le compte et les clés

On crée un compte professionnel, puis dans l'espace développeur une application API v3 (expéditions, suivi, notifications), une application API v1 (cotation) et une application Composant Carte. On commence sur l'environnement de test, où les expéditions ne sont pas facturées.

Les clés restent sur le serveur, chiffrées. En production, le paiement différé doit être activé (SIRET valide). Voir Authentification et Environnements.

Les cotations v1 qui servent à vérifier la disponibilité des offres et à construire les tarifs de secours se font avec les clés de production. Une cotation ne crée rien et n'est pas facturée, alors que l'environnement de test ne propose pas toujours les mêmes offres que la production. Les expéditions, elles, restent en test tant que la boutique n'est pas ouverte.
2 Modéliser le catalogue

Chaque produit porte un poids, des dimensions, une valeur et une catégorie de contenu (choisie dans la liste Boxtal, utile à la cotation et à la douane). Ces données déterminent le colis déclaré et donc la justesse des cotations. Pour l'international, on ajoute un code SH (douane).

3 Définir les zones et les modes de livraison

On découpe le monde en zones (France métropolitaine, Corse, Outre-mer, UE, Europe hors UE, International) et, au besoin, en zones personnalisées par pays. Règle simple, un pays n'appartient qu'à une seule zone. La France est l'exception, car elle se répartit entre plusieurs zones selon le code postal (20 pour la Corse, 97 et 98 pour l'Outre-mer).

Chaque mode de livraison d'une zone pointe vers une offre Boxtal (code OPERATEUR-Service) et fixe le prix, cotation plus marge, forfait ou grille par poids.

Avant de proposer un mode dans une zone, on vérifie par cotation que l'offre est bien disponible vers chaque pays de la zone. Pour les offres en point relais, ce test demande une précaution particulière, décrite dans Disponibilité d'une offre en relais par pays.

4 Coter au panier et fixer le prix

Quand le client saisit son adresse, le serveur cote en v1 pour le colis et récupère les offres. On applique la politique de prix du mode (marge en pourcentage puis fixe, arrondi par exemple aux 50 centimes supérieurs), puis on affiche les modes disponibles.

L'offre retenue se convertit en code v3 en reliant l'opérateur et le service par un tiret (par exemple MONR-CpourToi). On enregistre ce code sur la commande. Détails et pièges, cotation v1 et pièges à éviter.

Ne filtrez pas la cotation par une offre précise, demandez toutes les offres et choisissez le bon code côté serveur. Nettoyez les codes (espaces parasites) avant toute comparaison.

Le prix affiché au client vient de la cotation v1, mais le prix facturé est celui que renvoie l'API v3 à la création de l'expédition (deliveryPriceExclTax, hors taxes). Les deux peuvent légèrement différer, d'où l'intérêt d'une marge et d'un arrondi.

5 Choisir le point relais

Pour un mode relais, on affiche le composant Carte de Boxtal. Le jeton est généré côté serveur avec les clés de l'application Composant Carte (jamais avec les clés API v3), et seul ce jeton temporaire est transmis au navigateur.

La carte est initialisée avec le seul réseau du transporteur de l'offre, déduit du code opérateur (MONR-CpourToi donne MONR_NETWORK). Avec plusieurs réseaux, le client pourrait choisir un point d'un autre transporteur, incompatible avec l'offre cotée. Le client choisit son point, le serveur enregistre son code avec la commande. Voir points relais & Carte.

6 Créer l'expédition et récupérer l'étiquette

Après paiement, le serveur crée l'expédition en v3 avec le même code d'offre que celui coté, le point relais éventuel (pickupPointCode) et le numéro de commande. Boxtal renvoie un identifiant et le prix facturé.

L'étiquette n'est pas dans la réponse de création. Elle est en général disponible presque aussitôt, parfois après quelques secondes à quelques minutes, et Boxtal le signale par le webhook DOCUMENT_CREATED. Le document renvoie une URL signée, valable 7 jours, que le serveur utilise pour télécharger l'étiquette et la conserver avant de la servir à l'utilisateur. Voir créer une expédition.

7 Suivre le colis

On s'abonne une fois aux notifications, pour chaque type d'événement utile (DOCUMENT_CREATED pour l'étiquette, TRACKING_CHANGED pour le suivi). À chaque événement, Boxtal appelle une URL du serveur. L'en-tête x-bxt-signature contient une signature HMAC SHA-256 en hexadécimal, calculée sur le corps brut de la requête en UTF-8, à recalculer et comparer avant tout traitement. On met à jour le statut et on prévient le client. Une tâche planifiée resynchronise le suivi, en filet de sécurité si une notification se perd. Voir webhooks signés.

Robustesse et pièges rencontrés

Les difficultés réellement rencontrées pendant la construction de la boutique, avec le contexte dans lequel elles sont apparues et la solution retenue.

Disponibilité d'une offre en relais par pays
Contexte
Pour décider si un mode de livraison en point relais peut être proposé dans une zone, on vérifie, pour chaque pays de la zone, que l'offre en relais correspondante est disponible. La vérification se fait par des requêtes de cotation v1 vers une ville du pays.
Problème
Avec une seule ville par pays, le résultat n'est pas fiable. La réponse de la cotation dépend de l'adresse de destination, et une offre en relais peut être absente pour une ville alors qu'elle est bien disponible dans le pays. On risquait donc d'écarter à tort une offre pour tout un pays.
Solution
Faire le test sur trois villes différentes par pays. L'offre en relais est considérée comme disponible dans le pays dès qu'au moins une des trois cotations la renvoie. Elle n'est écartée que si aucune des trois ne la propose.
Volume de cotations et erreur 504
Contexte
Les vérifications de disponibilité et le calcul des tarifs de secours enchaînent beaucoup de cotations (pays × trois villes × offres, voire × tranches de poids).
Problème
Envoyées l'une après l'autre, ces requêtes dépassent le temps d'exécution accordé par l'hébergeur et la page finit en erreur 504.
Solution
Envoyer les requêtes en parallèle par petits lots (cURL multi en PHP), avec un délai maximal par requête, et conserver les résultats pour ne pas tout recalculer à chaque affichage.
Tarif de secours
Problème
Si la cotation ne répond pas (délai dépassé, erreur, API indisponible), le panier ne peut plus afficher de frais de port et le client ne peut pas commander.
Solution
Le mode bascule sur une grille de secours, alimentée par les dernières cotations réelles et majorée d'un pourcentage pour couvrir une éventuelle hausse. Le client peut toujours commander, et le prix réellement facturé reste celui de la création v3.
Codes postaux par pays
Problème
Pour les villes de test, certains formats de code postal provoquent une erreur 400, par exemple la Lettonie sans le préfixe LV- (1050) ou les Pays-Bas au format complet (3011 EA). D'autres pays, comme l'Argentine, attendent un format particulier.
Solution
Prévoir pour chaque pays un code postal au format accepté, et pour les cas délicats plusieurs candidats essayés l'un après l'autre en cas d'erreur 400.
Codes pays propres à Boxtal (v1)
Problème
La liste des pays de l'API v1 contient des codes qui ne sont pas des codes ISO, pour des territoires particuliers (Canaries E1, Açores P1, Büsingen D1, Campione I1…).
Solution
Les traiter à part dans les zones et les afficher avec leur pays de rattachement. Avant de réutiliser une adresse en v3, qui attend un code ISO (countryIsoCode), vérifier la correspondance.
Codes d'offre au nom voisin
Problème
Deux offres d'un même transporteur peuvent avoir un nom proche mais un code différent, souvent une version France et une version Europe (MONR-CpourToi et MONR-CpourToiEurope, CHRP-ChronoRelais et CHRP-ChronoRelaisEurope). La conversion v1 vers v3 se fait aussi avec un tiret, pas un tiret bas.
Solution
Comparer les codes nettoyés, jamais les libellés, et construire le code v3 sous la forme operator.code-service.code.
Prix coté et prix facturé
Problème
Le prix de la cotation v1 et le prix renvoyé par la v3 à la création de l'expédition peuvent différer légèrement.
Solution
Enregistrer les deux sur la commande pour pouvoir les comparer, et garder une marge suffisante dans la politique de prix.
Aller plus loin
Le guide d'intégration API Boxtal v1 & v3 détaille chaque appel, les exemples de code et les bonnes pratiques. La FAQ répond aux questions de fond sur les deux API.