Documentation J+SERVICES Guides Référence API

Brief frontend : liens de paiement et portefeuille du technicien (Expert Hub)

Date : 2026-10-10 · Destinataire : dev frontend apps/expert-hub · API : https://live.jmoai.net Statut backend : lot 1 en production depuis le 2026-10-10. Les routes ci-dessous sont actives. Le lot 2 (retrait, achat de licence avec le solde) suit.

Ce brief remplace la « Note de cadrage : système de génération de liens de paiement & portefeuilles techniciens ».


1. Le modèle (décision du propriétaire)

J+SERVICES vend, le technicien réalise.

Deux types de lien :

link_type Usage Ce qui est crédité au technicien
INVOICE facture d’un service : intervention, installation, maintenance, matériel… montant moins la commission de la catégorie (fee_pct)
LICENSE_SALE encaisser le prix d’une licence que le technicien livrera lui-même 100 % du montant

La commission dépend de la catégorie, et elle est figée au moment de la création du lien.

2. Corrections par rapport à votre note

Votre note Réalité
devise XAF XOF (F CFA BCEAO)
expert_id dans le corps interdit : l’identité vient du jeton. Un technicien ne crée des liens que pour lui-même
Campay, ou un agrégateur choisi par le front c’est le backend qui choisit : compte J+SERVICES (FedaPay aujourd’hui, FeexPay ensuite). Le front n’appelle jamais un agrégateur
POST /api/v1/webhooks/payments pas de route webhook à appeler ni à connaître côté front
« vérifier la signature du webhook » c’est l’affaire du backend : il relit le statut chez l’agrégateur, montant compris
tables expert_wallets / wallet_transactions registre comptable existant, en partie double. Le front lit seulement GET /api/v1/expert/wallet
Socket.io pas de temps réel au lot 1 : un e-mail et une notification push. Actualisez le solde à l’ouverture de l’écran

3. Authentification

Mêmes règles que les autres routes de l’espace technicien :

Sans identité valide, la réponse est 401.

4. Routes

Catégories de service

GET /api/v1/expert/billing/categories

{
  "success": true,
  "data": [{ "code": "INSTALLATION", "label": "Installation", "platform_fee_pct": 15 }]
}

Affichez le taux à côté de chaque catégorie, avec le net calculé en direct : « Vous recevrez 8 500 F sur 10 000 F ».

Créer un lien

POST /api/v1/expert/billing/payment-links

{
  "link_type": "INVOICE",
  "category_code": "INSTALLATION",
  "amount": 15000,
  "description": "Installation routeur MikroTik hEX lite",
  "customer_email": "client@example.com",
  "customer_phone": "22997000000",
  "expires_in_hours": 72
}

Réponse 201 :

{
  "success": true,
  "data": {
    "id": "…",
    "url": "https://live.jmoai.net/api/v1/pay/expert/…",
    "link_type": "INVOICE",
    "amount": 15000,
    "fee_pct": 15,
    "net_for_expert": 12750
  }
}

Proposez Copier, WhatsApp et QR code sur url. Ne construisez jamais l’URL vous-même.

Mes liens

GET /api/v1/expert/billing/payment-links?page=1&limit=50 Statuts possibles : OPEN, PAID, EXPIRED, CANCELED.

Statut Libellé conseillé
OPEN En attente de paiement
PAID Payé (avec la date)
EXPIRED Expiré
CANCELED Annulé

Mon portefeuille

GET /api/v1/expert/wallet → solde disponible en XOF, puis l’historique des mouvements : crédits par lien payé et, plus tard, les débits.

5. Ce que voit le client du technicien

Le lien ouvre une page de paiement « Encaissé par J+SERVICES », avec la description et le montant. Les coordonnées du technicien n’y apparaissent jamais. Après le paiement, le technicien reçoit :

6. À venir (lot 2), ne pas développer encore

Prévoyez simplement deux boutons inactifs, « Générer une licence avec mon solde » et « Retirer », marqués « Bientôt ».

7. Codes d’erreur à gérer

HTTP Cas Afficher
400 montant hors bornes, catégorie inconnue ou inactive, description trop longue le message renvoyé
401 session absente ou expirée renvoyer vers la connexion
403 compte non technicien « Candidature en cours »
429 trop de liens créés en peu de temps « Réessayez dans un instant »

Le contrat détaillé, avec tous les champs, est publié ici : https://doc.jmoai.net/CONTRAT-API-LIENS-TECHNICIEN-PORTEFEUILLE (sur le serveur : ssh root@161.97.64.197 'cat /root/projects/jservices-api/docs/CONTRAT-API-LIENS-TECHNICIEN-PORTEFEUILLE.md'). En cas d’écart avec ce brief, c’est le contrat qui fait foi.