Ce guide raconte la commande client ordinaire, du catalogue à la livraison. Il s'adresse à l'application client, au frontend et à la QA.
- Le client lit
GET /food/v1/restaurantspuisGET /food/v1/restaurants/{restaurant_id}/menu. - Avant de commander, il envoie
POST /food/v1/restaurants/{restaurant_id}/quoteavec les articles et les coordonnées. Food renvoie le sous-total, le frais de livraison configuré et le total XOF. - Il crée une commande avec
POST /food/v1/orders; le modedeliveryest le parcours MVP et le paiement estcash_on_deliveryouonline. Food fixerespond_byà cinq minutes par défaut; le worker annule une commande restéeplacedaprès cette échéance avec le motifrestaurant_unresponsive. - Pour
online, le client prépare le paiement avecPOST /food/v1/orders/{order_id}/payments/preparependant que la commande resteplaced. Le restaurant accepte avecPOST /food/v1/restaurants/{restaurant_id}/orders/{order_id}/acceptseulement après confirmation DiddiPaysucceeded; aucune préparation ne commence avant cette confirmation. Pourcash_on_delivery, l'acceptation peut commencer directement. - Pour
online, le client peut omettrecustomer_email. Food utilise l'e-mail fourni s'il existe, sinon le téléphone du compte authentifié pour produire une valeur technique comme2250700112233@diddifree.com. Le téléphone du destinataire n'est jamais utilisé pour le paiement. - Food crée la livraison auprès de DiddiSend. DiddiSend gère le livreur, la collecte cash, le trajet et la remise.
- Le client lit la projection avec
GET /food/v1/orders/{order_id}/delivery/tracking(ou/delivery). Food vérifie la propriété de la commande, demande la donnée à DiddiSend et ne renvoie que le suivi public. DiddiSend reste propriétaire de l'ETA, de la position, du coursier, de la preuve et de la décision après un échec. Les états projetés sontrequested,assigned,picked_up,in_transit,deliveredetfailed; un échec peut inclurefailure_codeetfailure_reason. - En cas de litige, le client crée une demande avec
POST /food/v1/orders/{order_id}/refund-requests, puis la suit avecGET /food/v1/orders/{order_id}/refund-requests. Après approbation, Food demande le remboursement à DiddiPay, y compris pour une commande cash; DiddiPay choisit le compte mobile money ou le compte opérateur bénéficiaire. - Le client peut relire sa note avec
GET /food/v1/orders/{order_id}/ratingaprès livraison. Une absence de note renvoieRATING_NOT_FOUND. - Le client peut enregistrer son appareil avec
/food/v1/devices/registeret reçoit les notifications disponibles. Après reconnexion WebSocket, il relit la commande.
sequenceDiagram
participant C as Client
participant F as DiddiFood
participant R as Restaurant
participant S as DiddiSend
C->>F: GET catalogue
C->>F: POST /orders
R->>F: accept puis ready
F->>S: request delivery
S-->>F: statut livraison
F-->>C: commande et notification
Hors périmètre pour l'instant
Le retrait sur place et les substitutions restent désactivés par défaut (DIDDIFOOD_PICKUP_ENABLED=false, DIDDIFOOD_SUBSTITUTION_ENABLED=false).
Création de plat côté Pro
Le manager doit envoyer Idempotency-Key à POST /food/v1/restaurants/{restaurant_id}/dishes. Une nouvelle tentative avec la même clé et le même corps renvoie le même plat; la même clé avec un corps différent est rejetée en 409 IDEMPOTENCY_CONFLICT.