Aller au contenu

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.

cinetpayrank 1timed outflutterwaverank 2capturedpawapayrank 3not callednotchpayrank 4not calledpaystackrank 5not calledtrx.8f2a
  1. 1Vous ne choisissez aucun prestataire

    Un appel porte un montant et un canal. Wajub choisit.

  2. 2Un refus n'est pas un débit

    Le payeur garde une seule référence sur toute la cascade.

  3. 3Le premier oui met fin à la cascade

    Un prestataire accepte et plus rien n'est tenté.

Un paiement quitte un checkout. Wajub utilise la liste ordonnée des connexions du compte, appelle la première et passe à la suivante si elle se bloque. Le payeur voit une seule transaction et un seul portefeuille, quelle que soit la connexion utilisée.

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écisionPrise par
Les prestataires auxquels vous êtes connectéVous, dans le Dashboard
Les canaux que chaque connexion peut traiterVous
L'ordre dans lequel les connexions sont essayéesVous, 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écisWajub
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êtentWajub

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.

AppelCe qu'il fixe
POST /paymentsLe 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.

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.

ÉtapeVérificationEn cas d'échec
1. Blocage du paysUne restriction de pays active sur votre compte couvre le pays du payeurTout le paiement s'arrête. Aucun candidat n'est chargé
2. Vos connexionsis_active, de votre côté et de celui du prestataireLa connexion est retirée
3. CanalLe prestataire peut techniquement traiter cm.mtn et votre propre liste de canaux l'autoriseRetirée
4. DeviseLa connexion répertorie cette deviseRetirée
5. DriverLe moteur contient le code de ce prestataireRetirée
6. Coupe-circuitCette route n'est pas actuellement ouverte après des échecs répétésRetiré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èglefacultatif
Une règle de routage correspondante vaut 1000, plus 500 pour chacun des critères de pays, canal, devise et plage de montants qu'elle fixe réellement, plus sa propre priorité. Une règle qui fixe les quatre vaut 3000 avant la prise en compte de sa priorité. Seule la règle au score le plus élevé est conservée pour un prestataire donné.
Coût le plus faible200facultatif
Attribué à la connexion dont les frais calculés sont les plus faibles pour ce montant et ce canal précis, ainsi qu'à toutes les connexions à égalité. Les frais proviennent du tarif négocié que vous avez saisi sur la connexion, pas de la tarification propre à Wajub.
Taux de réussite en direct50 ou 25facultatif
50 à partir de 90 %, 25 à partir de 70 %, rien en dessous. Mesuré sur les 15 dernières minutes, pour votre compte, sur ce canal et par l'intermédiaire de ce prestataire. Seuls les échecs liés au chemin sont pénalisants.

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. 1
    cinetpay
    délai opérateur dépassé8.0 s
    priority 100 · score 2550règle +2500réussite 94 % +50
  2. 2
    flutterwave
    accepté0.9 s
    priority 100 · score 225coût minimal +200réussite 88 % +25
  3. 3
    pawapay
    jamais appelée
    priority 50 · score 0
  4. notchpay

    Ignoré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énementComportement de la cascade
Un prestataire accepte, y compris avec le statut pendingElle 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 demandeElle 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ésElle passe au candidat suivant et l'échec dégrade l'état de cette route
Trois prestataires ont été essayésElle s'arrête, quel que soit le reste de la liste

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.

Réponse · 422 Unprocessable Content
{
"code": 422,
"status": "Unprocessable Content",
"message": "No eligible payment provider found for this transaction.",
"errors": {
"channel": [
"No eligible payment provider found for this transaction."
]
}
}

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.

Réponse · 402 Payment Required
{
"code": 402,
"status": "Payment Required",
"message": "Insufficient balance",
"error_code": "insufficient_funds",
"transaction": {
"id": "trx.PVrU8x2k",
"status": "pending"
}
}

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.

QuestionRé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

Que pensez-vous de ce contenu ?