Contrat API — liens technicien et portefeuille
Devise unique : XOF. Le technicien est identifié par son resellers.id, porté dans le portefeuille comme compte EXPERT.
Routes technicien
POST /api/v1/expert/billing/payment-links
Corps :
{
"link_type": "INVOICE",
"category_code": "INTERVENTION",
"amount": 10000,
"description": "Installation routeur",
"customer_email": "client@example.com",
"customer_phone": "+229...",
"expires_in_hours": 72
}
Réponse :
{
"success": true,
"data": {
"id": "uuid",
"url": "https://live.jmoai.net/api/v1/pay/expert/uuid",
"link_type": "INVOICE",
"amount": 10000,
"fee_pct": 15,
"net_for_expert": 8500
}
}
LICENSE_SALE ne prend pas category_code et crédite 100 % du montant.
GET /api/v1/expert/billing/payment-links liste uniquement les liens du technicien authentifié.
GET /api/v1/expert/wallet renvoie le solde et l’historique du compte EXPERT.
GET /api/v1/expert/billing/categories renvoie les catégories actives et leur taux.
Page publique
GET /api/v1/pay/expert/:id
La page affiche la description, le montant et la mention « Encaissé par J+SERVICES ». Elle ne montre jamais l’e-mail ni le téléphone du technicien. Le montant utilisé pour FedaPay vient toujours de la ligne expert_payment_links.
Webhook
Le paiement FedaPay porte :
{
"type": "EXPERT_PAYMENT_LINK",
"expert_payment_link_id": "uuid"
}
Le backend relit la transaction chez FedaPay avant tout crédit : statut approved, montant identique, devise XOF. Il n’y a pas de signature côté FeexPay dans ce lot ; quand FeexPay sera ajouté, la vérification se fera par relecture du statut chez le prestataire, pas par confiance dans le corps reçu.