Documentation API Intech V2
Documentation complète version 1.0.0 - Intégrez facilement les services financiers et de messagerie dans vos applications avec l'API REST Intech.
Téléchargez la collection Postman complète : Intech API V2.postman_collection.json
Assistance IA pour l'intégration
Besoin d'aide personnalisée ? Utilisez des assistants IA comme Claude ou ChatGPT pour vous guider dans l'intégration Intech API.
Prompt recommandé pour l'IA
Copiez et collez ce prompt dans Claude, ChatGPT ou tout autre assistant IA :
Ce prompt garantit que l'IA utilisera uniquement la documentation officielle Intech API comme source d'information.
Could you please help me implement Intech API integration in my backend and frontend application? I need assistance with the following:
CRITICAL INSTRUCTION: Base ALL your recommendations EXCLUSIVELY on these two sources:
- The official Intech API documentation at https://doc.intech.sn/doc_intech_api.php
- The Intech API Postman collection at https://doc.intech.sn/Intech%20API%20V2.postman_collection.json
DO NOT use any other sources of information beyond these two specified resources.
Please help me with:
1. Setting up the Intech API in my backend (including required packages, controller setup, and environment configuration)
2. Sample code for handling cash-in, cash-out, bill payments, and WhatsApp messaging requests
3. Implementation of callbacks/webhooks with SHA256 verification in my backend
4. Frontend integration for transaction status checking and user interface
5. Best practices for secure API integration and error handling
6. Specific code examples for different service types (CASHIN, CASHOUT, CREDIT_TELEPHONIQUE, BILL_PAY, MESSENGING_SMS)
Please first ask me about my backend and frontend technology stack to provide the most accurate implementation guidance.
If any information is not available in the specified documentation sources, please explicitly state this rather than using other sources or making assumptions.
Avantages de l'assistance IA
- Code personnalisé pour votre stack technologique
- Explications détaillées étape par étape
- Résolution de problèmes spécifiques
- Meilleures pratiques de sécurité
- Aide pour les callbacks/webhooks
Services supportés
- Cash-in / Cash-out
- Paiement de factures
- Crédit téléphonique
- WhatsApp Messaging
- Services MoneyGram
- Callbacks sécurisés SHA256
Canaux d'intégration
Rejoignez notre communauté pour obtenir de l'aide et des mises à jour :
Prérequis
- Avoir un compte développeur Intech valide sur le portail développeur
- Générer une clé API depuis votre tableau de bord
- La clé API doit être envoyée avec chaque appel API
Authentification
L'authentification varie selon le type de requête :
Type de requête | Méthode d'authentification | Paramètre/Header |
---|---|---|
GET |
Header | Secretkey: votre_cle_api |
POST |
Body | "apiKey": "votre_cle_api" |
Exemple GET
curl -X GET "https://api.intech.sn/api-services/services" \
-H "Secretkey: xxxxxx"
Exemple POST
{
"apiKey": "xxxxxx",
"phone": "772457199",
"amount": 1000,
"codeService": "WAVE_SN_API_CASH_IN"
}
URL de base
https://api.intech.sn
Notes importantes
Cette API fournit uniquement l'API WhatsApp pour la messagerie (avec support des pièces jointes média : mp4, mp3, images...).
Si vous avez besoin de l'API SMS, utilisez notre plateforme SMS dédiée :
• Documentation : SMS API Documentation
• Plateforme : https://intechsms.sn/login
Configurez le timeout de votre client HTTP à minimum 60 secondes.
Pour toutes les requêtes, l'API retourne un code HTTP 200 ou 201 avec des données JSON décrivant le résultat de la requête.
Votre URL de callback doit retourner un code de statut 200. Tout autre statut est considéré comme un échec et le callback sera renvoyé.
Variables d'environnement
Variable | Valeur | Description |
---|---|---|
base_url |
https://api.intech.sn | URL de base de l'API |
api_key |
Votre clé API | Clé d'authentification |
Sécurité Avancée (Optionnelle)
En plus de l'authentification par clé API et du hash SHA256 par défaut, Intech API propose des fonctionnalités de sécurité avancées optionnelles pour les partenaires qui nécessitent un niveau de sécurité renforcé.
Par défaut, Intech API utilise un hash SHA256 pour vérifier l'intégrité des callbacks (voir section Callbacks/Webhooks). Les fonctionnalités décrites ci-dessous (HMAC + SSL Pinning) sont optionnelles et peuvent être activées à la demande du client si leur niveau de sécurité l'exige.
Signature HMAC
La signature HMAC (Hash-based Message Authentication Code) est une fonctionnalité optionnelle qui permet de garantir l'intégrité et l'authenticité des requêtes échangées entre votre application et l'API Intech. Elle vient en complément du hash SHA256 par défaut.
Principe de fonctionnement
- Clé HMAC partagée : Une clé secrète est partagée de manière sécurisée entre Intech et votre application
- Signatures bidirectionnelles :
- Vos requêtes vers l'API Intech doivent inclure une signature HMAC
- Les callbacks de l'API vers votre application incluent également une signature HMAC
- Validation temporelle : Les signatures incluent un timestamp pour éviter les attaques de replay
Configuration des headers pour vos requêtes
Lorsque la signature HMAC est activée, vos requêtes POST doivent inclure les headers suivants :
Header | Description | Exemple |
---|---|---|
Hmac-Signature |
Signature HMAC-SHA256 calculée | abc123def456... |
Timestamp |
Timestamp Unix en millisecondes | 1699548600000 |
apiKey |
Votre clé API (dans le body de la requête) | xxxxxx |
Calcul de la signature HMAC
La signature HMAC est calculée selon cette formule :
hmacData = httpMethod + ":" + timestamp + ":" + jsonBody
hmacSignature = HMAC-SHA256(hmacData, hmacSecretKey)
Exemple de calcul en JavaScript/Node.js
const crypto = require('crypto');
function calculateHMACSignature(httpMethod, timestamp, requestBody, hmacSecretKey) {
// Convertir le body en JSON string
const bodyString = JSON.stringify(requestBody);
// Construire la chaîne à signer
const hmacData = `${httpMethod}:${timestamp}:${bodyString}`;
// Calculer la signature HMAC-SHA256
const hmacSignature = crypto
.createHmac('sha256', hmacSecretKey)
.update(hmacData)
.digest('hex');
return hmacSignature;
}
// Exemple d'utilisation
const httpMethod = 'POST';
const timestamp = Date.now().toString();
const requestBody = {
apiKey: 'votre_cle_api',
phone: '221777777777',
amount: 1000,
codeService: 'FREE_SN_WALLET_CASH_IN'
};
const hmacSecretKey = 'votre_cle_hmac_secrete';
const signature = calculateHMACSignature(httpMethod, timestamp, requestBody, hmacSecretKey);
console.log('HMAC Signature:', signature);
Exemple de requête avec signature HMAC
curl -X POST "https://api.intech.sn/api-services/operation" \
-H "Content-Type: application/json" \
-H "Hmac-Signature: abc123def456789..." \
-H "Timestamp: 1699548600000" \
-d '{
"apiKey": "votre_cle_api",
"phone": "221777777777",
"amount": 1000,
"codeService": "FREE_SN_WALLET_CASH_IN",
"externalTransactionId": "TXN_001",
"urlIpn": "https://votre-site.com/callback"
}'
Validation des callbacks avec HMAC (si activé)
Important : Par défaut, les callbacks Intech utilisent uniquement un hash SHA256 pour la sécurité (voir section Callbacks/Webhooks). La signature HMAC pour les callbacks est une fonctionnalité optionnelle qui doit être activée sur demande.
Si la signature HMAC est activée pour votre compte, les callbacks incluront une signature HMAC que vous devez valider :
// Exemple de validation d'un callback reçu
function validateCallbackHMAC(receivedSignature, timestamp, callbackBody, hmacSecretKey) {
// Vérifier que le timestamp n'est pas expiré (5 minutes par défaut)
const now = Date.now();
const requestTime = parseInt(timestamp);
const maxAge = 5 * 60 * 1000; // 5 minutes en millisecondes
if (now - requestTime > maxAge) {
throw new Error('Timestamp expired');
}
// Calculer la signature attendue
const httpMethod = 'POST';
const bodyString = JSON.stringify(callbackBody);
const hmacData = `${httpMethod}:${timestamp}:${bodyString}`;
const expectedSignature = crypto
.createHmac('sha256', hmacSecretKey)
.update(hmacData)
.digest('hex');
// Comparaison sécurisée
if (expectedSignature !== receivedSignature) {
throw new Error('Invalid HMAC signature');
}
return true;
}
Les signatures HMAC incluent une validation temporelle. Par défaut, une requête est considérée comme expirée après 5 minutes. Assurez-vous que l'horloge de votre serveur est synchronisée.
SSL Certificate Pinning
Le SSL Certificate Pinning (épinglage de certificat SSL) ajoute une couche de sécurité supplémentaire pour les callbacks en vérifiant l'empreinte de la clé publique du certificat SSL de votre serveur.
Principe de fonctionnement
- Empreinte de clé publique : Intech stocke l'empreinte SHA256 de la clé publique de votre certificat SSL
- Vérification lors des callbacks : Chaque callback vérifie que le certificat SSL correspond à l'empreinte stockée
- Protection contre l'interception : Empêche les attaques man-in-the-middle même avec des certificats SSL valides
Configuration
Pour activer le SSL Certificate Pinning :
- Fournissez l'empreinte SHA256 de la clé publique de votre certificat SSL
- L'équipe technique Intech configure cette empreinte pour votre compte
- Tous les callbacks futurs vérifieront automatiquement cette empreinte
Comment obtenir l'empreinte de votre certificat
# Méthode 1: En ligne de commande avec OpenSSL
openssl s_client -servername votre-domaine.com -connect votre-domaine.com:443 < /dev/null 2>/dev/null | \
openssl x509 -pubkey -noout | \
openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -binary | \
openssl enc -base64
# Méthode 2: Depuis un fichier de certificat
openssl x509 -pubkey -noout -in certificat.pem | \
openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -binary | \
openssl enc -base64
Exemple en Node.js pour obtenir l'empreinte
const https = require('https');
const crypto = require('crypto');
function getCertificateFingerprint(hostname, port = 443) {
return new Promise((resolve, reject) => {
const options = {
hostname: hostname,
port: port,
method: 'GET',
rejectUnauthorized: false
};
const req = https.request(options, (res) => {
const cert = res.socket.getPeerCertificate();
if (cert && cert.pubkey) {
const fingerprint = crypto
.createHash('sha256')
.update(cert.pubkey)
.digest('base64');
resolve(fingerprint);
} else {
reject(new Error('Unable to get certificate'));
}
});
req.on('error', reject);
req.end();
});
}
// Utilisation
getCertificateFingerprint('votre-domaine.com')
.then(fingerprint => {
console.log('Empreinte SHA256:', fingerprint);
})
.catch(console.error);
Lors du renouvellement de votre certificat SSL, n'oubliez pas de communiquer la nouvelle empreinte à l'équipe Intech pour éviter l'échec des callbacks.
Exemple complet avec sécurité renforcée
Voici un exemple d'intégration complète utilisant à la fois la signature HMAC et le SSL Certificate Pinning :
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());
// Configuration
const HMAC_SECRET_KEY = 'votre_cle_hmac_secrete';
const EXPECTED_SSL_FINGERPRINT = 'votre_empreinte_ssl_base64';
// Middleware de validation HMAC pour les callbacks
function validateHMACSignature(req, res, next) {
const receivedSignature = req.headers['hmac-signature'];
const timestamp = req.headers['timestamp'];
if (!receivedSignature || !timestamp) {
return res.status(400).json({ error: 'Missing HMAC signature or timestamp' });
}
// Vérifier que le timestamp n'est pas expiré
const now = Date.now();
const requestTime = parseInt(timestamp);
const maxAge = 5 * 60 * 1000; // 5 minutes
if (now - requestTime > maxAge) {
return res.status(400).json({ error: 'Timestamp expired' });
}
// Calculer la signature attendue
const httpMethod = req.method;
const bodyString = JSON.stringify(req.body);
const hmacData = `${httpMethod}:${timestamp}:${bodyString}`;
const expectedSignature = crypto
.createHmac('sha256', HMAC_SECRET_KEY)
.update(hmacData)
.digest('hex');
if (expectedSignature !== receivedSignature) {
return res.status(403).json({ error: 'Invalid HMAC signature' });
}
next();
}
// Endpoint de callback sécurisé
app.post('/intech-callback', validateHMACSignature, (req, res) => {
console.log('Callback reçu et validé:', req.body);
// Traiter le callback...
// Retourner un statut 200 pour confirmer la réception
res.status(200).json({ success: true });
});
// Fonction pour envoyer une requête avec signature HMAC
async function sendSecureRequest(endpoint, data) {
const httpMethod = 'POST';
const timestamp = Date.now().toString();
const bodyString = JSON.stringify(data);
const hmacData = `${httpMethod}:${timestamp}:${bodyString}`;
const hmacSignature = crypto
.createHmac('sha256', HMAC_SECRET_KEY)
.update(hmacData)
.digest('hex');
const response = await fetch(`https://api.intech.sn${endpoint}`, {
method: httpMethod,
headers: {
'Content-Type': 'application/json',
'Hmac-Signature': hmacSignature,
'Timestamp': timestamp
},
body: bodyString
});
return response.json();
}
app.listen(3000, () => {
console.log('Serveur démarré sur le port 3000');
});
Pour activer la signature HMAC et/ou le SSL Certificate Pinning sur votre compte, contactez le support technique Intech avec les informations suivantes :
- Votre ID de compte développeur
- L'empreinte SHA256 de votre certificat SSL (si SSL Pinning souhaité)
- Confirmation que vous avez implémenté la validation HMAC côté serveur
Lister tous les services (Route publique)
Liste tous les services disponibles sur l'API. Chaque service doit être activé pour le compte développeur pour pouvoir l'utiliser.
/api-services/services
Headers requis
Header | Valeur | Description |
---|---|---|
Secretkey |
xxxxxx | La clé API secrète |
Exemple de requête
curl -X GET "https://api.intech.sn/api-services/services" \
-H "Secretkey: xxxxxx"
Exemple de réponse
{
"success": true,
"services": [
{
"name": "CashIn Free Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/free_sn.png",
"codeService": "FREE_SN_WALLET_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashIn E Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/emoney.png",
"codeService": "EXPRESSO_SN_WALLET_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashOut Free Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/free_sn.png",
"codeService": "FREE_SN_WALLET_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "CashOut E Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/emoney.png",
"codeService": "EXPRESSO_SN_WALLET_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "Achat credit Orange",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/seddo.jpg",
"codeService": "ORANGE_SN_AIRTIME_CREDIT_TELEPHONIQUE",
"typeOperation": "DEBIT",
"typeService": "CREDIT_TELEPHONIQUE"
},
{
"name": "Achat credit Free",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/izi.jpg",
"codeService": "FREE_SN_AIRTIME_CREDIT_TELEPHONIQUE",
"typeOperation": "DEBIT",
"typeService": "CREDIT_TELEPHONIQUE"
},
{
"name": "Achat credit Expresso",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/expresso.png",
"codeService": "EXPRESSO_SN_AIRTIME_CREDIT_TELEPHONIQUE",
"typeOperation": "DEBIT",
"typeService": "CREDIT_TELEPHONIQUE"
},
{
"name": "CashIn Orange Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/om_sn.png",
"codeService": "ORANGE_SN_API_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashOut Orange Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/om_sn.png",
"codeService": "ORANGE_SN_API_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "CashIn Wave Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/wave.png",
"codeService": "WAVE_SN_API_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashOut Wave Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/wave.png",
"codeService": "WAVE_SN_API_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "CashOut Wizall Money",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/wizall.jpg",
"codeService": "WIZALL_SN_API_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "CashOut Carte Bancaire",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/CB.png",
"codeService": "BANK_CARD_API_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "Recharge Rapido",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/rapido.png",
"codeService": "RAPIDO_SN_BILL_RELOAD",
"typeOperation": "DEBIT",
"typeService": "BILL_BUY_RELOAD"
},
{
"name": "Recharge Woyofal",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/logo_woyofal.png",
"codeService": "WOYOFAL_SN_BILL_RELOAD",
"typeOperation": "DEBIT",
"typeService": "BILL_BUY_RELOAD"
},
{
"name": "Sénélec",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/logo_senelec.png",
"codeService": "SENELEC_SN_BILL_PAY",
"typeOperation": "DEBIT",
"typeService": "BILL_PAY"
},
{
"name": "SenEau",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/logo_sen_eau.png",
"codeService": "SENEAU_SN_BILL_PAY",
"typeOperation": "DEBIT",
"typeService": "BILL_PAY"
},
{
"name": "Recharge Xeweul",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/xeweul.png",
"codeService": "XEWEUL_SN_BILL_RELOAD",
"typeOperation": "DEBIT",
"typeService": "BILL_BUY_RELOAD"
},
{
"name": "Oolu Solar",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/oolusoloar.png",
"codeService": "OOLUSOLAR_SN_BILL_RELOAD",
"typeOperation": "DEBIT",
"typeService": "BILL_BUY_RELOAD"
},
{
"name": "Baobab Plus",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/baobapplus.png",
"codeService": "BAOBAP_PLUS_SN_BILL_RELOAD",
"typeOperation": "DEBIT",
"typeService": "BILL_BUY_RELOAD"
},
{
"name": "Der/Fj",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/derfj.jpg",
"codeService": "DER_FJ_SN_BILL_RELOAD",
"typeOperation": "DEBIT",
"typeService": "BILL_BUY_RELOAD"
},
{
"name": "Aquatech",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/aquatech.jpg",
"codeService": "AQUATECH_SN_BILL_PAY",
"typeOperation": "DEBIT",
"typeService": "BILL_PAY"
},
{
"name": "UVS",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/uvs.png",
"codeService": "UVS_SN_BILL_PAY",
"typeOperation": "DEBIT",
"typeService": "BILL_PAY"
},
{
"name": "UCAD",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/ucad.png",
"codeService": "UCAD_SN_BILL_PAY",
"typeOperation": "DEBIT",
"typeService": "BILL_PAY"
},
{
"name": "WhatsApp Message",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/WhatsApp.svg.png",
"codeService": "WHATSAPP_MESSAGING",
"typeOperation": "DEBIT",
"typeService": "MESSENGING_SMS"
},
{
"name": "Virement Bancaire Sénégal",
"icon": "https://change.sn/assets/images/virement.png",
"codeService": "BANK_TRANSFER_SN_API_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashIn Orange Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/om_ci.png",
"codeService": "ORANGE_CI_API_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "Cashout Orange Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/om_ci.png",
"codeService": "ORANGE_CI_API_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "Airtime Orange Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/orange_ci_airtime.png",
"codeService": "ORANGE_CI_AIRTIME_CREDIT_TELEPHONIQUE",
"typeOperation": "DEBIT",
"typeService": "CREDIT_TELEPHONIQUE"
},
{
"name": "CashIn Mtn Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/mtn_ci.png",
"codeService": "MTN_CI_API_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashOut Mtn Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/moov_ci.png",
"codeService": "MTN_CI_API_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "Airtime Mtn CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/mtn_ci_airtime.png",
"codeService": "MTN_CI_AIRTIME_CREDIT_TELEPHONIQUE",
"typeOperation": "DEBIT",
"typeService": "CREDIT_TELEPHONIQUE"
},
{
"name": "CashIn Moov Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/moov_ci.png",
"codeService": "MOOV_CI_API_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashOut Moov Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/moov_ci.png",
"codeService": "MOOV_CI_API_CASH_OUT",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "Airtime Moov CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/moov_ci_airtime.png",
"codeService": "MOOV_CI_AIRTIME_CREDIT_TELEPHONIQUE",
"typeOperation": "DEBIT",
"typeService": "CREDIT_TELEPHONIQUE"
},
{
"name": "CashOut Mtn Money CI 2",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/wizall.jpg",
"codeService": "MTN_CI_API_CASH_OUT_2",
"typeOperation": "CREDIT",
"typeService": "CASHOUT"
},
{
"name": "CashIn Mtn Money CI 2",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/mtn_ci.jpg",
"codeService": "MTN_CI_API_CASH_IN_2",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
},
{
"name": "CashIn Wave Money CI",
"icon": "https://intech-apiv2.s3.amazonaws.com/icons/wave.png",
"codeService": "WAVE_CI_API_CASH_IN",
"typeOperation": "DEBIT",
"typeService": "CASHIN"
}
]
}
Lister toutes les erreurs (Route publique)
Liste tous les codes d'erreur disponibles sur l'API avec leurs messages.
/api-services/errors
Headers requis
Header | Valeur | Description |
---|---|---|
Secretkey |
xxxxxx | La clé API secrète |
Exemple de requête
curl -X GET "https://api.intech.sn/api-services/errors" \
-H "Secretkey: xxxxxx"
Exemple de réponse
{
"success": true,
"services": [
{
"id": null,
"code": "unknown_error",
"message": "Votre opération n'a pas pu être traitée pour le moment, réessayez plus tard."
},
{
"id": 1,
"code": "invalid_phone_number",
"message": "Le numéro WAVE que vous avez saisie est incorrect"
},
{
"id": 2,
"code": "insufficient_balance",
"message": "Le solde de votre compte Orange Money ne vous permet pas d'effectuer un paiement de __amount__ CFA"
},
{
"id": 3,
"code": "logged-out-user-session",
"message": ""
},
{
"id": 4,
"code": "payment-timeout",
"message": "Le client n'a pas validé le paiement après 15 minutes"
},
{
"id": 5,
"code": "no_om_account",
"message": "Le destinataire n'est pas un client Orange Money"
},
{
"id": 6,
"code": "exceeds-limit-time",
"message": "Vous venez d'envoyer le même montant au même destinataire. Si vous souhaitez répéter la transaction, veuillez patienter quelques minutes."
},
{
"id": 11,
"code": "user_account_suspended",
"message": "Le compte Orange Money du client est suspendu"
},
{
"id": 12,
"code": "whatsapp_user_not_found",
"message": "Ce numéro n'a pas de compte WhatsApp"
},
{
"id": 14,
"code": "om_number_not_allowed",
"message": "Ce numéro n'est pas autorisé a fair des transaction Orange Money"
},
{
"id": 15,
"code": "bad_amount_50",
"message": "Le montant pour ce service doit êre un multiple de 50 CFA"
},
{
"id": 16,
"code": "bad_amount_100",
"message": "Le montant pour ce service doit êre un multiple de 100 CFA"
},
{
"id": 17,
"code": "om_operator_internal_error",
"message": "L'opérateur Orange Money a eu une erreur interne. veuillez ressayez "
},
{
"id": 18,
"code": "monthly_max_amount_cumul_reached",
"message": "Le bénéficiaire a atteint le montant maximum autorisé par mois."
},
{
"id": 19,
"code": "connexion_error",
"message": "Problème lors de la connexion au reseaux"
},
{
"id": 23,
"code": "no_om_account",
"message": "Le numero Orange Money est introuvable"
},
{
"id": 24,
"code": "interval_max_amount_cumul_reached",
"message": "Le bénéficiaire a atteint le montant maximum autorisé"
},
{
"id": 26,
"code": "insufficient_balance",
"message": "Le solde de votre compte ne vous permet pas d'effectuer un paiement de __amount__ CFA"
},
{
"id": 28,
"code": "operator_down_time",
"message": "L'opérateur est momentanément indisponible"
},
{
"id": 29,
"code": "execution_error",
"message": "Erreur lors de l'execution de la requete"
},
{
"id": 37,
"code": "balance_check_failed",
"message": "Désolé, votre transaction n a pas aboutie. Prière vérifier votre solde puis réessayer."
},
{
"id": 38,
"code": "bad_amount_5",
"message": "Le montant pour ce service doit êre un multiple de 5 CFA"
},
{
"id": 39,
"code": "no_mtn_account",
"message": "Le destinataire n'est pas un client Mtn Money"
},
{
"id": 43,
"code": "pos_already_connected",
"message": "Problème lors de la connexion au reseaux"
}
]
}
Tous les codes d'erreur (43 codes)
ID | Code | Message |
---|---|---|
null | unknown_error |
Votre opération n'a pas pu être traitée pour le moment, réessayez plus tard. |
1 | invalid_phone_number |
Le numéro WAVE que vous avez saisie est incorrect |
2 | insufficient_balance |
Le solde de votre compte Orange Money ne vous permet pas d'effectuer un paiement de __amount__ CFA |
3 | logged-out-user-session |
|
4 | payment-timeout |
Le client n'a pas validé le paiement après 15 minutes |
5 | no_om_account |
Le destinataire n'est pas un client Orange Money |
6, 7, 8, 20, 21 | exceeds-limit-time |
Vous venez d'envoyer le même montant au même destinataire. Si vous souhaitez répéter la transaction, veuillez patienter quelques minutes. |
9, 23 | no_om_account |
Le destinataire n'est pas un client Orange Money / Le numero Orange Money est introuvable |
11 | user_account_suspended |
Le compte Orange Money du client est suspendu |
12 | whatsapp_user_not_found |
Ce numéro n'a pas de compte WhatsApp |
14 | om_number_not_allowed |
Ce numéro n'est pas autorisé a fair des transaction Orange Money |
15 | bad_amount_50 |
Le montant pour ce service doit êre un multiple de 50 CFA |
16 | bad_amount_100 |
Le montant pour ce service doit êre un multiple de 100 CFA |
17 | om_operator_internal_error |
L'opérateur Orange Money a eu une erreur interne. veuillez ressayez |
18, 22, 27, 36, 40, 42 | monthly_max_amount_cumul_reached |
Le bénéficiaire a atteint le montant maximum autorisé par mois. |
19, 43 | connexion_error / pos_already_connected |
Problème lors de la connexion au reseaux |
24, 25, 41 | interval_max_amount_cumul_reached |
Le bénéficiaire a atteint le montant maximum autorisé |
26 | insufficient_balance |
Le solde de votre compte ne vous permet pas d'effectuer un paiement de __amount__ CFA |
28 | operator_down_time |
L'opérateur est momentanément indisponible |
29-35 | execution_error |
Erreur lors de l'execution de la requete |
37 | balance_check_failed |
Désolé, votre transaction n a pas aboutie. Prière vérifier votre solde puis réessayer. |
38 | bad_amount_5 |
Le montant pour ce service doit êre un multiple de 5 CFA |
39 | no_mtn_account |
Le destinataire n'est pas un client Mtn Money |
Vérifier le solde
Obtenir le solde du compte développeur.
/api-services/balance
Headers requis
Header | Valeur | Description |
---|---|---|
Secretkey |
{{api_key}} | La clé API secrète |
Exemple de requête
curl -X GET "https://api.intech.sn/api-services/balance" \
-H "Secretkey: {{api_key}}"
Exemple de réponse
{
"code": 2000,
"msg": "Successfully operation",
"error": false,
"data": {
"currency": "XOF",
"balance": 9938
}
}
Lister les factures impayées
Liste les factures impayées pour un numéro de compte donné. Le accountNumber
est l'identifiant de l'entité dont on veut payer la facture.
/api-services/list-pending-bills
Description détaillée
Pour tous les services avec un code contenant le suffixe _BILL_PAY
, vous devez appeler cette ressource avant d'effectuer toute transaction.
Le développeur doit lister toutes les factures impayées au client. Une fois que le client choisit la facture qu'il veut payer, alors api-services/operation
peut être appelé avec les champs billReference
qui est la référence de la facture choisie de la liste des factures impayées, et accountNumber
qui a été donné à l'étape 1.
Signification de accountNumber selon le service
Service | Code Service | accountNumber représente |
---|---|---|
Senelec | SENELEC_SN_BILL_PAY |
Numéro de contrat client |
SenEau | SENEAU_SN_BILL_PAY |
Référence client |
UCAD | UCAD_SN_BILL_PAY |
Numéro de carte étudiant UCAD |
UVS | UVS_SN_BILL_PAY |
Numéro de carte étudiant UVS |
Aquatech | AQUATECH_SN_BILL_PAY |
Référence client sur la facture |
Corps de la requête
Paramètre | Type | Obligatoire | Description |
---|---|---|---|
apiKey |
string | Oui | Votre clé API |
codeService |
string | Oui | Code du service de facturation |
billAccountNumber |
string | Oui | Numéro de compte/contrat/référence |
Exemple de requête - SENELEC
{
"apiKey": "{{api_key}}",
"codeService": "SENELEC_SN_BILL_PAY",
"billAccountNumber": "21050176023"
}
Exemple de requête - SENEAU
{
"apiKey": "{{api_key}}",
"codeService": "SENEAU_SN_BILL_PAY",
"billAccountNumber": "106032682913"
}
Exemple de réponse - Succès
{
"code": 2000,
"msg": "1 en attente(s) non payée pour cette facture",
"error": false,
"data": {
"status": "SUCCESS",
"pendingBills": {
"success": true,
"pendingBills": [
{
"amount": 27684,
"billReference": "1062208013069",
"infos": [
{
"label": "Nom client",
"value": "KOKOU M DELA RDC EZI"
},
{
"label": "Date d'échéance",
"value": "29/08/22"
}
]
}
]
}
}
}
Exemple de réponse - Échec
{
"code": 4000,
"msg": "Désolé, vous ne pouvez pas payer cette facture , vous avez une facture impayée au 18/01/2023. Veuillez vous rendre en agence SEN'EAU.",
"error": false,
"data": {
"status": "FAILLED",
"pendingBills": []
}
}
Effectuer une transaction
Initier une transaction pour différents services (voir Liste tous les services).
/api-services/operation
Champs obligatoires pour toutes les transactions
{
"phone": "772457199",
"amount": 100,
"codeService": "RAPIDO_SN_BILL_RELOAD",
"externalTransactionId": "C898soe.d09ksssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": "{}" // (OPTIONNEL, Doit être une chaîne JSON sérialisée qui sera incluse lors de l'appel de votre Callback)
}
Certains services comme
BANK_CARD_API_CASH_OUT
ou WHATSAPP_MESSAGING
nécessitent que phone
soit au format international (doit inclure le code d'appel de la zone) par exemple +221772457199
Champs personnalisés par service
Chaque service peut avoir ses champs requis personnalisés. Tous les services qui nécessitent des champs personnalisés ont un exemple attaché dans la section exemple de cette ressource.
Services nécessitant accountNumber
Pour les services nécessitant accountNumber
, accountNumber
représente les valeurs suivantes :
Service | accountNumber représente |
---|---|
SENEAU | Référence client présente sur la facture |
SENELEC | Numéro de contrat présent sur la facture |
UCAD | Numéro de carte étudiant Ucad |
UVS | Numéro de carte étudiant UVS |
AQUATECH | Référence client sur la facture |
XEWEUL | Numéro de carte Xeweul |
RAPIDO | Numéro de carte Rapido |
WOYOFAL | Numéro de compteur Woyofal |
BAOBAB PLUS | Numéro d'unité client Baobab plus |
DER/FJ | Numéro de carte d'identité du client |
OOLU SOLAR | Numéro de compte OoluSolar |
Réponse de succès (code === 2000)
Si la transaction a été initiée avec succès, l'API retourne json avec le champ code
=== 2000
{
"code": 2000,
"msg": "Votre opération s'est effectuée sans erreur, Vous allez recevoir un message de confirmation",
"error": false,
"data": {
"phone": "221772457199",
"amount": 1000,
"codeService": "BANK_CARD_API_CASH_OUT",
"transactionId": "7091659672946",
"status": "PENDING",
"externalTransactionId": "C898.09S9sdszssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping"
}
}
À ce stade, vous devez écouter l'appel de
callback URL
pour être informé du statut final de la transaction.
Champs supplémentaires dans la réponse
Certains services peuvent retourner des champs supplémentaires dans le champ data
nécessaires pour réaliser la transaction.
Exemple pour BANK_CARD_API_CASH_OUT
L'URL de la page d'authentification 3DSECURE du client est retournée :
{
"code": 2000,
"msg": "Votre opération s'est effectuée sans erreur, Vous allez recevoir un message de confirmation",
"error": false,
"data": {
"phone": "221772457199",
"amount": 1000,
"codeService": "BANK_CARD_API_CASH_OUT",
"transactionId": "7091659672946",
"status": "PENDING",
"externalTransactionId": "C898.09S9sdszssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"notificationMessage": "Bonjour, cliquez sur le lien suivant pour valider la transaction de 1000 cfa.\nhttp://localhost:6050/deep/7091659672946\n(Expire dans 15 minutes)\nBy InTech",
"authLinkUrl": "http://localhost:6050/deep/7091659672946",
"orderId": "INTECHV2-BK-7091659672946"
}
}
Exemple pour WAVE_SN_API_CASH_OUT
Une URL de lien profond est retournée que le développeur devrait afficher à l'utilisateur :
{
"code": 2000,
"msg": "Votre opération s'est effectuée sans erreur, Vous allez recevoir un message de confirmation",
"error": false,
"data": {
"phone": "772457199",
"amount": 1000,
"codeService": "WAVE_SN_API_CASH_OUT",
"transactionId": "139663910423",
"status": "PENDING",
"externalTransactionId": "C898.09S9sszsssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"notificationMessage": "Bonjour, cliquez sur le lien suivant pour valider la transaction de 1000 cfa.\nhttps://api.intech.sn/deep/139663910423\n(Expire dans 15 minutes)\nBy InTech",
"deepLinkUrl": "https://api.intech.sn/deep/139663910423"
}
}
Réponse d'erreur (code !== 2000)
Tous les code
!== 2000
signifient que l'initiation de la transaction a échoué. Selon si la transaction a été créée en interne, le développeur peut recevoir un appel de callback
avec le statut FAILLED
{
"code": 4000,
"msg": "Le solde de votre compte Orange Money ne vous permet pas d'effectuer un paiement de 200000 CFA",
"error": true,
"data": {
"phone": "772457199",
"amount": 200000,
"codeService": "ORANGE_SN_API_CASH_OUT",
"transactionId": "5650516153453",
"status": "FAILLED",
"externalTransactionId": "Cx8SSsdssddekjhsdsseeGsdsedssssjsdk9sksd8.8HQGg",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"errorType": {
"id": 2,
"codeService": "ORANGE_SN_API_CASH_OUT",
"code": "insufficient_balance",
"message": "Le solde de votre compte Orange Money ne vous permet pas d'effectuer un paiement de 200000 CFA"
}
}
}
Exemples de transactions - Cash In
WAVE_SN_API_CASH_IN
{
"phone": "772457199",
"amount": 5,
"codeService": "WAVE_SN_API_CASH_IN",
"externalTransactionId": "C898l.s09dS9dddd.dddkdskddh.hhssdsd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {}
}
ORANGE_SN_API_CASH_IN
{
"phone": "772450000",
"amount": 350,
"codeService": "ORANGE_SN_API_CASH_IN",
"externalTransactionId": "C898.09S9ssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {}
}
BANK_TRANSFER_SN_API_CASH_IN
{
"phone": "221772450000",
"amount": 1351,
"codeService": "BANK_TRANSFER_SN_API_CASH_IN",
"externalTransactionId": "C898.09S9s8d",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {},
"customerFirstName": "Moussa",
"customerLastName": "Ndour",
"customerEmail": null,
"rib": "SN000 00000 000000000000 00",
"operationDescription": "Achat MacBook Air sur CouchTech"
}
WIZALL_SN_API_CASH_IN
{
"phone": "772450000",
"amount": 1350,
"codeService": "WIZALL_SN_API_CASH_IN",
"externalTransactionId": "C898.09S9sd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {}
}
Exemples de transactions - Cash Out
WAVE_SN_API_CASH_OUT
{
"phone": "772457199",
"amount": 1350,
"codeService": "WAVE_SN_API_CASH_OUT",
"externalTransactionId": "C898.09S9sd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"sender": "CouTech",
"successRedirectUrl": "https://paytech.sn/wave_redirect_success",
"errorRedirectUrl": "https://paytech.sn/wave_redirect_error"
}
ORANGE_SN_API_CASH_OUT
{
"phone": "772450000",
"amount": 150,
"codeService": "ORANGE_SN_API_CASH_OUT",
"externalTransactionId": "C898.09S9ssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {},
"useOMQrCode": true,
"sender": "CouTech",
"successRedirectUrl": "https://paytech.sn/orange_redirect_success",
"errorRedirectUrl": "https://paytech.sn/orange_redirect_error"
}
BANK_CARD_API_CASH_OUT
{
"phone": "221772450000",
"amount": 1351,
"codeService": "BANK_CARD_API_CASH_OUT",
"externalTransactionId": "C898.09S9s8d",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {},
"bankAuthRedirectUrl": "https://secure-3ds.intech.sn/ping",
"customerFirstName": "Moussa",
"customerLastName": "Ndour",
"customerEmail": null,
"cardNumber": "599735xx9xx130",
"cardExpireMonth": "09",
"cardExpireYear": "22",
"cardCVC": "920",
"cardType": "MASTERCARD",
"merchantName": "CouchTech",
"operationDescription": "Achat MacBook Air sur CouchTech",
"successRedirectUrl": "https://domaine.sn/bank_redirect_success",
"errorRedirectUrl": "https://domaine.sn/bank_redirect_error"
}
WIZALL_SN_API_CASH_OUT
{
"phone": "772450000",
"amount": 1350,
"codeService": "WIZALL_SN_API_CASH_OUT",
"externalTransactionId": "C898.09S9sd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {}
}
Exemples de transactions - WhatsApp Messaging
WHATSAPP_MESSAGING
{
"phone": "+221772450000",
"codeService": "WHATSAPP_MESSAGING",
"externalTransactionId": "C89s8.09S9ssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"apiKey": "{{api_key}}",
"data": {},
"message": "Hello Word from Postman",
"attachedMediaExtension": ".png",
"attachedMediaName": "Document Name",
"attachedMedia": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAA..."
}
Réponse WhatsApp
{
"code": 2000,
"msg": "Le message a bien été envoyé a 221772450000@c.us (+221772450000)",
"error": false,
"data": {
"phone": "+221772450000",
"amount": 1150,
"codeService": "WHATSAPP_MESSAGING",
"transactionId": "7291680498244",
"status": "PENDING",
"externalTransactionId": "C898sosezdlsk.ld0s9ksssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"errorType": null
}
}
Obtenir le statut d'une transaction (Ressource limitée - lire la note)
Appeler cette ressource plus de 3 fois par minute pour la même transaction peut entraîner la mise sur liste noire de votre adresse IP. Ne spammez pas !
/api-services/get-transaction-status
Valeurs de statut possibles
FAILLED|SUCCESS|PENDING|REFUNDED|PROCESSING|CANCELED
Corps de la requête
{
"externalTransactionId": "C89sdjz8zvslljzsse0eek1sfm9lkmdsddkssklkkkjllded8lfdkd"
}
Exemple de réponse - Transaction échouée
{
"code": 2000,
"msg": "Successfully operation",
"error": false,
"data": {
"transactionId": 205818,
"createdAt": "2022-10-17T18:07:58.000Z",
"updatedAt": "2022-10-17T18:08:55.000Z",
"externalTransactionId": "C89sdjz8zvslljzsse0eek1sfm9lkmdsddkssklkkkjllded8lfdkd",
"status": "FAILLED",
"errorType": {
"code": "invalid_phone_number",
"message": "Service momentanement indisponible, veuillez reessayer plus tard"
}
}
}
Exemple de réponse - Transaction réussie
{
"code": 2000,
"msg": "Successfully operation",
"error": false,
"data": {
"transactionId": 197872,
"createdAt": "2022-10-04T12:21:18.000Z",
"updatedAt": "2022-10-04T12:21:57.000Z",
"externalTransactionId": "C89sdjz8zvslljzezr0eeksfm9lskmdlsdddkfklekkkdjllded8lfdkd",
"status": "SUCCESS",
"errorType": null
}
}
Créer une réclamation
Créer une réclamation pour une transaction via l'API.
/api-services/new-claim
Corps de la requête
{
"subject": "Subject Here",
"message": "Hi customer...",
"transactionId": "T560863528274",
"apiKey": "{{api_key}}"
}
Exemple de réponse
{
"code": 2000,
"msg": "Successfully operation",
"error": false,
"data": {
"claim": {
"statut": "OPENED",
"subject": "Subject Here",
"message": "Hi customer...",
"transactionId": 102453,
"openedAt": "2022-09-15T15:03:27.339Z",
"createdAt": "2022-09-15T15:03:27.339Z",
"partenersId": 1,
"claimRef": "C98662712961324",
"comment": null,
"callbackUrl": null,
"userIdOpen": null,
"userIdClose": null,
"userIdComment": null,
"updatedAt": null,
"closeAt": null,
"id": 1,
"state": "ACTIVED"
}
}
}
Remboursement/Annulation de transaction
/api-services/transaction/refund-cancel
Corps de la requête
{
"apiKey": "{{api_key}}",
"transactionId": "T98010948524802"
}
Exemple de réponse
{
"message": "Le transaction Kpay de 50 CFA a bien été remboursé",
"statutTreatment": "SUCCESS"
}
Vérifier le numéro de référence MoneyGram
/api-services/moneygram-reception-info
Corps de la requête
{
"apiKey": "{{api_key}}",
"codeService": "MONEYGRAM_SN_API_CASH_OUT",
"referenceNumber": "89163605"
}
Exemple de réponse
{
"code": 2000,
"msg": "OK",
"error": false,
"data": {
"status": "SUCCESS",
"referenceNumberResponse": {
"doCheckIn": false,
"timeStamp": "2025-03-11T04:12:51.780Z",
"flags": 1,
"mgiTransactionSessionID": "4381702711E1741666579406",
"senderFirstName": "MOUSSA",
"senderLastName": "NDOUR",
"senderHomePhone": "772457199",
"receiverFirstName": "AICHA",
"receiverLastName": "DIALLO",
"agentCheckNumber": "0000000000",
"agentCheckAmount": "10000.000",
"agentCheckAuthorizationNumber": "00000",
"customerCheckNumber": "0000000000",
"customerCheckAmount": "0.000",
"okForAgent": false,
"deliveryOption": "WILL_CALL",
"transactionStatus": "AVAIL",
"dateTimeSent": "2025-03-11T03:43:43.583Z",
"receiveCurrency": "XOF",
"receiveAmount": "10000",
"referenceNumber": "89163605",
"originatingCountry": "SEN",
"validIndicator": false,
"indicativeReceiveAmount": "0",
"indicativeExchangeRate": "0.000000",
"expectedDateOfDelivery": "2025-03-11T00:00:00.000Z",
"originalSendAmount": "10000.000",
"originalSendCurrency": "XOF",
"originalSendFee": "300.000",
"originalExchangeRate": "1.000000",
"redirectIndicator": false,
"okForPickup": true,
"notOkForPickupReasonCode": 0,
"minutesUntilOkForPickup": "0",
"sendPurposeOfTransaction": "GIFT"
}
}
}
Vérifier les informations MoneyGram et obtenir les frais
/api-services/moneygram-send-info
Corps de la requête
{
"apiKey": "{{api_key}}",
"codeService": "MONEYGRAM_SN_API_CASH_IN",
"amount": 3000,
"moneygramSendData": {
"senderDetails": {
"senderFirstName": "Moussa",
"senderLastName": "Ndour",
"senderAddress": "123 Main Street",
"senderCity": "Dakar",
"senderHomePhone": "772457199",
"senderCountry": "SEN",
"senderPhoneNumber": "772457199",
"sendCurrency": "XOF",
"senderCitizenshipCountry": "SEN",
"sendPurposeOfTransaction": "GIFT",
"senderPhotoIdNumber": "1672282828282",
"senderPhotoIdCountry": "SEN",
"senderBirthCountry": "SEN",
"senderDOB": "1993-05-15",
"senderHomePhoneCountryCode": "221",
"senderPhotoIdType": "GOV",
"senderGender": "MALE",
"deliveryOption": "WILL_CALL",
"agentConsumerID": "USER1234",
"agentTransactionId": "TYTATTATATA"
},
"receiverDetails": {
"receiverFirstName": "Aicha",
"receiverLastName": "Diallo",
"receiverPhoneNumber": "772457199",
"receiverPhoneCountryCode": "221",
"receiveCountry": "SEN",
"receiveCurrency": "XOF",
"receiverAddress": "Almadies",
"receiverCity": "Dakar"
}
}
}
Exemple de réponse
{
"code": 2000,
"msg": "OK",
"error": false,
"data": {
"status": "SUCCESS",
"success": true,
"sendValidationResponse": {
"doCheckIn": false,
"timeStamp": "2025-03-17T23:14:28.621Z",
"flags": 1,
"mgiTransactionSessionID": "30138511E174225326301529360345NN",
"readyForCommit": true,
"receiveAgentAddress": null,
"sendAmounts": {
"sendAmount": "3000",
"sendCurrency": "XOF",
"totalSendFees": "90",
"totalDiscountAmount": "0",
"totalSendTaxes": "0",
"totalAmountToCollect": "3090",
"detailSendAmounts": [
{
"amountType": "nonMgiSendTax",
"amount": "0",
"amountCurrency": "XOF"
},
{
"amountType": "nonMgiSendFee",
"amount": "0",
"amountCurrency": "XOF"
},
{
"amountType": "mgiNonDiscountedSendFee",
"amount": "90",
"amountCurrency": "XOF"
},
{
"amountType": "totalNonDiscountedFees",
"amount": "90",
"amountCurrency": "XOF"
},
{
"amountType": "discountedMgiSendFee",
"amount": "90",
"amountCurrency": "XOF"
},
{
"amountType": "mgiSendTax",
"amount": "0",
"amountCurrency": "XOF"
},
{
"amountType": "totalMgiCollectedFeesAndTaxes",
"amount": "90",
"amountCurrency": "XOF"
},
{
"amountType": "totalAmountToMgi",
"amount": "3090",
"amountCurrency": "XOF"
},
{
"amountType": "totalSendFeesAndTaxes",
"amount": "90",
"amountCurrency": "XOF"
},
{
"amountType": "totalNonMgiSendFeesAndTaxes",
"amount": "0",
"amountCurrency": "XOF"
}
]
},
"receiveAmounts": {
"receiveAmount": "3000",
"receiveCurrency": "XOF",
"validCurrencyIndicator": true,
"payoutCurrency": "XOF",
"totalReceiveFees": "0",
"totalReceiveTaxes": "0",
"totalReceiveAmount": "3000",
"receiveFeesAreEstimated": false,
"receiveTaxesAreEstimated": false,
"detailReceiveAmounts": [
{
"amountType": "mgiReceiveFee",
"amount": "0",
"amountCurrency": "XOF"
},
{
"amountType": "nonMgiReceiveFee",
"amount": "0",
"amountCurrency": "XOF"
},
{
"amountType": "mgiReceiveTax",
"amount": "0",
"amountCurrency": "XOF"
},
{
"amountType": "nonMgiReceiveTax",
"amount": "0",
"amountCurrency": "XOF"
}
]
},
"exchangeRateApplied": "1.000000",
"receiveFeeDisclosureText": false,
"receiveTaxDisclosureText": false
},
"errorMessage": null
}
}
Appel de callback
Lorsqu'une transaction est créée et que son statut change, nos serveurs envoient un Callback en appelant une URL de notification située sur vos serveurs.
Le développeur doit créer une
callback url
dans son backend qui est soumise lors de l'initiation d'une nouvelle transaction, puis cette URL sera appelée chaque fois qu'une transaction a été traitée.
Le callback peut être reçu avant la réponse initiale de la transaction, donc le développeur doit utiliser externalTransactionId pour faire correspondre l'appel de callback à sa transaction interne.
Spécifications du callback
- Doit être une ressource
POST
- Les données suivantes seront postées au callback
Exemple de callback - Transaction réussie
{
"msg": "Opération de DEBIT par Recharge Rapido Wave",
"status": "SUCCESS",
"sha256Hash": "d0dc6fcc72aff93c3f7c6d6ec09752730f3640526ab51c4872968974d3175370",
"transaction": {
"phone": "772457199",
"amount": 100,
"codeService": "RAPIDO_SN_BILL_RELOAD",
"nameService": "Recharge Rapido",
"commission": 0,
"transactionId": "2313499724668",
"sousServiceTransactionId": "CI220912.2324.A84033",
"currentBalance": 2332.0625,
"balanceBeforeTransactionInit": 2534.5625,
"balanceAfterTransactionInit": 2332.0625,
"externalTransactionId": "C898soe.09ksssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"errorType": null,
"data": {
"my_custom_field_posted_when_initaing_transaction1": "some_value"
}
}
}
Exemple de callback - Transaction échouée
{
"msg": "Opération de DEBIT par Recharge Rapido Wave",
"status": "FAILLED",
"sha256Hash": "d0dc6fcc72aff93c3f7c6d6ec09752730f3640526ab51c4872968974d3175370",
"transaction": {
"phone": "772457199",
"amount": 100,
"codeService": "RAPIDO_SN_BILL_RELOAD",
"nameService": "Recharge Rapido",
"commission": 0,
"transactionId": "6584079423914",
"sousServiceTransactionId": "T_ND2CME73XA",
"currentBalance": 2332.0625,
"balanceBeforeTransactionInit": 2534.5625,
"balanceAfterTransactionInit": 2332.0625,
"externalTransactionId": "C898soe.d09ksssssd8sd",
"callbackUrl": "https://secure-3ds.intech.sn/ping",
"errorType": {
"message": "Message Description Here",
"code": "error_code",
"codeService": "",
"id": 0
},
"data": {
"my_custom_field_posted_when_initaing_transaction1": "some_value"
}
}
}
Vérification du callback
Le développeur doit vérifier le champ status
. Il peut avoir deux valeurs :
SUCCESS
- signifie que la transaction a été traitée avec succèsFAILLED
(avec 2 L) - signifie que la transaction a échoué
• Le champ data est automatiquement analysé en objet JSON, pas besoin d'appeler json_decode ou JSON.parse dessus
• Votre URL de callback doit retourner le CODE HTTP 200. Tout autre code != de HTTP 200 est considéré comme une erreur, l'appel de callback est appelé à nouveau (retry). Le retry est effectué après 1 minute de délai
• Même si le callback n'est normalement appelé qu'une seule fois, le développeur devrait ignorer tous les appels de callback ultérieurs pour éviter de traiter une transaction deux fois sur son backend.
Vérification de l'authenticité du callback
Le développeur doit vérifier que l'appel de callback provient d'Intech APIs.
Pour vérifier qu'INTECH a envoyé les données à votre serveur, vous devez comparer la réponse sha256Hash
avec le hash que vous allez construire.
En plus de cette vérification SHA256 par défaut, des fonctionnalités de sécurité avancées sont disponibles (signatures HMAC + SSL Certificate Pinning). Consultez la section 🔒 Sécurité Avancée pour plus de détails.
Formule du hash
Hash = SHA256(transactionId|externalTransactionId|appKey)
Exemple JavaScript
const sha256Hash = sha256(
`${transactionId}|${externalTransactionId}|${appKey}`,
)
Où :
transactionId
est retourné de l'appel d'initiation de transactionexternalTransactionId
est soumis lors de la création de la transaction par le développeurappKey
est l'appKey utilisée lors de la création de la transaction
Exemple de contrôleur
// exemple de pseudo-code
class TransactionController {
callback(request, response) {
const postData = request.all(); // json POST DATA
const apiKey = process.env.INTECH_API_KEY;
const sha256Hash = sha256(`${postData?.transaction?.transactionId}|${postData?.transaction?.externalTransactionId}|${appKey}`);
if (sha256Hash && sha256Hash === postData.sha256Hash)) {
//from INTECH
const myTransaction = DB.getRepository(Transaction).find({
intechTransactionId: postData?.transaction?.transactionId
});
if (postData.status === 'SUCCESS') {
// Transaction SUCCESS
} else if (postData.status === 'FAILLED') {
// Transaction FAILLED
}
res.end('OK');
}
else {
return response.send('Not from Intech')
}
}
}
🧪 Testeur API
Testez directement les endpoints de l'API Intech depuis cette interface.