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.

Collection Postman disponible
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 :

Astuce
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 :

Discord Server

Canal principal de support

Rejoindre Discord

WhatsApp

Support direct via WhatsApp

+221 77 245 71 99

Prérequis

  1. Avoir un compte développeur Intech valide sur le portail développeur
  2. Générer une clé API depuis votre tableau de bord
  3. 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

Note 1 : API SMS
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
Note 2 : Timeout HTTP
Configurez le timeout de votre client HTTP à minimum 60 secondes.
Note 3 : Codes de réponse
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.
Note 4 : URL de callback
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é.

Sécurité par défaut vs. avancée
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;
}
Important - Gestion du timestamp
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 :

  1. Fournissez l'empreinte SHA256 de la clé publique de votre certificat SSL
  2. L'équipe technique Intech configure cette empreinte pour votre compte
  3. 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);
Renouvellement de certificat
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');
});
Activation des fonctionnalités de sécurité
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.

GET /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.

GET /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.

GET /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.

POST /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).

POST /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)
}
Format international du téléphone
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"
    }
}
Important
À 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)

ATTENTION IMPORTANTE
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 !
POST /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.

POST /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

POST /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

POST /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

POST /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.

Important
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.
Note
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ès
  • FAILLED (avec 2 L) - signifie que la transaction a échoué
NB (IMPORTANT)
• 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.

Sécurité avancée disponible
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 transaction
  • externalTransactionId est soumis lors de la création de la transaction par le développeur
  • appKey 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.

Interface de test interactive

Services Cash In disponibles

FREE_SN_WALLET_CASH_IN EXPRESSO_SN_WALLET_CASH_IN ORANGE_SN_API_CASH_IN WAVE_SN_API_CASH_IN WIZALL_SN_API_CASH_IN BANK_TRANSFER_SN_API_CASH_IN ORANGE_CI_API_CASH_IN MTN_CI_API_CASH_IN MOOV_CI_API_CASH_IN MTN_CI_API_CASH_IN_2 WAVE_CI_API_CASH_IN

Services Cash Out disponibles

FREE_SN_WALLET_CASH_OUT EXPRESSO_SN_WALLET_CASH_OUT ORANGE_SN_API_CASH_OUT WAVE_SN_API_CASH_OUT WIZALL_SN_API_CASH_OUT BANK_CARD_API_CASH_OUT ORANGE_CI_API_CASH_OUT MTN_CI_API_CASH_OUT MOOV_CI_API_CASH_OUT MTN_CI_API_CASH_OUT_2

Services de crédit téléphonique

ORANGE_SN_AIRTIME_CREDIT_TELEPHONIQUE FREE_SN_AIRTIME_CREDIT_TELEPHONIQUE EXPRESSO_SN_AIRTIME_CREDIT_TELEPHONIQUE ORANGE_CI_AIRTIME_CREDIT_TELEPHONIQUE MTN_CI_AIRTIME_CREDIT_TELEPHONIQUE MOOV_CI_AIRTIME_CREDIT_TELEPHONIQUE

Services de paiement de factures

SENELEC_SN_BILL_PAY SENEAU_SN_BILL_PAY AQUATECH_SN_BILL_PAY UVS_SN_BILL_PAY UCAD_SN_BILL_PAY

Services de recharge prépayés

RAPIDO_SN_BILL_RELOAD WOYOFAL_SN_BILL_RELOAD XEWEUL_SN_BILL_RELOAD OOLUSOLAR_SN_BILL_RELOAD BAOBAP_PLUS_SN_BILL_RELOAD DER_FJ_SN_BILL_RELOAD

Service de messagerie

WHATSAPP_MESSAGING

Support et communauté

Discord

Rejoignez notre serveur Discord pour obtenir de l'aide en temps réel

Rejoindre Discord

WhatsApp

Support direct via WhatsApp

+221 77 245 71 99

Collection Postman

Téléchargez la collection complète pour tester l'API

Télécharger