Documentation API Université d'Abomey-Calavi (UAC) - Frais de Scolarité

Spécifications d'intégration et payloads exacts pour la consultation, le calcul des frais et le paiement des frais de scolarité UAC sur l'environnement PAP.

Présentation

L'API Université d'Abomey-Calavi (UAC) permet d'interroger le dossier de scolarité d'un étudiant et d'effectuer le paiement sécurisé des frais d'inscription ou pénalités via la passerelle B-MO.

URL de Base (selon l'environnement sélectionné) :

  • PAP (Pré-production / Défaut) : https://svc.pap.bestcash.me/external
  • TEST (Sandbox) : https://svc.test.bestcash.me/external
  • LIVE (Production) : https://svc.bmo.bestcash.me/external

Vous pouvez basculer d'un environnement à un autre à tout moment depuis le menu déroulant en haut des consoles d'essai <ApiPlayground /> ci-dessous.


Authentification

L'authentification s'effectue en transmettant les en-têtes HTTP suivants dans chaque requête :

  • X-Auth-ApiKey : Votre clé d'API partenaire (ex: +2290196666262)
  • X-Auth-ApiSecret : Votre secret d'API partenaire (ex: y7MwWuWeQORtpA==)
  • Content-Type : application/json

En cas d'absence ou d'invalidité de ces en-têtes, la passerelle renvoie une erreur HTTP 401 Unauthorized.


Endpoints & Console d'essai

1. Récupération des informations de l'étudiant (POST /external/universities/uac/invoices)

Permet de consulter le dossier de scolarité d'un étudiant, son statut et le montant dû (frais d'inscription ou pénalités).

  • Méthode : POST
  • URL : /external/universities/uac/invoices

Tester la recherche d'étudiant UAC

Consultez les informations et la facture de scolarité pour un étudiant UAC.

Authentification (En-têtes B-MO)
Paramètres d'URL / Query Parameters (0)

Aucun paramètre d'URL configuré.

Corps de la Requête (JSON Body)

Paramètres du corps JSON (Body)

ChampTypeObligatoireDescription
studentMatriculestringOuiMatricule de l'étudiant (ex: "10702514")
academicYearstringOuiAnnée académique au format YYYY-YYYY (ex: "2025-2026")
studyYearstringOuiAnnée d'étude (ex: "M2", "L1", "L3")

Exemple de corps de requête (JSON)

{
  "studentMatricule": "10702514",
  "academicYear": "2025-2026",
  "studyYear": "M2"
}

Exemple de réponse HTTP 200

[
  {
    "matricule": "10702514",
    "firstName": "PAUL",
    "lastName": "TOTO",
    "phoneNumber": "97257361",
    "academicYear": "2025-2026",
    "school": "FLASH",
    "studyYear": "M2",
    "nationality": "BJ (Benin)",
    "studentStatus": "NORM",
    "amount": 108989.0,
    "paymentCategory": "inscription"
  }
]

Note : Le champ paymentCategory renvoie la catégorie de frais due (inscription ou penalite). Cette valeur est requise lors de l'exécution du paiement.


2. Calcul du coût de l'opération (GET /external/universities/uac/cost)

Permet de calculer les frais de traitement applicables au règlement de la scolarité.

  • Méthode : GET
  • URL : /external/universities/uac/cost
  • Paramètre de requête (Query Param) : amount (ex: 108989)

Tester le calcul du coût UAC

Calculez les frais d'opération liés au montant de la scolarité.

Authentification (En-têtes B-MO)
Paramètres d'URL / Query Parameters (1)

Paramètres de requête

ParamètreTypeObligatoireDescription
amountnumberOuiMontant de la facture de scolarité à régler

Exemple de réponse HTTP 200

{
  "cost": 1000.0,
  "targetMonetaryArea": {
    "currencyShortName": "F CFA",
    "currencyCode": "XOF"
  }
}

3. Paiement des frais de scolarité (POST /external/universities/uac/operation)

Exécute le règlement des frais de scolarité d'un étudiant UAC et confirme la transaction.

  • Méthode : POST
  • URL : /external/universities/uac/operation

Tester le paiement de scolarité UAC

Effectuez le règlement direct des frais de scolarité UAC.

Authentification (En-têtes B-MO)
Paramètres d'URL / Query Parameters (0)

Aucun paramètre d'URL configuré.

Corps de la Requête (JSON Body)

Paramètres du corps JSON (Body)

ChampTypeObligatoireDescription
amountnumberOuiMontant exact de la scolarité (ex: 108989)
matriculestringOuiMatricule de l'étudiant (ex: "10702514")
academicYearstringOuiAnnée académique (ex: "2025-2026")
studyYearstringOuiNiveau d'étude (ex: "M2")
paymentCategorystringOuiCatégorie de paiement ("inscription" ou "penalite")
externalReferencestringOuiRéférence unique de transaction générée par le partenaire

Exemple de corps de requête (JSON)

{
  "amount": 108989,
  "matricule": "10702514",
  "academicYear": "2025-2026",
  "studyYear": "M2",
  "paymentCategory": "inscription",
  "externalReference": "UAC-REF-2026-001"
}

Exemple de réponse HTTP 200 / 201

{
  "prefixedAmount": "108 989 F CFA",
  "prefixedOperationCost": "1 000 F CFA",
  "operationCode": "",
  "status": "CONFIRMED",
  "operationCost": 1000.0,
  "amount": 108989.0,
  "operationType": "SCHOOL_FEES",
  "reference": "UACSF20260724162911228",
  "creationDate": "2026-07-24T16:29:10+00:00",
  "matricule": "10702514",
  "firstName": "PAUL",
  "lastName": "TOTO",
  "phoneNumber": "97257361",
  "academicYear": "2025-2026",
  "school": "FLASH",
  "studyYear": "M2",
  "nationality": "BJ (Benin)",
  "paymentCategory": "inscription"
}

4. Vérification du statut de l'opération (GET /external/thirdparty/operation)

Permet d'interroger le statut final d'une transaction à partir de sa référence partenaire (externalReference) ou interne (reference).

  • Méthode : GET
  • URL : /external/thirdparty/operation
  • Paramètres de requête (Query Params) : externalReference ou reference

Tester le suivi de statut

Vérifiez l'état d'un paiement UAC via sa référence.

Authentification (En-têtes B-MO)
Paramètres d'URL / Query Parameters (1)

Exemple de réponse HTTP 200

{
  "status": "CONFIRMED",
  "operationCost": 1000.0,
  "amount": 108989.0,
  "operationType": "SCHOOL_FEES",
  "reference": "UACSF20260724162911228",
  "creationDate": "2026-07-24T16:29:10+00:00",
  "externalReference": "UAC-REF-2026-001"
}

Exemple de Code d'Intégration Complet

Voici un exemple d'intégration complet en Node.js (JavaScript Async/Await) illustrant la chaîne d'appels : Recherche Facture -> Calcul Coût -> Paiement -> Vérification du Statut.

Node.js (Axios)

const axios = require('axios');

// Configuration de l'environnement PAP
const BASE_URL = 'https://svc.pap.bestcash.me/external';
const API_KEY = '+2290196666262';
const API_SECRET = 'y7MwWuWeQORtpA==';

const client = axios.create({
  baseURL: BASE_URL,
  headers: {
    'X-Auth-ApiKey': API_KEY,
    'X-Auth-ApiSecret': API_SECRET,
    'Content-Type': 'application/json'
  }
});

async function processUacSchoolFeesPayment() {
  try {
    // 1. Récupération des informations de l'étudiant
    console.log('1. Recherche de la facture étudiant...');
    const invoiceRes = await client.post('/universities/uac/invoices', {
      studentMatricule: '10702514',
      academicYear: '2025-2026',
      studyYear: 'M2'
    });

    const studentInfo = invoiceRes.data[0];
    console.log(`Étudiant trouvé : ${studentInfo.firstName} ${studentInfo.lastName}`);
    console.log(`Montant dû : ${studentInfo.amount} XOF (${studentInfo.paymentCategory})`);

    // 2. Calcul du coût de l'opération
    console.log('\n2. Calcul des frais d\'opération...');
    const costRes = await client.get(`/universities/uac/cost?amount=${studentInfo.amount}`);
    console.log(`Coût de l'opération : ${costRes.data.cost} ${costRes.data.targetMonetaryArea.currencyCode}`);

    // 3. Exécution du paiement
    const externalReference = `UAC-REF-${Date.now()}`;
    console.log(`\n3. Exécution du paiement (Réf: ${externalReference})...`);
    
    const paymentRes = await client.post('/universities/uac/operation', {
      amount: studentInfo.amount,
      matricule: studentInfo.matricule,
      academicYear: studentInfo.academicYear,
      studyYear: studentInfo.studyYear,
      paymentCategory: studentInfo.paymentCategory,
      externalReference: externalReference
    });

    console.log(`Paiement effectué avec succès ! Statut: ${paymentRes.data.status}`);
    console.log(`Référence B-MO: ${paymentRes.data.reference}`);

    // 4. Vérification du statut de l'opération
    console.log('\n4. Vérification du statut de la transaction...');
    const statusRes = await client.get(`/thirdparty/operation?externalReference=${externalReference}`);
    console.log('Statut de la transaction:', statusRes.data);

  } catch (error) {
    if (error.response) {
      console.error('Erreur API B-MO:', error.response.status, error.response.data);
    } else {
      console.error('Erreur réseau / système:', error.message);
    }
  }
}

processUacSchoolFeesPayment();

Python (Requests)

import requests
import time

BASE_URL = "https://svc.pap.bestcash.me/external"
HEADERS = {
    "X-Auth-ApiKey": "+2290196666262",
    "X-Auth-ApiSecret": "y7MwWuWeQORtpA==",
    "Content-Type": "application/json"
}

# 1. Recherche de la facture
invoice_payload = {
    "studentMatricule": "10702514",
    "academicYear": "2025-2026",
    "studyYear": "M2"
}
resp = requests.post(f"{BASE_URL}/universities/uac/invoices", json=invoice_payload, headers=HEADERS)
student_info = resp.json()[0]
print("Étudiant trouvé:", student_info["firstName"], student_info["lastName"])

# 2. Calcul du coût
cost_resp = requests.get(f"{BASE_URL}/universities/uac/cost", params={"amount": student_info["amount"]}, headers=HEADERS)
print("Frais d'opération:", cost_resp.json()["cost"], "XOF")

# 3. Effectuer le paiement
ext_ref = f"UAC-REF-{int(time.time())}"
payment_payload = {
    "amount": student_info["amount"],
    "matricule": student_info["matricule"],
    "academicYear": student_info["academicYear"],
    "studyYear": student_info["studyYear"],
    "paymentCategory": student_info["paymentCategory"],
    "externalReference": ext_ref
}
pay_resp = requests.post(f"{BASE_URL}/universities/uac/operation", json=payment_payload, headers=HEADERS)
print("Résultat Paiement:", pay_resp.json())

# 4. Vérification du statut
status_resp = requests.get(f"{BASE_URL}/thirdparty/operation", params={"externalReference": ext_ref}, headers=HEADERS)
print("Statut final:", status_resp.json())

cURL (Commandes CLI)

# 1. Recherche de facture
curl -X POST "https://svc.pap.bestcash.me/external/universities/uac/invoices" \
     -H "X-Auth-ApiKey: +2290196666262" \
     -H "X-Auth-ApiSecret: y7MwWuWeQORtpA==" \
     -H "Content-Type: application/json" \
     -d '{
       "studentMatricule": "10702514",
       "academicYear": "2025-2026",
       "studyYear": "M2"
     }'

# 2. Calcul du coût
curl -X GET "https://svc.pap.bestcash.me/external/universities/uac/cost?amount=108989" \
     -H "X-Auth-ApiKey: +2290196666262" \
     -H "X-Auth-ApiSecret: y7MwWuWeQORtpA==" \
     -H "Content-Type: application/json"

# 3. Paiement de la scolarité
curl -X POST "https://svc.pap.bestcash.me/external/universities/uac/operation" \
     -H "X-Auth-ApiKey: +2290196666262" \
     -H "X-Auth-ApiSecret: y7MwWuWeQORtpA==" \
     -H "Content-Type: application/json" \
     -d '{
       "amount": 108989,
       "matricule": "10702514",
       "academicYear": "2025-2026",
       "studyYear": "M2",
       "paymentCategory": "inscription",
       "externalReference": "UAC-REF-2026-001"
     }'

# 4. Vérification du statut
curl -X GET "https://svc.pap.bestcash.me/external/thirdparty/operation?externalReference=UAC-REF-2026-001" \
     -H "X-Auth-ApiKey: +2290196666262" \
     -H "X-Auth-ApiSecret: y7MwWuWeQORtpA==" \
     -H "Content-Type: application/json"

Autres cas de figure & Gestion des erreurs

  • Double soumission (REQUEST ALREADY SUBMITTED) : Si les frais de scolarité pour un matricule, une année académique et une année d'étude ont déjà été réglés et confirmés, toute nouvelle tentative de paiement entraînera une erreur indiquant que l'opération existe déjà.
  • Erreur de formulaire / Champs obligatoires : Si l'un des paramètres du tuple (matricule, academicYear, studyYear, amount, paymentCategory, externalReference) est manquant ou invalide, l'API renvoie une erreur de validation.