Orchestration des paiements
Comment Wajub choisit un prestataire pour chaque paiement et ce que vous pouvez modifier.
Vous ne nommez jamais de prestataire dans un paiement. La requête ne contient aucun champ
provider et vous ne pouvez pas en ajouter. Pour chaque paiement live, Wajub construit une liste
ordonnée des connexions capables de le traiter. Il les essaie depuis le début et descend dans la
liste lorsqu'une connexion échoue avant d'atteindre l'opérateur.
Cette liste représente la décision d'orchestration. Cette page explique sa construction, dans l'ordre suivi par le moteur.
1Vous ne choisissez aucun prestataire
Un appel porte un montant et un canal. Wajub choisit.
2Un refus n'est pas un débit
Le payeur garde une seule référence sur toute la cascade.
3Le premier oui met fin à la cascade
Un prestataire accepte et plus rien n'est tenté.
Qui décide quoi
L'orchestration n'est pas une fonctionnalité à activer. C'est le seul chemin emprunté par un paiement live, et la répartition des responsabilités ne change jamais.
| Décision | Prise par |
|---|---|
| Les prestataires auxquels vous êtes connecté | Vous, dans le Dashboard |
| Les canaux que chaque connexion peut traiter | Vous |
| L'ordre dans lequel les connexions sont essayées | Vous, avec la priority de chaque connexion |
| La répartition du trafic entre les connexions à égalité | Vous, avec le weight de chaque connexion |
| Les connexions admissibles pour ce paiement précis | Wajub |
| La connexion placée en premier dans un palier de priorité | Wajub, selon vos règles, vos coûts et les taux de réussite en direct |
| Le moment où les tentatives s'arrêtent | Wajub |
Aucune décision de ce tableau ne peut être exprimée au moment de l'appel. Si vous avez besoin d'un prestataire précis dans un cas donné, utilisez une règle de routage ou une priorité, définie une seule fois, pas un paramètre envoyé avec la requête.
La route est décidée au deuxième appel
Un paiement nécessite deux appels. Seul le second effectue le routage.
| Appel | Ce qu'il fixe |
|---|---|
POST /payments | Le montant, la devise et le client. Aucun prestataire n'est consulté |
POST /payments/{id} | Le canal et le numéro de téléphone, et donc la route |
Cette différence vient du canal. Le routeur utilise le slug exact d'un opérateur, qui n'existe
souvent qu'une fois le numéro du payeur connu. Une requête pour cm.mobile avec le numéro
+237 6 70 00 00 00 devient cm.mtn avant même le chargement du premier candidat. Une requête qui
indique cm.mtn avec un numéro Orange est immédiatement refusée avec une réponse 422 qui précise
l'incompatibilité, au lieu d'être redirigée discrètement.
Le routeur ne reçoit jamais un canal générique
Lors de la construction de la liste des candidats, le canal est toujours le slug résolu d'un
opérateur, comme cm.mtn ou sn.wave. cm.mobile, le simple terme mobile et les termes de
produit comme mobile_money ne lui parviennent jamais. Une règle de routage portant sur
mobile_money ne correspondra donc jamais à rien.
Six filtres, puis un classement
L'admissibilité est décidée avant le calcul des scores. Chaque filtre donne une réponse simple par oui ou par non. Une connexion qui échoue à l'un d'eux n'apparaît simplement pas dans la liste.
| Étape | Vérification | En cas d'échec |
|---|---|---|
| 1. Blocage du pays | Une restriction de pays active sur votre compte couvre le pays du payeur | Tout le paiement s'arrête. Aucun candidat n'est chargé |
| 2. Vos connexions | is_active, de votre côté et de celui du prestataire | La connexion est retirée |
| 3. Canal | Le prestataire peut techniquement traiter cm.mtn et votre propre liste de canaux l'autorise | Retirée |
| 4. Devise | La connexion répertorie cette devise | Retirée |
| 5. Driver | Le moteur contient le code de ce prestataire | Retirée |
| 6. Coupe-circuit | Cette route n'est pas actuellement ouverte après des échecs répétés | Retirée et enregistrée comme ignorée avec son motif |
Deux de ces filtres sont permissifs lorsqu'ils sont vides, ce qui surprend souvent au début. Une connexion sans liste de canaux accepte tous les canaux pris en charge globalement par le prestataire. Une connexion sans liste de devises accepte toutes les devises. La restriction est un choix, pas le comportement par défaut.
La priorité ordonne la liste, le score départage seulement les égalités
Cette distinction doit être parfaitement comprise, car ces deux étapes n'ont pas la même importance.
La priorité est absolue
Les candidats sont regroupés selon l'entier priority de votre connexion. Le groupe le plus élevé
est essayé entièrement avant de passer au suivant. Une connexion de priorité 50 ne passe jamais
devant une connexion de priorité 100, quels que soient son coût, la règle qui la désigne ou ses
performances. La priorité est le seul contrôle qui n'est pas une suggestion.
La valeur par défaut est 0. Toutes les connexions d'un marchand qui n'a jamais défini de priorité
se trouvent donc dans un même palier. Leur ordre dépend entièrement du score ci-dessous.
Le score additionne trois éléments dans un même palier
Correspondance avec une règlejusqu'à 3000 + la priorité de la règlefacultatifCoût le plus faible200facultatifTaux de réussite en direct50 ou 25facultatifLe coût est quinze fois moins important que le plus fort des trois critères
Une règle entièrement définie vaut 3000, contre 200 pour la connexion la moins chère. Une règle l'emporte donc toujours sur le prix lorsqu'ils sont en désaccord. Si vous n'avez jamais saisi le coût de chaque connexion, les frais calculés sont nuls pour toutes. Toutes sont alors à égalité au coût le plus bas et reçoivent les 200 points, ce qui revient à n'en attribuer à aucune. Le routage au moindre coût ne les distingue qu'après la saisie de vos tarifs négociés dans Wajub.
Les scores identiques sont départagés par un tirage pondéré selon le weight de chaque connexion,
dont la valeur par défaut est 100. Placez deux connexions à la même priorité, avec des poids de 70
et 30. Lorsque rien d'autre ne les distingue, environ sept paiements sur dix commenceront par la
première. Le tirage décide seulement laquelle passe en premier. Les autres conservent leur ordre
derrière elle comme solutions de repli.
Une décision complète
Prenons un paiement de 25 000 XAF sur cm.mtn, pour un compte doté de quatre connexions capables
d'atteindre ce numéro et d'une règle qui associe le pays, le canal et la devise à CinetPay. Les
quatre connexions aboutissent au même portefeuille MTN. Le classement décide laquelle le prend en
charge.
Décision de routage · cm.mtn · 25 000 XAF
Quatre connexions atteignent le même portefeuille. Une était hors rotation, trois ont été classées et la deuxième a traité le paiement.
- 1

cinetpaydélai opérateur dépassé8.0 spriority 100 · score 2550règle +2500réussite 94 % +50 - 2

flutterwaveaccepté0.9 spriority 100 · score 225coût minimal +200réussite 88 % +25 - 3

pawapayjamais appeléepriority 50 · score 0 notchpayIgnorée avant le classement. Son circuit est ouvert après plusieurs échecs du chemin sur ce canal.
Lisez cette représentation depuis le bas. NotchPay n'est jamais entré dans le classement, car son circuit était ouvert. PawaPay y est entré, mais sa priorité est de 50. Il n'aurait donc été appelé qu'après l'échec des deux connexions de priorité 100. Dans le palier 100, CinetPay est passé en premier avec 2550 points contre 225 pour Flutterwave, uniquement grâce à la règle. Flutterwave était moins cher et obtenait le meilleur score sur l'ensemble coût et télémétrie, mais pas sur la règle. CinetPay a ensuite expiré sur le chemin vers l'opérateur. Cela ne dit rien sur le payeur. La cascade est donc passée à Flutterwave, qui a atteint le même portefeuille en moins d'une seconde.
Tous ces chiffres sont enregistrés pour chaque paiement. Vous les consultez dans Konsole, pas dans une réponse de l'API.
Ce qui arrête la cascade
La cascade n'est pas une politique de nouvelle tentative. C'est un seul parcours de la liste, dans
l'appel POST /payments/{id}. Quatre événements peuvent l'arrêter.
| Événement | Comportement de la cascade |
|---|---|
Un prestataire accepte, y compris avec le statut pending | Elle s'arrête. Ce prestataire prend désormais en charge le paiement |
| Le payeur refuse : portefeuille vide, mauvais numéro, plafond de l'opérateur ou expiration de la demande | Elle s'arrête. Un second prestataire poserait la même question à la même personne |
| Le chemin échoue : expiration, indisponibilité, identifiants refusés ou fonds de roulement épuisés | Elle passe au candidat suivant et l'échec dégrade l'état de cette route |
| Trois prestataires ont été essayés | Elle s'arrête, quel que soit le reste de la liste |
Aucun basculement n'a lieu après l'acceptation de la demande
Un prestataire Mobile Money renvoie pending dès que l'opérateur accepte d'afficher une demande
au client, plusieurs secondes avant toute action sur son téléphone. Cette acceptation arrête la
cascade. Si le client ne confirme jamais, le paiement échoue quelques minutes plus tard pendant
la vérification ou à la réception d'un webhook du prestataire, bien après la fin de l'exécution.
Aucun autre prestataire n'est alors essayé. Un basculement à ce stade afficherait deux demandes
sur le même téléphone. Une nouvelle tentative relève de votre décision et constitue un nouveau
paiement.
Cascade et repli décrit en détail la classification des échecs et le coupe-circuit.
Les deux façons dont le routage peut mal se terminer
Ces échecs sont différents et produisent des réponses distinctes. Le code de statut permet de les distinguer sans lire le message.
Une liste de candidats vide renvoie 422. Aucune tentative n'a eu lieu, donc aucune nouvelle
tentative ailleurs n'est possible. Aucune de vos connexions ne peut actuellement traiter ce canal
et cette devise, ou toutes celles qui le pourraient sont hors rotation.
Une liste parcourue jusqu'à son épuisement renvoie 402, tout comme un refus définitif unique tel
qu'un rejet. error_code contient le motif exploitable du prestataire lorsqu'il en existe un. Ce
n'est pas le cas lorsque tous les candidats échouent sans fournir de motif.
Notez le statut dans les deux cas. L'échec d'une tentative ne met pas fin au paiement. Celui-ci
revient à pending et le payeur peut réessayer sur le même paiement avec un autre numéro ou une
autre carte. Seul votre propre code décide si cette possibilité lui est proposée.
Ce que l'API indique et ce qu'elle n'indique pas
L'orchestration est volontairement invisible dans l'objet paiement. Connaître ses limites vous évite de chercher des champs qui n'existent pas.
| Question | Réponse |
|---|---|
| Quel prestataire a traité mon paiement ? | Cette information n'est pas dans l'API. Un paiement ne contient ni provider, ni nombre de tentatives, ni bloc de routage |
| Quel prestataire a traité mon payout ? | provider et provider_reference, sur le transfert lui-même |
| Quelles sont mes connexions et que peuvent-elles traiter ? | GET /providers, qui renvoie la connexion et ses canaux, mais pas sa priorité ni son poids |
| Comment créer une règle de routage dans le code ? | Ce n'est pas possible. Les règles sont définies dans le Dashboard |
| Pourquoi ce paiement a-t-il emprunté cette route ? | Konsole, Routing Log, un enregistrement par paiement |
La sandbox n'effectue aucun routage
Un débit dans la sandbox n'atteint jamais l'orchestrateur. Le parcours de la sandbox résout un seul prestataire synthétique. Il n'y a donc ni liste de candidats, ni évaluation des règles, ni coupe-circuit, ni donnée dans le Routing Log, ni valeur prise en compte dans les analyses. La sandbox sert à tester la structure de votre intégration. Testez le routage en live avec de petits montants.
Pages associées
- Règles de routageCe qu'une règle peut fixer et la valeur de sa correspondance.
- Cascade et repliLes échecs du chemin, les échecs du client et le coupe-circuit.
- Journal de routageLa décision à l'origine d'un paiement déjà effectué.
- Démarrage rapideModifier le routage sans changer une seule ligne du code d'intégration.