## Flux (API et espace client) 1. **`GET /v1/domains/quote`** — montant **XAF** pour `domain` + `years`. 2. **`POST /v1/domains`** — crée une commande `order_type: standalone_domain` en **`payment_required`** avec le contact **registrant** (aucun achat registrar avant paiement). 3. **`POST /v1/domain-orders/{order_uuid}/pay`** — initie NotchPay (Mobile Money ou carte selon le parcours NotchPay) ; réponse avec **`checkout_url`**. 4. Après paiement (webhook) — enregistrement registrar, nameservers par défaut, commande **`active`** ; gestion DNS via les routes **`domains:dns`**. Dans l’**espace client** : le flux principal passe par la page **`/domains`** (vérification + achat direct) ou via les liens contextuels vers **`/client/domains/purchase`**, puis redirige vers la fiche commande pour payer. ### Distinction avec l’hébergement - **Hébergement mutualisé** : le domaine peut être inclus / provisionné via `ProcessAutomatedOrder` après paiement d’un **plan d’hébergement** — ce n’est **pas** ce flux. - **Revendeur** : pas d’achat de domaine client dans le job revendeur ; l’API domaine seul reste disponible si vous créez une clé avec les bons scopes. --- ## `POST /v1/domains` — Créer la commande ```http POST /v1/domains Authorization: Bearer kh_live_xxxx Content-Type: application/json Accept: application/json ``` ### Corps JSON ```json { "domain": "monsite.com", "years": 1, "registrant": { "first_name": "Jean", "last_name": "Dupont", "email": "jean@example.cm", "phone": "+237677123456", "address": "BP 1234", "city": "Yaoundé", "state": "Centre", "postal_code": "00237", "country": "CM", "organization": "Mon Entreprise SARL" } } ``` | Champ | Type | Requis | Description | |-------|------|--------|-------------| | `domain` | string | Oui | Nom de domaine | | `years` | integer | Non | 1 à 10 (défaut **1**) | | `registrant` | object | Oui | Contact WHOIS (voir ci-dessous) | Le serveur **recalcule** le devis : le montant de la commande correspond au quote courant (pas de montant client dans le corps). ### Objet `registrant` Variantes acceptées : **`first_name` / `firstname`**, **`last_name` / `lastname`**, **`postal_code` / `postcode`**. | Champ | Requis | |-------|--------| | `email`, `phone`, `address`, `city`, `country` | Oui | | Prénom / nom (une des variantes ci-dessus) | Oui | | Code postal (une des variantes) | Oui | | `state`, `organization` | Non | ### Réponse — succès (201) ```json { "success": true, "data": { "order_uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "order_number": "KH-XXXXXXXXXX", "amount_xaf": 16000, "currency": "XAF", "status": "payment_required", "payment_required": true } } ``` ### Erreurs courantes | `error.code` | Cas | |----------------|-----| | `checkout_disabled` | Checkout automatique désactivé côté serveur | | `unavailable` / `pricing_unavailable` / … | Même sémantique que **`GET /v1/domains/quote`** | | `validation_error` | Registrant incomplet | **Permissions :** `domains:write` --- ## `POST /v1/domain-orders/{order_uuid}/pay` — Payer ```http POST /v1/domain-orders/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/pay Authorization: Bearer kh_live_xxxx Content-Type: application/json Accept: application/json ``` ```json { "callback_url": "https://votre-app.example/retour-paiement" } ``` | Champ | Requis | Description | |-------|--------|-------------| | `callback_url` | Non | URL de retour après paiement (défaut : page commande espace client) | ### Réponse — succès (200) ```json { "success": true, "data": { "checkout_url": "https://pay.notchpay.co/...", "reference": "KHNP-XXXXXXXX-YYYYYYYY", "order_uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "amount_xaf": 16000, "currency": "XAF" } } ``` **Permissions :** `domains:pay` --- ## Exemple PHP (résumé) ```php $quote = $client->get('domains/quote', ['query' => ['domain' => 'monsite.com', 'years' => 1]]); $order = $client->post('domains', [ 'domain' => 'monsite.com', 'years' => 1, 'registrant' => [ /* … */ ], ]); $pay = $client->post("domain-orders/{$order['data']['order_uuid']}/pay", [ 'callback_url' => 'https://mon-app.test/ok', ]); // Rediriger l’utilisateur vers $pay['data']['checkout_url'] ```