Connecter votre agent IA
Donnez à votre agent de codage (Claude Code, Cursor, Windsurf, VS Code) un accès direct à la documentation RayMoney, et faites-lui vérifier ses requêtes avant de les envoyer.
Si vous intégrez RayMoney avec Claude Code, Cursor ou un autre agent, vous n'avez pas à lui copier-coller la documentation page par page. Le serveur MCP la lui expose en direct, dans le format structuré qu'il sait lire : il cherche au lieu de deviner, et il travaille toujours sur la version officielle à jour.
Il fait une deuxième chose, qui compte encore davantage : il relit et certifie la requête que votre agent s'apprête à envoyer. RayMoney déplace de l'argent réel sur les réseaux Mobile Money en Afrique de l'Ouest (Franc CFA), donc chaque appel mal formé ou erroné peut impacter la production.
Le serveur est public, en lecture seule pour la documentation, et ne demande aucune clé pour être interrogé.
Par où commencer votre intégration ?
Quatre étapes pour connecter vos outils, tester en bac à sable et déployer vos premiers paiements réels en Afrique de l'Ouest.
1. Connecter votre agent
Une commande terminal pour Claude Code, Cursor ou VS Code : votre IA lit la doc en direct et valide vos schémas.
Installer le MCP2. Clés & Activation
Inscrivez-vous sur client.rayplusmoney.com et validez votre KYC marchand pour obtenir vos clés API sans erreur 403.
Configuration des accès3. Choisir le bon flux
Comparez Straight Payin (Push USSD), Redirect Checkout hébergé ou Liens de paiement partageables.
Explorer les 3 produits4. Webhook & Signature
Configurez la seule source de vérité : vérification HMAC-SHA256, gestion de l'idempotence et retries.
Sécuriser le callbackPrincipes fondamentaux de l'écosystème
Comprendre comment circulent les fonds, comment s'articulent vos comptes marchands et quel mode d'intégration correspond le mieux à votre application.
1. L'argent circule dans deux sens
Toute l'infrastructure financière de RayMoney s'articule autour de deux mouvements cardinaux :
Encaisser (Pay-in)
Recevoir des fonds d'un client par Mobile Money (Wave, Orange, MTN, Moov) ou par carte bancaire VISA. L'argent crédite immédiatement le solde de votre compte marchand.
Reverser (Pay-out)
Envoyer des fonds à des tiers (livreurs, prestataires, salaires ou partenaires) directement vers leur portefeuille mobile ou compte bancaire. Débite instantanément votre solde disponible.
2. Le compte Marchand est l'unité de base
Une entreprise cliente possède un compte marchand (identifié par son merchant_id ou storeId) et un jeu de clés d'API. Chaque magasin ou filiale dispose de son propre historique comptable et de ses webhooks dédiés.
Chaque requête API porte votre jeton d'authentification, et chaque transaction de paiement ou reversement génère un identifiant unique (reference) fourni par votre système pour garantir une traçabilité totale de bout en bout.
3. Trois façons d'encaisser selon votre cas d'usage
Une seule intégration technique donne accès à trois modes de collecte complémentaires :
| Solution | Expérience client | Cas d'usage recommandé | Endpoint API |
|---|---|---|---|
| Straight Payin Push USSD Direct |
Le client reçoit directement une invite sur son écran de téléphone pour taper son code PIN Mobile Money. Aucune redirection web. | Applications mobiles (iOS/Android), bornes interactives, tunnels d'achat optimisés pour une conversion maximale. | POST /v1/payments/straight |
| Redirect Checkout Page hébergée |
Redirection vers une page de paiement hébergée par RayMoney. Le client choisit son opérateur ou sa carte VISA, puis est redirigé vers votre site. | Sites e-commerce (WooCommerce, Shopify, Prestashop, Next.js), abonnements et tunnels web universels. | POST /v1/payments/redirect |
| Liens de Paiement Partageable |
Génération d'une URL courte sécurisée à envoyer par WhatsApp, SMS ou email. | Facturation client B2B, devis d'acompte, collectes d'événements, service client sans développeur dédié. | POST /v1/payments/links |
4. Tout est asynchrone : les Webhooks sont la source de vérité
Sur les réseaux de Mobile Money en Afrique, la confirmation définitive dépend de la saisie du code secret par l'utilisateur sur son propre terminal mobile. L'API retourne donc immédiatement un statut PENDING.
Dès que l'opérateur valide la transaction (généralement en moins de 2 secondes), RayMoney appelle instantanément votre URL de Webhook avec le statut final (SUCCESS ou FAILED), signée cryptographiquement avec votre clé secrète via l'en-tête X-RayMoney-Signature (HMAC-SHA256).
reference) pour éviter tout double traitement de commande.
5. Cycle de vie d'une transaction (Cinématique & États)
Comprendre les transitions d'état entre votre backend, RayMoney et l'opérateur télécom :
| Statut | Description | Action pour votre système |
|---|---|---|
| PENDING | La demande est créée. En attente de saisie du PIN par l'utilisateur sur son téléphone. | Afficher un spinner ou un écran d'attente. Ne pas livrer le service. |
| SUCCESS | L'opérateur a débité le client et crédité votre compte marchand RayMoney. | Vérifier la signature du webhook, marquer la commande comme payée et livrer. |
| FAILED | Échec de la transaction (solde client insuffisant, code PIN erroné, annulation manuelle). | Afficher l'erreur retournée et inviter le client à réessayer ou choisir un autre opérateur. |
| EXPIRED | Le délai imparti pour valider l'USSD ou la session de checkout (généralement 5 min) a expiré. | Annuler la session en cours et générer une nouvelle tentative de paiement. |
Configuration Développeur & Authentification
Comment vous authentifier, gérer vos environnements de test et intégrer en toute sécurité.
Environnements & Base URLs
| Composant | Base URL Officielle | Authentification | Rôle & Usage |
|---|---|---|---|
| Passerelle RayMoney (Paiements) | https://app.rayplusmoney.com/Endpoints : /pay/v01/... |
Apikey + Authorization: Bearer |
Transactions financières réelles en FCFA (XOF) : encaissements Mobile Money et déboursements. |
| Serveur MCP IA RayPlusGroup | https://api.rayplusgroup.com/mcp |
Aucune clé (Public / Lecture seule) | Fournit la doc en direct, les schémas JSON et valide vos charges utiles pour Claude Code, Cursor, VS Code. |
| Espace Client & Inscription Marchand | https://client.rayplusmoney.com |
Email / Téléphone + Mot de passe | Création de compte marchand (client.rayplusmoney.com/registration), validation KYC et obtention des clés API. |
Il n'existe pas actuellement de console développeur séparée. L'ouverture de compte et la gestion de vos accès se font exclusivement sur le portail client : client.rayplusmoney.com (ou inscription directe sur client.rayplusmoney.com/registration).
Une fois votre profil marchand validé par l'équipe conformité, vos identifiants d'API (Apikey et jeton d'application Bearer) vous sont délivrés pour autoriser vos transactions.
En-têtes d'autorisation RayMoney (2 Headers Obligatoires)
Tous les appels vers la passerelle de paiement RayMoney (app.rayplusmoney.com) nécessitent deux en-têtes simultanés :
Apikey: live_pk_votre_cle_publique_marchand
Authorization: Bearer live_sk_votre_token_application_jwt
Content-Type: application/json
Accept: application/json
Rappel MCP : Le serveur MCP public pour l'assistance IA (https://api.rayplusgroup.com/mcp) est accessible en lecture seule sans authentification pour la consultation documentaire et la validation syntaxique de vos requêtes.
Créer un magasin dédié aux tests
Créez un magasin ou sous-compte dédié aux tests, séparé de vos magasins de production. Vos requêtes d'intégration en bac à sable utilisent les simulateurs des réseaux pour valider votre logique métier sans manipuler d'argent réel. Isolez ainsi les membres de votre équipe technique avec le rôle Développeur restreint au magasin de test.
Activer l'accès API & Résolution de l'erreur 403
Générer vos clés API ne suffit pas : l'accès à l'API est soumis à la validation réglementaire de votre profil entreprise (KYC/KYS). Tant que cette étape n'est pas validée, vos requêtes reçoivent une réponse HTTP 403 même si vos clés d'API sont formellement valides :
{
"id": "business_not_enabled_for_api_access",
"message": "This business account is not enabled for API access"
}
Idempotence des transactions (`reference` / `X-Idempotency-Key`)
Pour éviter tout double débit en cas de timeout réseau ou de retry côté client, chaque transaction d'encaissement ou de reversement doit comporter une référence unique générée par votre backend (ex: CMD-2026-0925-A1B2). Si une requête avec la même référence est renvoyée, RayMoney renvoie l'état existant sans créer de seconde opération.
Montants et Plafonds par Réseau (Zone UEMOA)
Limites réglementaires et techniques par transaction selon l'opérateur pour l'encaissement et le reversement.
| Opérateur & Réseau | Code ID | Zone géographique | Minimum Encaissement | Minimum Reversement | Montant Maximum |
|---|---|---|---|---|---|
| Wave | 39 |
Côte d'Ivoire (CI), Sénégal (SN) | 100 FCFA | 100 FCFA | 2 000 000 FCFA |
| Orange Money | 16 |
CI, SN, Mali (ML), Burkina (BF) | 100 FCFA | 100 FCFA | 2 000 000 FCFA |
| MTN Mobile Money | 13 |
Côte d'Ivoire (CI), Bénin (BJ) | 100 FCFA | 100 FCFA | 2 000 000 FCFA |
| Moov Money Africa | 14 |
CI, Togo (TG), Burkina (BF) | 100 FCFA | 100 FCFA | 2 000 000 FCFA |
| Free Money | 15 |
Sénégal (SN) | 100 FCFA | 100 FCFA | 1 500 000 FCFA |
| Carte VISA & Mastercard | VISA |
International (Toutes banques) | 500 FCFA | 1 000 FCFA | 5 000 000 FCFA |
Choisir votre client
Une seule commande, celle de votre client. Nommez l'entrée rayplusgroup : ce nom devient le préfixe des outils dans votre agent, et les exemples de cette page en dépendent.
claude mcp add --scope user --transport http rayplusgroup https://api.rayplusgroup.com/mcp
// Dans votre fichier .cursor/mcp.json :
{
"mcpServers": {
"rayplusgroup": {
"type": "http",
"url": "https://api.rayplusgroup.com/mcp"
}
}
}
// Dans votre fichier .vscode/mcp.json :
{
"mcpServers": {
"rayplusgroup": {
"type": "http",
"url": "https://api.rayplusgroup.com/mcp"
}
}
}
{
"mcpServers": {
"rayplusgroup": {
"type": "http",
"url": "https://api.rayplusgroup.com/mcp"
}
}
}
Endpoint HTTP : https://api.rayplusgroup.com/mcp
Transport : Streamable HTTP / SSE (JSON-RPC 2.0)
Aucune authentification requise pour interroger la documentation.
Vérifier que la connexion est faite
Demandez-le simplement à votre agent dans la conversation :
Quels outils rayplusgroup as-tu ?
Il doit citer les six outils, dont search_docs et review. S'il n'en voit aucun, rechargez votre client : la plupart ne rejouent la connexion qu'au démarrage.
curl -s -X POST https://api.rayplusgroup.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Lancer votre première intégration
Plutôt que de décrire votre besoin de zéro, utilisez l'un de nos prompts guidés :
/mcp__rayplusgroup__integrer_paiement straight
Puis expliquez votre contexte dans le message suivant, par exemple : « Je veux encaisser par Wave et Orange Money sur mon application mobile Flutter ». L'agent appellera automatiquement search_docs, consultera get_endpoint et déroulera l'intégration.
Le prompt lui interdit formellement d'appeler l'API avant d'avoir passé sa requête à review, qui vérifie l'endpoint, l'authentification (Apikey & Token Bearer), le schéma et les règles spécifiques RayMoney. Vous n'avez rien à réclamer : tant qu'il reste des erreurs, aucun appel ne part. C'est aussi lui qui attrape ce que le schéma standard n'exprime pas, comme le montant entier multiple de 100 sans décimale, l'indicatif 225 sans '+', ou l'OTP obligatoire pour Orange Money (réseau 16).
Pour implémenter votre récepteur de webhook, le second prompt fait rédiger le contrôleur puis le valide rigoureusement :
/mcp__rayplusgroup__implementer_webhook python
review pour auditer votre charge utile avant toute émission.
L'adresse
Pour toute configuration manuelle, ou pour un client absent de la liste :
https://api.rayplusgroup.com/mcp
MCP est un protocole ouvert : tout client qui parle HTTP fonctionne, en renseignant cette adresse comme serveur distant, sans authentification préalable pour la documentation.
Les 6 Outils Disponibles
Voici les capacités que le serveur expose directement à votre assistant IA :
| Domaine | Outil | Ce qu'il fait |
|---|---|---|
| Documentation | search_docs |
Recherche plein texte dans toute la documentation technique, codes d'erreur et guides. |
| Documentation | get_example |
Exemples d'appel complets et testés en cURL, Python, JavaScript, TypeScript, PHP et Dart. |
| Documentation | get_integration_checklist |
Checklist ordonnée étape par étape : encaissement direct, redirection web, OTP Orange, webhooks. |
| API Reference | get_endpoint |
Définition exhaustive d'une opération : schéma JSON complet, headers, exemples de réponse et erreurs. |
| Vérification | review |
Revue pré-envoi rigoureuse d'une requête : vérifie Apikey, indicatifs télécom, montant XOF, OTP. |
| Vérification | validate_webhook |
Relit votre contrôleur de callback et pointe ce qui manque (idempotence, parsing custom_data, HTTP 200). |
S'y ajoutent 5 ressources documentaires natives (matrice des réseaux, dictionnaire des sous-codes Code00 à Code18, spécifications du webhook), et deux prompts pré-configurés (integrer_paiement et implementer_webhook).
Prompts Dédiés pour Agents IA
Le serveur MCP RayPlusGroup embarque deux prompts guidés pour assister pas à pas votre agent de codage (Claude Code, Cursor, Windsurf, VS Code) :
Flux d'encaissement Mobile Money
Guider pas à pas votre agent pour intégrer le paiement direct (straight) ou hébergé (redirect). Force la consultation de la checklist, l'application des règles d'or RayMoney (montants XOF, indicatif 225, OTP Orange) et l'audit strict avec l'outil review avant tout appel.
type_flux (straight/redirect), langage (python/js/php)
Contrôleur de Webhook & Certification
Génère le récepteur de callback : vérification HMAC-SHA256, décompression résiliente de custom_data (dictionnaire ou liste), gestion d'idempotence et validation automatique via validate_webhook jusqu'à obtenir le score de 100/100.
langage (python/javascript/php)
/mcp__rayplusgroup__integrer_paiement ou dites à l'agent : « Utilise le prompt MCP RayMoney pour m'aider à intégrer le paiement Wave et Orange Money en Node.js ».
Ce qu'il ne fait pas
Le serveur MCP est en lecture seule pour la documentation. Il ne demande aucune clé secrète marchande, n'en stocke aucune, et n'émet aucun appel vers les comptes bancaires ou wallets en votre nom.
C'est votre agent, exécuté sur votre propre machine avec vos clés déclarées dans vos variables d'environnement, qui appelle directement la passerelle de paiement RayMoney.
La lecture seule élimine le risque de manipulation externe : le serveur MCP renvoie des spécifications techniques et valide la conformité syntaxique et métier de vos charges utiles.
Réseaux & Opérateurs Mobile Money
RayMoney agrège directement les principaux opérateurs télécoms et passerelles de paiement d'Afrique de l'Ouest (UEMOA). Lors de chaque initiation de paiement, renseignez l'identifiant numérique network correspondant dans le corps de votre requête.
| Opérateur | Pays | ID Opérateur / Réseau (network) |
OTP Requis | Montant min / max | Cinématique de validation |
|---|---|---|---|---|---|
Wave CI / SN |
Côte d'Ivoire, Sénégal | 39 |
Non | 100 à 2 000 000 XOF | Push USSD instantané ou Deep Link dans l'application Wave du client. |
Orange Money CI |
Côte d'Ivoire | 16 |
OUI (Obligatoire) | 100 à 1 500 000 XOF | Le client compose impérativement #144*82# pour générer son code OTP temporaire à 4 chiffres. |
MTN MoMo CI |
Côte d'Ivoire | 13 |
Non | 100 à 2 000 000 XOF | Notification push interactive USSD sur le téléphone du client pour saisie de son code secret. |
Moov Money CI |
Côte d'Ivoire | 14 |
Non | 100 à 2 000 000 XOF | Push USSD interactif avec validation par code PIN confidentiel Moov. |
| Sénégal | 15 |
Non | 100 à 1 000 000 XOF | Validation push USSD sur le réseau Free Sénégal. | |
![]() Cartes VISA & Mastercard |
International | Redirect Checkout | 3D-Secure | Selon plafond émetteur | Redirection vers page de paiement bancaire 3DS avec validation OTP SMS bancaire. |
customer)Pour la Côte d'Ivoire (10 chiffres) :
2250708674556. N'envoyez jamais +225... ni 22500... (rejet immédiat).
RayMoney met à disposition une API dédiée pour calculer et estimer dynamiquement les frais en temps réel selon le réseau, le volume et le profil marchand. Récupérez toujours les frais en direct via l'API ou consultez votre tableau de bord marchand.
Straight Payin (Encaissement Direct)
Le mode Straight Payin initie un encaissement direct sans redirection. Votre application ou votre backend transmet le numéro de téléphone, l'opérateur et le montant, et RayMoney déclenche immédiatement le push USSD chez le client.
https://app.rayplusmoney.com/pay/v01/straight/checkout-invoice/create
En-têtes HTTP Requis
| En-tête | Valeur attendue | Description |
|---|---|---|
Content-Type |
application/json |
Format d'encodage du corps de la requête. |
Accept |
application/json |
Format de réponse attendu. |
Apikey |
live_pk_... |
Votre clé publique marchande RayMoney (identifie l'application). |
Authorization |
Bearer live_sk_... |
Jeton d'autorisation secret Bearer fourni par RayMoney. |
Exemple de Requête Complète (Wave CI - Réseau 39)
curl -s -X POST https://app.rayplusmoney.com/pay/v01/straight/checkout-invoice/create \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Apikey: live_pk_votre_cle" \
-H "Authorization: Bearer live_sk_votre_token" \
-d '{
"commande": {
"invoice": {
"items": [
{
"name": "Recharge Solde Compte",
"quantity": 1,
"unit_price": 5000,
"total_price": 5000
}
],
"total_amount": 5000,
"devise": "XOF",
"customer": "2250708674556",
"network": 39
},
"store": {
"name": "Ma Boutique",
"website_url": "https://votresite.com"
},
"actions": {
"cancel_url": "https://votresite.com/cancel",
"return_url": "https://votresite.com/success",
"callback_url": "https://votresite.com/webhooks/raymoney",
"callback_url_method": "post_json"
},
"custom_data": {
"transaction_id": 1727361234567,
"order_id": "CMD-89421",
"user_id": 4821
}
}
}'
import httpx
payload = {
"commande": {
"invoice": {
"items": [{"name": "Recharge Solde", "quantity": 1, "unit_price": 5000, "total_price": 5000}],
"total_amount": 5000,
"devise": "XOF",
"customer": "2250708674556",
"network": 39 # 39=Wave, 16=Orange Money (requiert 'otp'), 13=MTN, 14=Moov
},
"store": {
"name": "Ma Boutique",
"website_url": "https://votresite.com"
},
"actions": {
"cancel_url": "https://votresite.com/cancel",
"return_url": "https://votresite.com/success",
"callback_url": "https://votresite.com/webhooks/raymoney",
"callback_url_method": "post_json"
},
"custom_data": {"order_id": "CMD-89421"}
}
}
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"Apikey": "live_pk_votre_cle",
"Authorization": "Bearer live_sk_votre_token"
}
with httpx.Client() as client:
response = client.post("https://app.rayplusmoney.com/pay/v01/straight/checkout-invoice/create", json=payload, headers=headers)
print(response.json())
const axios = require('axios');
async function initierPaiementDirect() {
const payload = {
commande: {
invoice: {
items: [{ name: "Abonnement Service", quantity: 1, unit_price: 5000, total_price: 5000 }],
total_amount: 5000,
devise: "XOF",
customer: "2250708674556",
network: 39
},
store: {
name: "Ma Boutique",
website_url: "https://votresite.com"
},
actions: {
cancel_url: "https://votresite.com/cancel",
return_url: "https://votresite.com/success",
callback_url: "https://votresite.com/webhooks/raymoney",
callback_url_method: "post_json"
},
custom_data: { order_id: "CMD-89421" }
}
};
const res = await axios.post('https://app.rayplusmoney.com/pay/v01/straight/checkout-invoice/create', payload, {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Apikey': 'live_pk_votre_cle',
'Authorization': 'Bearer live_sk_votre_token'
}
});
console.log('Résultat:', res.data);
}
Redirect Checkout (Page Hébergée)
Idéal si vous préférez déléguer l'affichage du choix de l'opérateur et la saisie de l'OTP à RayMoney. Cette API génère une URL de redirection où votre client choisit son mode de paiement sur une interface responsive sécurisée.
https://app.rayplusmoney.com/pay/v01/redirect/checkout-invoice/create
return_url : URL de votre site où le client est renvoyé en cas de succès.•
cancel_url : URL de votre site où le client revient s'il clique sur Annuler.•
callback_url : Notification serveur à serveur déclenchée par RayMoney dès validation effective des fonds (ne jamais se fier uniquement au retour navigateur pour délivrer le service).
Réponse Type (Redirection Client)
{
"response_code": "00",
"response_text": "Success",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"redirect_url": "https://app.rayplusmoney.com/pay/v01/redirect/checkout-invoice/pay?token=eyJ0eXAiOiJK...",
"description": "Operation successfully"
}
Webhooks & Traitement des Callbacks
Dès qu'une transaction est confirmée ou rejetée par l'opérateur télécom, les serveurs RayMoney envoient une requête HTTP POST avec le détail du statut au format JSON vers votre actions.callback_url.
Format de la Charge Utile Reçue
{
"transaction_id": 1727361234567,
"status": "completed",
"response_code": "00",
"response_text": "Paiement effectue avec succes",
"amount": 5000,
"devise": "XOF",
"customer": "2250708674556",
"custom_data": [
{"keyof_customdata": "order_id", "valueof_customdata": "CMD-89421"},
{"keyof_customdata": "user_id", "valueof_customdata": "4821"}
]
}
🛡️ Les 5 Piliers d'un Webhook Sécurisé
- 1. Réponse HTTP 200 immédiate : Répondez toujours
status: 200avec{"status": "ok"}. Tout code d'erreur ou délai de réponse > 5s entraînera des réessais automatiques. - 2. Contrôle rigoureux du succès : Validez la commande si et seulement si
response_code == "00"OUstatus == "completed". - 3. Idempotence indispensable : Vérifiez dans votre base si la commande est déjà marquée comme payée avant de déclencher la livraison (évite les doubles crédits en cas de rejeu réseau).
- 4. Décompression résiliente de
custom_data: En test, RayMoney peut renvoyer un dictionnaire{"uid": "..."}; en production, une liste d'objets[{"keyof_customdata": "uid", "valueof_customdata": "..."}]. Votre code doit impérativement supporter les deux formats. - 5. Ordre de lookup de la transaction : Récupérez la commande en base selon l'ordre de priorité officiel : 1.
custom_data.uid(UUID interne), 2.custom_data.refouexternal_id, 3.transaction_idRayMoney.
Vérification de la Signature Cryptographique (HMAC-SHA256)
Pour vous prémunir des faux callbacks forgés par un tiers malveillant, RayMoney signe chaque webhook avec votre clé secrète marchand dans l'en-tête HTTP X-RayMoney-Signature sous la forme :
X-RayMoney-Signature: t=1727361234,v1=a1b2c3d4e5f6...
Voici l'implémentation standard recommandée en Python et Node.js :
import hmac, hashlib, time
def verifier_signature_raymoney(raw_body: bytes, header_sig: str, secret_key: str) -> bool:
try:
# Extraire le timestamp t et la signature v1
parts = dict(item.split("=") for item in header_sig.split(","))
timestamp = int(parts.get("t", 0))
received_sig = parts.get("v1", "")
# 1. Protection anti-rejeu (tolérance 5 minutes)
if abs(time.time() - timestamp) > 300:
return False
# 2. Calcul du HMAC sur "timestamp.corps_brut"
payload_to_sign = f"{timestamp}.".encode("utf-8") + raw_body
expected_sig = hmac.new(
secret_key.encode("utf-8"),
payload_to_sign,
hashlib.sha256
).hexdigest()
# 3. Comparaison en temps constant pour contrer les timing attacks
return hmac.compare_digest(expected_sig, received_sig)
except Exception:
return False
Payouts & Déboursements (Envois de Fonds)
L'API Payout permet d'effectuer des virements automatisés depuis votre balance marchande RayMoney directement vers le compte Mobile Money d'un bénéficiaire (chauffeurs, prestataires, remboursements clients).
https://app.rayplusmoney.com/pay/v01/straight/payout
curl -s -X POST https://app.rayplusmoney.com/pay/v01/straight/payout \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Apikey: live_pk_votre_cle" \
-H "Authorization: Bearer live_sk_votre_token" \
-d '{
"commande": {
"amount": 25000,
"customer": "2250700000000",
"network": 39,
"custom_data": {
"transaction_id": 1727361234567,
"payout_ref": "VIR-2026-092",
"beneficiary_id": "DRIVER-442"
},
"callback_url": "https://votresite.com/webhooks/payout",
"callback_url_method": "post_json",
"top_up_wallet": 0
}
}'
Check Status — Vérification de l'État d'une Facture
En complément du webhook (qui reste la source de vérité), cet endpoint sert de filet de sécurité et de réconciliation : si votre serveur n'a pas reçu le callback (coupure réseau, indisponibilité), vous pouvez interroger directement RayMoney pour connaître l'état réel de la transaction.
https://app.rayplusmoney.com/pay/v01/redirect/checkout-invoice/confirm?invoiceToken=<token>
curl -s -X GET "https://app.rayplusmoney.com/pay/v01/redirect/checkout-invoice/confirm?invoiceToken=rm_token_xyz_abc123" \
-H "Accept: application/json" \
-H "Apikey: live_pk_votre_cle" \
-H "Authorization: Bearer live_sk_votre_token"
Réponse Type & États Possibles
{
"response_code": "00",
"description": "completed",
"status": "completed"
}
Valeur description / status |
Signification | Action Recommandée |
|---|---|---|
completed |
Paiement confirmé | La transaction est bien payée côté opérateur. Traiter comme un callback de succès et créditer le client. |
notcompleted |
Paiement échoué / annulé | La transaction a été rejetée, annulée ou a expiré. Ne pas délivrer le service. |
pending |
En attente de confirmation | Le client n'a pas encore validé le prompt USSD ou le réseau télécom traite encore la requête. |
Liens de Paiement Partageables
Bientôt disponible par APIGénérez des liens de paiement courts et sécurisés à envoyer par WhatsApp, SMS ou email pour vos factures, acomptes et collectes.
Disponibilité actuelle : La création de liens de paiement est active dès aujourd'hui directement depuis votre espace client sur client.rayplusmoney.com.
L'endpoint API REST automatisé (POST /pay/v01/payment-links) pour la génération programmatique est actuellement en cours de développement et sera ouvert très prochainement.
Carte VISA Prépayée RayMoney
Bientôt disponible par APIÉmission de cartes bancaires VISA physiques et virtuelles internationales co-brandées UBA pour vos collaborateurs, chauffeurs ou clients.
Disponibilité actuelle : Les cartes VISA RayMoney sont actives pour les retraits GAB et achats TPE/Internet dans le monde entier. Les commandes de cartes et le rechargement de solde se font via l'application mobile et le guichet marchand.
L'API d'émission programmatique de cartes (Card Issuing & Instant Top-up API) sera disponible très prochainement pour les partenaires agréés.
Points Relais & Terminaux Physiques (Soundbox / TPE)
Bientôt disponible par APIBoîtiers connectés avec confirmation vocale instantanée du paiement au comptoir (Soundbox) et TPE de caisse pour points de vente physiques.
Disponibilité actuelle : Le réseau physique de Points Relais et les boîtiers Soundbox sont déployés chez nos commerçants partenaires en agence.
L'API de couplage et de déclenchement d'encaissement sur terminal physique (POST /pay/v01/devices/soundbox/push) est en cours de finalisation et sera documentée prochainement.
Codes d'Erreur & Sous-Codes RayMoney
Voici le dictionnaire officiel des sous-codes renvoyés par RayMoney lors des retours de statut ou dans les réponses de webhook, pour afficher un message clair et compréhensible à vos utilisateurs :
| Code d'Erreur | Signification Officielle | Détail & Cause | Action Recommandée |
|---|---|---|---|
Code00 |
Échec d'authentification | Clé API (Apikey) ou Token Bearer manquant ou invalide. |
Vérifier les variables d'environnement RAYMONEY_KEY et RAYMONEY_TOKEN. |
Code01 |
Compte inactif | Le compte marchand n'est pas activé pour les encaissements. | Contacter le support RayPlusGroup ou vérifier l'activation sur client.rayplusmoney.com. |
Code02 |
Montant invalide | Le montant doit être un entier strict entre 100 et 1 000 000 XOF (pas de centimes). | S'assurer que total_amount est un entier ≥ 100 sans décimale. |
Code03 |
Adresse IP non autorisée | L'adresse IP de votre serveur n'est pas autorisée par la passerelle. | Enregistrer l'adresse IP publique de votre serveur dans votre espace client sur client.rayplusmoney.com. |
Code04 |
Erreur traitement passerelle | Erreur interne lors du traitement par la passerelle de paiement. | Vérifier le payload JSON ou réinterroger l'API avec un délai de retry. |
Code05 / Code06 |
Erreur d'envoi opérateur | Échec de transmission de la requête à l'opérateur télécom distant. | L'opérateur distant subit des lenteurs ; réessayez avec un backoff exponentiel. |
Code07 |
Aucun opérateur configuré | Aucun réseau Mobile Money actif pour cette application marchande. | Activer les opérateurs partenaires (Wave, Orange, MTN, Moov) dans votre espace client client.rayplusmoney.com. |
Code08 |
Données saisies invalides | Format du numéro de téléphone ou montant non conforme. | Vérifier le numéro (indicatif 225 sans '+' ni '0' initial) et le montant. |
Code09 |
Erreur API temporaire | Indisponibilité temporaire de l'infrastructure de paiement. | Réessayer après quelques instants. |
Code10 |
Signature manquante | Signature de sécurité absente dans l'en-tête de la requête. | Transmettre l'intégralité des en-têtes de sécurité requis. |
Code11 |
Signature invalide | La signature HMAC de la requête ne correspond pas. | Vérifier la clé secrète marchand utilisée pour le calcul du hash. |
Code12 / Code13 |
Méthode non autorisée | Méthode HTTP d'appel invalide ou interdite sur cet endpoint. | Vérifier le verbe HTTP (POST pour l'initiation, GET pour confirm). |
Code14 |
Portefeuille invalide | Identifiants du portefeuille ou wallet cible incorrects. | Vérifier les coordonnées du compte destinataire. |
Code15 |
Code OTP incorrect | Le code d'autorisation temporaire Orange Money (#144*82#) est erroné. | Inviter le client à ressaisir soigneusement le code reçu. |
Code16 |
Code OTP expiré | Le code OTP a dépassé sa durée de validité (généralement 15 minutes). | Le client doit recomposer #144*82# pour obtenir un nouveau code. |
Code17 |
Montant OTP incorrect | Le montant généré lors de l'OTP ne correspond pas au montant facturé. | Générer l'OTP avec le montant exact de la commande. |
Code18 |
Solde insuffisant | Le solde du compte Mobile Money du client est insuffisant. | Inviter le client à recharger son compte Mobile Money et réinitier. |
Wave CI / SN
Orange Money CI
MTN MoMo CI
Moov Money CI
Cartes VISA & Mastercard