Intègre FlashPay dans ton application.
Crée une demande de paiement mobile money depuis ton serveur, puis suis son statut ou reçois une notification. FlashPay choisit automatiquement le mode de paiement selon le pays du client.
Démarrage
- Crée une clé de test dans l’espace Développeur (préfixe
fp_test_). - Envoie tes premières collectes en test : aucun argent n’est débité.
- Quand ton compte est vérifié, crée une clé live (préfixe
fp_live_) et remplace la clé de test dans ton serveur.
Base de l’API : https://f-lashpay.vercel.app
Obtenir une clé
Crée une clé dans l’espace Développeur, en lui donnant un nom qui identifie ton intégration. La clé secrète n’est affichée qu’une seule fois : copie-la immédiatement.
Authentification
Chaque requête porte ta clé dans l’en-tête X-FlashPay-Key.
X-FlashPay-Key: fp_test_…
Créer une collecte
Envoie une requête POST https://f-lashpay.vercel.app/api/v1/collections.
| Champ | Obligatoire | Description |
|---|---|---|
country_code | Oui | Code pays à deux lettres (voir « Pays et modes »). |
amount | Oui | Montant dans la devise du pays, strictement supérieur à zéro. |
name | Oui | Nom du payeur. |
mobile | Oui | Numéro mobile money du payeur, sans l’indicatif pays. |
payment_method | Oui en live | Opérateur mobile money (voir « Moyens de paiement »). |
transaction_id | Non | Ta référence unique. Sans elle, FlashPay en génère une. Une référence déjà utilisée renvoie 409. |
checkout | Non | Mettre hosted pour obtenir une page de paiement hébergée (checkout_url). |
email | Non | E-mail du payeur, transmis au prestataire quand il le demande. |
Pays en paiement direct (RDC, Burkina Faso, Bénin, Mali, Togo)
Le client reste sur ton site et valide la demande sur son téléphone. Aucune redirection n’est nécessaire : suis le statut avec « Suivre le statut ».
const response = await fetch('https://f-lashpay.vercel.app/api/v1/collections', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-FlashPay-Key': process.env.FLASHPAY_KEY,
},
body: JSON.stringify({
country_code: 'CD',
amount: 25000,
mobile: '0812345678',
name: 'Awa Sossou',
payment_method: 'ORANGE',
transaction_id: 'CMD-1042',
}),
});
const result = await response.json();Pays en paiement hébergé (Cameroun, Congo, Sénégal, Côte d’Ivoire, Nigeria, Rwanda, Ghana, Kenya)
Ajoute checkout: "hosted" et redirige ton client vers data.checkout_url. Il y choisit son opérateur et valide sur son téléphone.
const response = await fetch('https://f-lashpay.vercel.app/api/v1/collections', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-FlashPay-Key': process.env.FLASHPAY_KEY,
},
body: JSON.stringify({
country_code: 'CM',
amount: 25000,
mobile: '670000000',
name: 'Client',
payment_method: 'MTN',
checkout: 'hosted',
transaction_id: 'CMD-1043',
}),
});
const { data } = await response.json();
// Redirige ton client vers data.checkout_urlfp_test_ ne contacte aucun prestataire. La réponse contient mode: "test" et une référence commençant par FPTEST-.Suivre le statut
Interroge GET https://f-lashpay.vercel.app/api/v1/collections/{transaction_id} avec ta clé. Tant que le statut est pending, attends quelques secondes avant de réessayer. Le statut final ne change plus.
| Statut | Signification |
|---|---|
pending | Demande envoyée, en attente de la validation du client. |
successful | Paiement reçu. Tu peux livrer la commande. |
failed | Paiement refusé ou échoué. |
cancelled | Paiement annulé par le client. |
expired | Le client n’a pas validé à temps. |
const response = await fetch('https://f-lashpay.vercel.app/api/v1/collections/CMD-1042', {
headers: { 'X-FlashPay-Key': process.env.FLASHPAY_KEY },
});
const { data } = await response.json();
// data.status : pending | successful | failed | cancelled | expiredMoyens de paiement
Avant de proposer un opérateur à ton client, demande la liste acceptée pour son pays :
GET https://f-lashpay.vercel.app/api/v1/payment-methods?country_code=CD
La réponse contient payment_methods, une liste de valeurs à envoyer telles quelles dans payment_method.
Notifications
Quand une collecte est payée, FlashPay envoie une requête POST à l’adresse de notification configurée dans ton espace Développeur.
| En-tête | Contenu |
|---|---|
X-FlashPay-Timestamp | Date d’envoi en secondes (Unix). |
X-FlashPay-Signature | HMAC-SHA256 en hexadécimal de timestamp + "." + corps brut, signé avec ton secret de notification. |
{
"event": "transaction.successful",
"created_at": "2026-11-10T11:30:00.000Z",
"data": {
"transaction_id": "CMD-1042",
"status": "successful",
"amount": 25000,
"currency_code": "XOF",
"country_code": "BJ",
"payment_method": "MTN",
"environment": "live"
}
}import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody : le corps brut reçu, sans le transformer en JSON avant la vérification.
function isGenuine(rawBody, timestamp, signature, secret) {
const age = Math.abs(Date.now() / 1000 - Number(timestamp));
if (!Number.isFinite(age) || age > 300) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.' + rawBody)
.digest('hex');
const a = Buffer.from(signature);
const b = Buffer.from(expected);
return a.length === b.length && timingSafeEqual(a, b);
}transaction.successful est envoyé pour le moment. Pour les échecs, interroge le statut.Pays et modes
FlashPay choisit le mode selon le pays du client. Tu n’as rien à configurer.
| Pays | Code | Mode |
|---|---|---|
| République démocratique du Congo | CD | Direct |
| Burkina Faso | BF | Direct |
| Bénin | BJ | Direct |
| Mali | ML | Direct |
| Togo | TG | Direct |
| Cameroun | CM | Hébergé |
| Congo-Brazzaville | CG | Hébergé |
| Sénégal | SN | Hébergé |
| Côte d’Ivoire | CI | Hébergé |
| Nigeria | NG | Hébergé |
| Rwanda | RW | Hébergé |
| Ghana | GH | Hébergé |
| Kenya | KE | Hébergé |
checkout_url.Frais
pass_digital_charge: false, le payeur ne règle aucun frais. La commission FlashPay est de 6 % du montant demandé, prélevée sur ce que tu reçois.Codes d’erreur
| Code | Signification | Action |
|---|---|---|
| 400 | Données invalides, pays non pris en charge, ou payment_method absent en live. | Vérifie le corps de la requête. |
| 401 | Clé absente, invalide ou révoquée. | Vérifie l’en-tête X-FlashPay-Key. |
| 404 | Collecte introuvable pour ce compte. | Vérifie la référence transaction_id. |
| 409 | Référence déjà utilisée. | Envoie une référence unique. |
| 429 | Plus de 60 requêtes par minute avec la même clé. | Attends 60 secondes (en-tête Retry-After). |
| 502 | Le prestataire a refusé la demande (mode hébergé). | Réessaie avec un autre opérateur. |
| 503 | Paiements live non ouverts, ou service indisponible. | Réessaie plus tard ou contacte le support. |
Passer en production
- Ton compte est vérifié dans l’espace Développeur.
- Tu as créé une clé
fp_live_et remplacé la clé de test sur ton serveur. - Tu as testé au moins une collecte dans chaque mode utilisé par tes clients (direct et hébergé).
- Ton endpoint de notification répond 2xx et vérifie la signature.