Developer Portal Payin API

Payin API

Collectez des paiements depuis les wallets Mobile Money de vos clients via un seul endpoint.

Endpoint

POST /api/v1/merchant/payin Scope requis : payin

Paramètres

ChampTypeRequisDescription
amount integer Requis Montant en XOF (min API : 100, max : 10 000 000). Certains services imposent un minimum supérieur, notamment 200 XOF pour T-Money Togo.
currency string Optionnel Code ISO 4217 — défaut XOF
method string Requis Opérateur : orange · mtn · moov · wave · tmoney · yas · mobile_money
country string Requis Code ISO alpha-2 du pays du payeur : CI · SN · BF · TG · ML · BJ · GN. Détermine les frais applicables.
phone string Requis Numéro du payeur au format local ou international : 0701234567, 22893752340 ou +22893752340. Pour le Togo, le numéro local comporte 8 chiffres sans zéro initial.
reference string Requis Référence unique côté marchand (max 100 chars)
description string Optionnel Description affichée au client (max 255 chars)
otp string Conditionnel Code OTP généré par le client dans son app opérateur. Recommandé pour orange — certains providers (Hyperfast) l’exigent. Accepté aussi via metadata.otp.
customer_name string Optionnel Nom du client
customer_email string Optionnel Email du client
metadata object Optionnel Données libres retournées dans les webhooks

Header Idempotency-Key obligatoire

Chaque requête payin doit inclure un header Idempotency-Key unique. Utilisez votre reference comme valeur. Voir Idempotency.

OTP Orange Money

Pour method=orange, demandez au client de générer un code OTP dans son application Orange Money (menu paiement marchand) ou via #144#, puis envoyez-le dans le champ otp (ou metadata.otp). Sans OTP, le système choisit automatiquement un provider qui n’en a pas besoin (lien de paiement redirect) — ou la page payment_url collecte elle-même le code auprès du client quand c’est nécessaire. Vous n’avez rien à gérer.

Orange Money — two ways, your choice (no code change required)

Send nothing — it works as before: your customer either gets a payment link or types their Orange Money OTP on our hosted checkout page. No code change needed on your side.
Send otp — faster direct payment: the customer generates the OTP in their Orange Money app (or via #144#) and the payment is confirmed instantly, without any link.

Frais par pays

Le champ country détermine les frais de transaction appliqués. Votre clé API peut avoir des taux différents selon le pays. Contactez l'équipe commerciale pour configurer vos taux par pays.

Réponse

ChampTypeDescription
successbooleanToujours true si HTTP 200
statusstringinitiated · pending · timeout_review · success · failed
transaction_idstringID interne EnvoiFacile (à conserver)
providerstringToujours envoifacile
payment_urlstring|nullLien de paiement hébergé par EnvoiFacile — redirigez votre client ici
messagestringMessage lisible
data.confirmation_typestring|nullredirect (lien opérateur) · operator_push (confirmation PIN sur le téléphone) · sms_ussd (le client reçoit un SMS et compose le code USSD pour valider) · otp (code OTP collecté sur la page checkout)

Exemples

Orange Money CI

bash curl
curl -X POST https://envoifacile.com/api/v1/merchant/payin \
  -H "X-API-KEY: ef_live_xxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: order_2024_001" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 5000,
    "currency": "XOF",
    "method": "orange",
    "country": "CI",
    "phone": "0701234567",
    "reference": "order_2024_001",
    "otp": "123456",
    "description": "Paiement commande #001"
  }'

Wave CI

bash curl
curl -X POST https://envoifacile.com/api/v1/merchant/payin \
  -H "X-API-KEY: ef_live_xxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: order_2024_002" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 15000,
    "currency": "XOF",
    "method": "wave",
    "country": "CI",
    "phone": "0502345678",
    "reference": "order_2024_002"
  }'

T-Money Togo

bash curl
curl -X POST https://envoifacile.com/api/v1/merchant/payin \
  -H "X-API-KEY: ef_live_xxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: order_tg_001" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 200,
    "currency": "XOF",
    "method": "tmoney",
    "country": "TG",
    "phone": "+22893752340",
    "reference": "order_tg_001",
    "description": "Paiement T-Money Togo"
  }'

Routage Togo

Utilisez country=TG avec method=tmoney pour T-Money/Yas, ou method=moov pour Moov/Flooz. EnvoiFacile sélectionne automatiquement le provider ; votre intégration ne doit pas envoyer de nom de provider.

json Réponse (initiated, redirect requis)
{
  "success": true,
  "status": "initiated",
  "transaction_id": "PAY_ABCDEF123456_1719100000",
  "provider": "envoifacile",
  "message": "Redirect to payment page required.",
  "payment_url": "https://envoifacile.com/checkout/PAY_ABCDEF123456_1719100000",
  "data": {
    "requires_action": true,
    "provider_ref": "d22c81f3-ee04-4ec5-8bd2-cd8af5dabcfc"
  }
}

Utilisez payment_url

Redirigez votre client vers payment_url. Cette page hébergée par EnvoiFacile gère tout : redirection opérateur (Orange, Wave…), saisie du code OTP Orange Money si requis, confirmation push MTN/Moov, puis affiche le statut final. Vous n’avez pas besoin de gérer les URLs brutes des opérateurs ni l’OTP.

Exemple PHP (Laravel)

php Laravel HTTP Client
$response = Http::withHeaders([
    'X-API-KEY'        => env('ENVOIFACILE_API_KEY'),
    'Idempotency-Key'  => 'order_' . $order->id,
    'Content-Type'     => 'application/json',
])->post('https://envoifacile.com/api/v1/merchant/payin', [
    'amount'    => 5000,
    'currency'  => 'XOF',
    'method'    => 'orange',
    'country'   => 'CI',
    'phone'     => $customer->phone,
    'reference' => 'order_' . $order->id,
]);

$data = $response->json();

if (!empty($data['payment_url'])) {
    return redirect($data['payment_url']);
}

Statuts de transaction

StatutSignificationAction
initiatedTransaction créée, en attente du clientRediriger vers payment_url
pendingEn cours de traitement chez l'opérateurAttendre le webhook
timeout_reviewRésultat provider ambigu ou confirmation tardiveNe pas relancer ; attendre la réconciliation ou contacter le support
successPaiement confirmé et fonds reçusValider la commande
failedÉchec explicite et confirmé par le providerUne nouvelle tentative peut être proposée avec une nouvelle référence