API MDM Express en Node.js et PHP
MDM Express stocke vos produits et les expédie. Avec dz-delivery, le provider mdm utilise son API v2 (colis, géographie, bureaux) avec le même code que les autres transporteurs.
Installer
npm install @dz-delivery/core
composer require dz-delivery/sdk
Node.js ≥ 18 (aucune dépendance) ou PHP ≥ 8.2 (Guzzle 7). Le même code fonctionne ensuite pour les autres transporteurs : seule la configuration du client change.
Identifiants MDM Express
| Option | Valeur | Notes |
|---|---|---|
apiKey | Clé API créée dans le tableau de bord MDM | Envoyée en x-api-key |
storeId | Votre boutique MDM (STR-…) | Obligatoire pour créer un colis |
MDM Express en TypeScript / Node.js
import { createClient, isShippingError } from '@dz-delivery/core'; const mdm = createClient('mdm', { apiKey: process.env.MDM_API_KEY!, storeId: process.env.MDM_STORE_ID!, // STR-… }); const quote = await mdm.getFees({ toWilayaId: 16, toCommuneId: 'Bab Ezzouar' }); try { const parcel = await mdm.createParcel({ recipientName: 'Mohamed Amine', phone: '0550123456', address: 'Cité 221 lots, n°98', wilayaId: 16, communeName: 'Bab Ezzouar', // produits stockés chez MDM : leur id catalogue (PRD-…) productList: [{ name: 'T-shirt', quantity: 1, productId: 'PRD-B5C63A' }], price: 2500, }); const { parcel: current, events } = await mdm.track(parcel.trackingNumber); } catch (err) { if (isShippingError(err)) console.error(err.code, err.message); } // Colis livrés, filtrés côté MDM const delivered = await mdm.listParcels({ status: 'delivered', pageSize: 50 });
MDM Express en PHP / Laravel
use DzDelivery\ClientFactory; use DzDelivery\Errors\ShippingError; $mdm = ClientFactory::create('mdm', [ 'apiKey' => getenv('MDM_API_KEY'), 'storeId' => getenv('MDM_STORE_ID'), ]); try { $parcel = $mdm->createParcel([ 'recipientName' => 'Mohamed Amine', 'phone' => '0550123456', 'address' => 'Cité 221 lots, n°98', 'wilayaId' => 16, 'communeName' => 'Bab Ezzouar', 'productList' => [['name' => 'T-shirt', 'quantity' => 1, 'productId' => 'PRD-B5C63A']], 'price' => 2500, ]); $result = $mdm->track($parcel->trackingNumber); } catch (ShippingError $e) { echo "{$e->code}: {$e->getMessage()}"; }
Guide PHP complet (Laravel, erreurs, tests) : guide-php.md.
Méthodes supportées
| Méthode | Support | Notes |
|---|---|---|
createParcel | oui | Produits du catalogue MDM (productId ou sku = PRD-…) et storeId. |
track | oui | Statut unifié + historique. |
getFees | oui | Tarif exact par commune (domicile ou bureau) et frais de retour. |
getWilayas / getCommunes | oui | Ids de commune MDM (DZA161601). |
getStopDesks | oui | Bureaux des transporteurs partenaires de MDM. |
listParcels | oui | Filtres status et updatedSince appliqués côté MDM. |
cancelParcel | NOT_SUPPORTED | Pas d’annulation par API : depuis le tableau de bord MDM. |
healthCheck | oui | Vérifie la clé (appel réel). |
À savoir sur l’API MDM Express
- Testé en réel (octobre 2026, lecture seule) : wilayas, communes, bureaux, tarifs, liste, suivi, erreurs.
- Fulfilment : MDM expédie des produits stockés chez lui. Chaque ligne de
productListdoit porter son id catalogue MDM ; un produit inconnu →VALIDATION_ERRORsurproductList. priceest ce que paie le destinataire : MDM n’ajoute pas de frais de livraison par-dessus.- MDM n’a pas de champ « référence commande » :
orderIdest écrit dans les notes (Ref: …) et reste filtrable aveclistParcels({ orderId }). - Le
baseUrldoit être en HTTPS.
Mapping natif détaillé (endpoints, champs, statuts) : PROVIDERS.md.
FAQ MDM Express
Où trouver ma clé API et mon storeId MDM ?
Dans le tableau de bord MDM : la clé API dans les paramètres API, le storeId (STR-…) dans votre boutique.
Puis-je envoyer un produit qui n’est pas stocké chez MDM ?
Non : MDM refuse les produits hors catalogue. Ajoutez d’abord le produit dans MDM, puis utilisez son id PRD-….
Comment annuler un colis MDM ?
L’API n’a pas d’annulation : cancelParcel renvoie NOT_SUPPORTED. Annulez depuis le tableau de bord MDM.
Autres transporteurs
Même interface, mêmes statuts normalisés (pending, in_transit, delivered…).