# Préface

Cette section contient des informations sur la manière d'utiliser ce document.

# Conventions utilisées dans ce document

Les conventions suivantes sont utilisées dans ce document pour identifier les types d'informations spécifiés.

Type d'information Convention Exemple
Éléments de l'API, tels que les ressources Gras /authorization
Variables Italique avec des chevrons {ID}
Termes du glossaire Italique lors de la première occurrence ; défini dans le Glossaire Le but de l’API est de permettre des transactions financières interopérables entre un Payeur (un payeur de fonds électroniques dans une transaction de paiement) situé dans un FSP (une entité qui fournit un service financier numérique à un utilisateur final) et un Bénéficiaire (un bénéficiaire de fonds électroniques dans une transaction de paiement) situé dans un autre FSP.
Documents de référence Italique Les informations utilisateur ne devraient généralement pas être utilisées par les déploiements de l’API ; les mesures de sécurité détaillées dans Signature API et Chiffrement API doivent être utilisées à la place.

# Informations sur la version du document

Version Date Description des modifications
1.0 2018-03-13 Version initiale
1.1 2020-05-19 1. Cette version contient une nouvelle option pour qu'un FSP Bénéficiaire demande une notification de validation (commit) du Switch. Le Switch doit ensuite envoyer la notification de validation à l'aide de la nouvelle requête PATCH /transfers/{ID}. L'option d'utiliser la notification de validation remplace l'ancienne option "Contrôle supplémentaire de compensation facultatif". La section décrivant cela a été remplacée par la nouvelle section "Commit Notification (Notification de validation)". La ressource transfers a été mise à jour avec la nouvelle requête PATCH, cette ressource est donc passée en version 1.1. Dans le cadre de l'ajout de la possibilité d'utiliser une notification de validation, les changements suivants ont été apportés :
a. PATCH a été ajouté comme méthode HTTP autorisée dans la section 3.2.2. b. Le flux d’appel pour PATCH est décrit dans la section 3.2.3.5.
c. Le tableau 6 en section 6.1.1 a été mis à jour pour inclure PATCH comme méthode HTTP possible.
d. La section 6.7.1 contient la nouvelle version de la ressource transfers.
e. La section 6.7.2.6 décrit le processus d’utilisation des notifications de validation
f. La section 6.7.3.3 décrit la nouvelle requête PATCH /transfers/{ID}.

2. En plus des changements mentionnés ci-dessus concernant la notification de validation, les modifications suivantes n'affectant pas l'API ont été apportées :
a. Figure 6 mise à jour car elle contenait une erreur de copier-coller.
b. Ajout de la section 6.1.2 pour fournir une vue complète de la version actuelle de chaque ressource.
c. Ajout d'une section pour chaque ressource afin de voir l’historique des versions de ressource.
d. Corrections éditoriales mineures.

3. Les descriptions de deux des champs d'en-tête HTTP du Tableau 1 ont été mises à jour pour ajouter plus de spécificité et de contexte
a. La description du champ d'en-tête FSPIOP-Destination a été mise à jour pour indiquer qu'il doit rester vide si la destination n'est pas connue de l'émetteur original, mais dans tous les autres cas, doit être ajouté par l'émetteur original de la requête.
b. La description du champ d'en-tête FSPIOP-URI a été rendue plus spécifique.

4. Les exemples utilisés dans ce document ont été mis à jour pour utiliser la bonne interprétation du type complexe ExtensionList défini dans le Tableau 84. Ceci n'implique pas de changement en soi.
a. L’exemple 5 a été mis à jour à ce sujet.

5. Le modèle de données est mis à jour pour ajouter un élément optionnel ExtensionList au type complexe PartyIdInfo selon la demande de changement : https://github.com/mojaloop/mojaloop-specification/issues/30. Par conséquent, le modèle de données comme spécifié dans le Tableau 103 a été mis à jour. Pour plus de cohérence, le modèle de données pour les appels POST /participants/{Type}/{ID} et POST /participants/{Type}/{ID}/{SubId} dans le Tableau 10 a également été mis à jour pour inclure l’élément optionnel ExtensionList.

6. Une nouvelle section 6.5.2.2 est ajoutée pour décrire le processus impliqué dans le rejet d’un devis.

7. Une note est ajoutée à la Section 6.7.4.1 pour clarifier l’utilisation de l’état ABORTED dans les callbacks PUT /transfers/{ID}.
1.1.1 2021-09-22 Cette version du document ajoute uniquement des informations sur les en-têtes HTTP optionnels relatifs à la prise en charge de la traçabilité dans Table 2, voir Distributed Tracing Support for OpenAPI Interoperability pour plus d’informations. Aucun changement n’est apporté à aucune ressource dans cette version.

# Introduction

Ce document introduit et décrit l’API ouverte (Interface de Programmation Applicative) pour l’interopérabilité des Fournisseurs de Services Financiers (FSP), appelée ci-après « l’API ». L'objectif de l'API est de permettre des transactions financières interopérables entre un Payeur (un payeur de fonds électroniques dans une transaction de paiement) situé dans un FSP (une entité qui fournit un service financier numérique à un utilisateur final) et un Bénéficiaire (un destinataire de fonds électroniques dans une opération de paiement) situé dans un autre FSP. L'API ne précise aucun service frontal entre un Payeur ou un Bénéficiaire et son propre FSP ; tous les services définis dans l'API sont entre FSPs. Les FSPs sont connectés soit (a) directement entre eux, soit (b) par un Switch placé entre les FSPs pour router les transactions financières vers le FSP approprié.

Le transfert de fonds d'un Payeur à un Bénéficiaire doit être effectué en quasi temps réel. Dès qu'une transaction financière a été acceptée par les deux parties, elle est réputée irrévocable. Cela signifie qu'une transaction terminée ne peut pas être annulée dans l'API. Pour annuler une transaction, une nouvelle transaction de remboursement inverse doit être créée à partir du Bénéficiaire de la transaction d'origine.

L'API est conçue pour être suffisamment générique pour prendre en charge de nombreux cas d'utilisation et l’extensibilité de ceux-ci. Cependant, elle doit contenir suffisamment de détails pour permettre une implémentation sans ambiguïté.

La version 1.0 de l'API est conçue pour être utilisée dans un pays ou une région ; les envois internationaux nécessitant des opérations de change ne sont pas pris en charge. Cette version contient également une prise en charge de base du protocole Interledger, qui sera utilisé dans les futures versions de l’API pour gérer les transactions multi-devises et multi-intermédiaires.

Ce document :

# Spécification Open API pour l’Interopérabilité FSP

La spécification Open API pour l’Interopérabilité FSP inclut les documents suivants.

# Documents logiques

# Documents de liaison REST asynchrone

# Intégrité des données, confidentialité et non-répudiation

# Documents généraux


# Définition de l’API

Cette section introduit la technologie utilisée par l’API, incluant :

# Caractéristiques générales

Cette section décrit les caractéristiques générales de l’API.

# Style architectural

L’API est basée sur le style architectural REST (REpresentational State Transfer1). Il existe cependant quelques différences avec une implémentation REST typique. Ces différences incluent :

  • API totalement asynchrone : pour pouvoir gérer de nombreux processus longs concurrents et avoir un mécanisme unique de gestion des requêtes, tous les services API sont asynchrones. Exemples :

    • Transactions financières en lots
    • Une transaction financière nécessitant une interaction utilisateur
  • Décentralisée : les services sont décentralisés, il n’existe pas d’autorité centrale pour piloter une transaction.

  • Orientée service : les ressources proposées par l’API sont relativement orientées service comparées à une API REST classique.

  • Pas entièrement sans état : certaines informations d’état doivent être conservées à la fois côté client et côté serveur durant le processus de transaction.

  • Le client détermine l’identifiant commun : dans une implémentation REST typique (avec distinction claire client/serveur), c’est le serveur qui génère l’ID lors de la création de l’objet. Dans cette API, un devis ou une transaction financière réside à la fois dans le FSP du Payeur et du Bénéficiaire, car les services sont décentralisés. Il est donc nécessaire d’avoir un identifiant commun pour l’objet. Les raisons en sont doubles :

    • L’ID commun est utilisé dans l’URI du callback asynchrone vers le client. Le client sait donc à quelle URI écouter pour le callback correspondant à la requête.
    • Le client peut utiliser l’ID commun dans une requête HTTP GET directement s’il ne reçoit pas de callback depuis le serveur (voir Détails HTTP pour plus d’informations).

    Pour maintenir l’unicité des IDs communs, chacun est défini comme un UUID (Identifiant Universel Unique2). Pour garantir encore plus l’unicité, il est recommandé au serveur d’associer chaque ID d’objet à l’ID FSP du client. Si un serveur reçoit tout de même un ID commun non unique lors d’une requête HTTP POST (voir Détails HTTP pour plus de détails), la requête doit être gérée comme indiqué dans la section Services idempotents côté serveur.

# Protocole de niveau applicatif

HTTP, tel que défini dans RFC 72303, est utilisé comme protocole de niveau applicatif dans l’API. Toute communication en environnement de production doit être sécurisée en utilisant HTTPS (HTTP sur TLS4). Pour plus de détails, voir Détails HTTP.

# Syntaxe URI

La syntaxe des URIs suit la RFC 39865 pour identifier les ressources et services proposés par l’API. Cette section introduit et précise les sujets d’implémentation propres à chaque partie de la syntaxe.

Une URI générique a la forme présentée dans Exemple 1, où la partie [user:password@]host[:port] correspond à la partie Authority décrite dans la section Authority. {resource}.

# Exemple 1
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

Exemple 1 -- Format générique d’URI

# Scheme

Conformément à la section Protocole de niveau applicatif, le scheme sera toujours soit http, soit https.

# Autorité

La partie d’autorité consiste en une partie d’authentification optionnelle (User Information), une partie hôte obligatoire, suivie d’un port optionnel.

# Informations utilisateur

Les informations utilisateur ne devraient généralement pas être utilisées par les déploiements API ; les mesures de sécurité détaillées dans Signature API et Chiffrement API doivent être utilisées à la place.

# Hôte

L’hôte correspond à l’adresse du serveur. Il peut s’agir d’une adresse IP ou d’un nom d’hôte. Elle variera (généralement) selon le déploiement.

# Port

Le numéro de port est optionnel ; par défaut, le port HTTP est 80 et HTTPS 443, mais d’autres ports peuvent être utilisés. Le port à utiliser peut différer selon le déploiement.

# Chemin (Path)

Le chemin pointe vers une ressource ou un service effectif de l’API. Les ressources de l’API sont :

  • participants
  • parties
  • quotes
  • transactionRequests
  • authorizations
  • transfers
  • transactions
  • bulkQuotes
  • bulkTransfers

Toutes les ressources ci-dessus sont également organisées de façon hiérarchique, séparées par un ou plusieurs slash ('/'). Les ressources supportent différents services selon la méthode HTTP utilisée. Toutes les ressources et services API supportés, avec URI et méthode HTTP, figurent dans le tableau 6.

# Query

La partie query est optionnelle ; elle n’est actuellement utilisée et prise en charge que par certains services de l’API. Voir les ressources API dans la section Services API pour plus de détails sur les services qui prennent en charge les chaînes de requête. Tous les autres services doivent ignorer toute chaîne de requête reçue, car des chaînes de requête pourront être ajoutées dans de futures versions mineures de l’API (voir Méthodes HTTP).

S’il y a plusieurs paires clé-valeur dans la chaîne de requête, celles-ci doivent être séparées par l’esperluette ('&').

L'exemple 2 montre un exemple d’URI issue de la ressource /authorization, où quatre paires clé-valeur différentes sont présentes, séparées par l’esperluette.

# Exemple 2
/authorization/3d492671-b7af-4f3f-88de-76169b1bdf88?authenticationType=OTP&retriesLeft=2&amount=102&currency=USD

Exemple 2 -- URI contenant plusieurs paires clé-valeur dans la chaîne de requête

# Fragment

Le fragment est une partie optionnelle d’une URI. Il n’est pris en charge par aucun service de l’API et doit donc être ignoré s’il est reçu.

# Normalisation et comparaison d’URI

Comme précisé dans la RFC 72306, les parties scheme) et hôte) de l’URI doivent être considérées comme insensibles à la casse. Toutes les autres parties doivent être traitées en tenant compte de la casse.

# Jeu de caractères

Le jeu de caractères doit toujours être supposé UTF-8, défini dans 36297. Il n’est donc pas nécessaire de l’indiquer dans les en-têtes HTTP (voir Champs d’en-tête HTTP). Aucun autre jeu de caractères que UTF-8 n’est pris en charge par l’API.

# Format d’échange de données

L’API utilise JSON (JavaScript Object Notation), défini dans RFC 71598, comme format d’échange. JSON est ouvert, léger, lisible et indépendant de la plateforme, bien adapté pour l’échange de données entre systèmes.


# Détails HTTP

Cette section contient des informations détaillées concernant l’utilisation du protocole HTTP dans l’API.

# Champs d’en-tête HTTP

Les en-têtes HTTP sont généralement décrits dans la RFC 72309. Les deux sections suivantes décrivent les champs d’en-tête HTTP qui doivent être attendus et mis en œuvre dans l’API.

L’API prend en charge une taille maximale de 65536 octets (64 kilooctets) dans l’en-tête HTTP.

# Champs d’en-tête HTTP de requête

Le tableau 1 contient les champs d’en-tête HTTP de requête qui doivent être supportés par les implémentations de l’API. Une implémentation doit également s’attendre à d’autres champs d’en-tête HTTP standards et non standards non listés ici.

# Tableau 1
Champ Exemples de valeurs Cardinalité Description
Accept application/vnd.interoperability.resource+json 0..1
Obligatoire dans une requête client. Non utilisé dans un callback du serveur.
Le champ d’en-tête Accept10 indique la version de l’API que le client souhaite utiliser côté serveur. Voir En-tête Accept HTTP pour demander une version spécifique de l’API.
Content-Length 3495 0..1 Le champ Content-Length11 indique la taille attendue du corps de la requête. Présent seulement s’il y a un corps.
Note : l’API autorise une taille maximale de 5 Mo (5242880 octets).
Content-Type application/vnd.interoperability.resource+json;version=1.0 1 Content-Type12 indique la version spécifique de l’API utilisée pour envoyer le corps de la requête. Voir Version acceptée demandée par le client pour plus d’informations.
Date Tue, 15 Nov 1994 08:12:31 GMT 1 Le champ Date13 indique la date à laquelle la requête a été envoyée.
X-Forwarded-For X-Forwarded-For: 192.168.0.4, 136.225.27.13 1..0 Le champ X-Forwarded-For14 est une norme officieuse utilisée pour indiquer l’IP d’origine du client à titre informatif, une requête pouvant passer par plusieurs proxys, pare-feux, etc. Plusieurs valeurs X-Forwarded-For comme dans l’exemple doivent être attendues et supportées.
Note : Une alternative à X-Forwarded-For est définie dans RFC 723915. Cependant, en 2018, RFC 7239 est moins utilisé/supporté que X-Forwarded-For.
FSPIOP-Source FSP321 1 Le champ d’en-tête FSPIOP-Source est un champ non standard HTTP utilisé par l’API pour identifier l’émetteur de la requête HTTP. Il doit être placé par l’émetteur original de la requête. Nécessaire pour le routage (voir Routage des flux d'appels avec FSPIOP-Destination et FSPIOP-Source) et la vérification de signature (FSPIOP-Signature).
FSPIOP-Destination FSP123 0..1 Le champ FSPIOP-Destination est non standard HTTP, utilisé pour le routage (via en-tête HTTP) des requêtes/réponses vers la destination. Il doit être défini par l’émetteur initial de la requête, si la destination est connue (valable pour tous les services sauf GET /parties), afin que les entités intermédiaires n’aient pas à parser le corps pour le routage (voir Routage). Si la destination n’est pas connue (valable pour GET /parties), ce champ doit rester vide.
FSPIOP-Encryption 0..1 Champ non standard HTTP utilisé pour le chiffrement de bout en bout de la requête.
Voir Chiffrement API.
FSPIOP-Signature 0..1 Champ non standard, utilisé pour la signature de bout en bout de la requête.
Voir Signature API.
FSPIOP-URI /parties/msisdn/123456789 0..1 Champ non standard HTTP utilisé pour la vérification de la signature, contient l’URI du service. Obligatoire si la signature est utilisée.
Dans le contexte de l’API Mojaloop FSPIOP, la valeur FSPIOP-URI commence au service dans l’URI. Par exemple, si l’URL est http://stg-simulator.moja.live/payerfsp/participants/MSISDN/123456789, alors la valeur FSPIOP-URI est « /participants/MSISDN/123456789 ».
FSPIOP-HTTP-Method GET 0..1 Champ non standard HTTP utilisé pour la vérification de la signature : doit contenir la méthode HTTP du service utilisé. Obligatoire si la signature est utilisée, voir Signature API.

Tableau 1 -- Champs d’en-tête HTTP de requête obligatoires

Le tableau 2 liste les champs d’en-tête de requête HTTP dont la prise en charge par les implémentations de l’API est optionnelle.

# Tableau 2
Champ Exemples de valeurs Cardinalité Description
traceparent 00-91e502e28cd723686e9940bd3f378f85-b0f903d000944947-01 0..1 L’en-tête traceparent représente la requête entrante dans un système de traçage dans un format commun. Voir Distributed Tracing Support for OpenAPI Interoperability pour plus d’information.
tracestate banknrone=b0f903d0009449475 0..1 Fournit des informations de traçage spécifiques au fournisseur et prend en charge plusieurs traces distribuées. Voir Distributed Tracing Support for OpenAPI Interoperability pour plus d’information.

Tableau 2 -- Champs d’en-tête HTTP de requête optionnels

# Champs d’en-tête HTTP de réponse

Le tableau 3 contient les champs d’en-tête HTTP de réponse obligatoires. Une implémentation peut aussi recevoir d’autres en-têtes HTTP standards ou non standards non listés ici.

# Tableau 3
Champ Exemples de valeurs Cardinalité Description
Content-Length 3495 0..1 Champ Content-Length16 indiquant la taille attendue du corps. Envoyé uniquement si corps présent.
Content-Type application/vnd.interoperability.resource+json;version=1.0 1 Champ Content-Type17 indiquant la version de l’API utilisée pour envoyer le corps. Voir Section 3.3.4.2 pour plus de détails.

Tableau 3 -- Champs d’en-tête HTTP de réponse

# Méthodes HTTP

Les méthodes HTTP suivantes, telles que définies dans RFC 723118, sont supportées par l’API :

  • GET : utilisée par le client pour demander des informations sur un objet précédemment créé côté serveur. Comme tous les services API sont asynchrones, la réponse directe à la requête GET ne contient pas l’objet demandé : cet objet viendra en callback dans une requête PUT.

  • PUT : utilisée comme callback à une précédente requête GET, POST ou DELETE émise par le client. Le callback contient soit :

    • Informations sur l’objet précédemment créé (POST) ou informations demandées (GET)
    • Accusé de réception de suppression d’un objet (DELETE)
    • Informations d’erreur si la requête POST ou GET n’a pu être traitée côté serveur
  • POST : utilisée par le client pour demander la création d’un objet côté serveur. Comme l’API est asynchrone, la réponse directe ne contient pas l’objet : celui-ci viendra en callback via un PUT.

  • DELETE : utilisée pour demander la suppression d’un objet côté serveur. DELETE ne doit être supporté qu’au sein d’un système commun Account Lookup System (ALS) pour supprimer des informations sur une Party (détenteur de compte chez un FSP) précédemment ajoutée ; aucun autre type d’objet ne peut être supprimé. Comme tous les services sont asynchrones, la réponse à DELETE ne contient pas l’accusé de réception final : celui-ci viendra via un callback en PUT.

  • PATCH : utilisée pour notifier une mise à jour d’un objet existant. Comme l’API est asynchrone, la réponse à PATCH ne contient pas de corps : cette méthode sert de notification et ne génère pas de callback.


# Séquencement HTTP

Tous les séquences et services sont asynchrones. Aucun service ne supporte le mode synchrone.

# Appel POST HTTP

La figure 1 montre le cas normal de création d’un objet dans un FSP pair via HTTP POST. Le service /service du schéma doit être remplacé par n’importe lequel des services du Tableau 6 supportant POST.

# Figure 1

Figure 1 — Séquence d’appel POST HTTP

# Appel GET HTTP

La figure 2 montre le cas d’obtention d’informations sur un objet dans un FSP pair via HTTP GET. Le service /service/{ID} doit être remplacé par n’importe quel service listé dans Tableau 6 prenant en charge GET.

# Figure 2

Figure 2 — Séquence d’appel GET HTTP

# Appel DELETE HTTP

La figure 3 décrit l’appel d’API pour supprimer des informations FSP sur une Party via HTTP DELETE dans un ALS. Le service /service/{ID} doit être remplacé par un service du Tableau 6 prenant en charge DELETE. DELETE n’est géré que par un ALS commun (c’est pourquoi l’ALS n’apparaît que côté serveur dans la figure).

# Figure 3

Figure 3 — Séquence d’appel DELETE HTTP

Remarque : il est également possible que les requêtes vers l’ALS passent par un Switch, ou que l’ALS et le Switch soient le même serveur.

# Callback PUT HTTP

Le PUT HTTP est toujours utilisé comme callback sur une requête POST, GET ou DELETE.

Le flux d’appel d’une requête PUT et de la réponse peut être observé dans les figures 1, 2 et 3 indiquées précédemment.

# Séquence PATCH HTTP

La figure 4 montre un exemple de séquence pour le PATCH HTTP, utilisé pour envoyer une notification. D’abord, un objet est créé via un POST depuis le Switch. L’objet est créé dans le FSP à l’état non finalisé. Le FSP demande ensuite à être notifié de l’état final par le Switch via un callback PUT avec l’état non finalisé. Le Switch gère le callback et envoie la notification d’état finalisé via un PATCH. La seule ressource supportant PATCH est /transfers.

# Figure 4

Figure 4 — Séquence PATCH HTTP

Remarque : les requêtes vers l’ALS peuvent aussi être routées via un Switch, voire ALS et Switch peuvent être le même serveur.

# Routage des flux d'appels avec FSPIOP-Destination et FSPIOP-Source

Les en-têtes HTTP non standard FSPIOP-Destination et FSPIOP-Source servent au routage et à la vérification de signature (voir Signature API). La figure 5 montre l’usage de ces en-têtes dans un appel POST /service abstrait, lorsque le FSP de destination est connu.

# Figure 5

Figure 5 — Usage des en-têtes HTTP personnalisés FSPIOP-Destination et FSPIOP-Source

Pour certains services avec un Switch, la destination n’est pas connue. Par exemple, un FSP envoie un GET /parties au Switch sans savoir quel autre FSP détient la Party (voir Section 6.3.2). FSPIOP-Destination sera alors vide (ou défini à l’ID du Switch) émis depuis le FSP, et renseigné à sa vraie valeur par le Switch lors du routage. Voir Figure 6 pour illustration.

# Figure 6

Figure 6 — Exemple : FSPIOP-Destination inconnu pour le FSP


# Codes de statut HTTP de réponse

L’API prend en charge les codes HTTP de réponse indiqués dans le tableau 4 :

# Tableau 4
Code Raison Description
200 OK Réponse standard pour une requête réussie. Utilisé dans l’API en réponse à un callback pour marquer la complétion d’un service asynchrone.
202 Accepted La requête a été acceptée pour un traitement ultérieur côté serveur, sans garantie de succès. Utilisé comme accusé de réception d’une requête asynchrone.
400 Bad Request L’application ne peut pas traiter la requête : syntaxe incorrecte ou corps dépassant la taille autorisée.
401 Unauthorized La requête nécessite une authentification.
403 Forbidden La requête a été refusée et sera systématiquement refusée à l’avenir.
404 Not Found La ressource indiquée dans l’URI n’a pas été trouvée.
405 Method Not Allowed Méthode HTTP non supportée ; voir Tableau 6 pour les méthodes autorisées par service.
406 Not acceptable Le serveur ne peut générer de contenu conformément à l’en-tête Accept reçu ; cela indique qu'il ne supporte pas la version demandée.
501 Not Implemented Le serveur ne supporte pas le service demandé. Le client ne doit pas retenter.
503 Service Unavailable Le serveur n’est actuellement pas disponible pour de nouvelles requêtes. Cela devrait être temporaire : le client doit retenter dans un temps raisonnable.

Tableau 4 — Codes de statut HTTP supportés dans l’API

Tout code de statut HTTP 3xx20 retourné côté serveur ne doit pas faire l'objet d'une nouvelle tentative et requiert une investigation manuelle.

Une implémentation de l’API doit aussi savoir gérer d’autres erreurs non listées, en particulier si la requête passe par des proxies.

Comme toutes les requêtes API sont asynchrones, les codes d’erreur HTTP serveur supplémentaires (5xx21 non définis au tableau 4) ne sont pas utilisés par l’API elle-même. Toute erreur serveur lors du traitement réel sera notifiée via un callback d’erreur au client (voir Section 9.2).


# Informations d’erreur en réponse HTTP

En plus du code HTTP, toutes les réponses d’erreur HTTP (4xx et 5xx) peuvent contenir un élément ErrorInformation, défini dans la section ErrorInformation. Cet élément doit, si possible, permettre de fournir plus d’informations au client.


# Services idempotents côté serveur

Tout service supportant GET doit être idempotent : la même requête peut être envoyée plusieurs fois sans changer l’objet. (L’état de l’objet côté serveur peut toutefois évoluer : par exemple, l’état d’une transaction peut changer, mais le FSP envoyant GET ne peut changer l’état).

Tout service supportant POST doit aussi être idempotent si le client réutilise le même identifiant. Le serveur ne doit pas créer un nouvel objet s’il reçoit à nouveau la même requête POST. Ceci facilite la gestion de la reprise après erreur côté client, mais impose des contraintes au serveur — voir l’exemple ici.

# Analyse des duplicats côté serveur lors de la réception d’un POST

Lors de la réception d’une requête côté serveur, il doit vérifier si un objet de service portant le même identifiant existe déjà : par exemple, si le client a déjà envoyé POST /transfers avec le même transferId. Si l’objet existe déjà, le serveur vérifie si ses paramètres correspondent à ceux de la nouvelle requête.

  • Si l’objet existant a les mêmes paramètres que la nouvelle requête, on considère qu’il s’agit d’un renvoi de la part du client.

    • Si le serveur n’a pas encore traité la requête précédente/créée et n’a donc pas envoyé de callback, la nouvelle requête peut être ignorée (un callback va être envoyé de toute façon).
    • Si le serveur a fini de traiter l’ancienne requête et a déjà envoyé un callback, un nouveau callback doit être envoyé, comme si une requête GET avait été reçue.
  • Si l’ancien objet n’a pas les mêmes paramètres que la requête, un callback d’erreur expliquant qu’un objet avec le même identifiant existe déjà mais avec des paramètres différents doit être envoyé au client.

Pour simplifier cette analyse, il est recommandé de stocker un hash de toutes les requêtes POST reçues côté serveur afin de les comparer facilement lors de réceptions ultérieures.


# Gestion des versions de l’API

La stratégie de développement de l’API est de maintenir la compatibilité ascendante entre l’API et ses ressources/services au maximum, cependant des changements doivent être attendus par les parties qui implémentent. La gestion des versions de l’API est propre à chaque ressource (par exemple : /participants, /quotes, /transfers).

Il existe deux types de versions de ressource API : les versions mineures (rétrocompatibles), et majeures (non rétrocompatibles).

  • À chaque changement des caractéristiques de l’API impactant un service, la ressource concernée voit sa version augmentée (mineure ou majeure selon la compatibilité).
  • Un changement dans un service spécifique voit sa ressource correspondante recevoir une nouvelle version.

Le format de la version de ressource est x.yx est le numéro majeur, y le mineur. À chaque nouvelle version majeure, la version mineure repart à 0. La version initiale de chaque ressource est 1.0.

# Changements n’affectant pas la version de ressource API

Certains changements n’affecteront pas la version, par exemple : modification de l’ordre des paramètres d’une requête ou d’un callback.

# Changement mineur de version de ressource

Les modifications suivantes sont considérées comme rétrocompatibles. Les implémenteurs doivent concevoir client/serveur pour les accepter d’emblée sans casse fonctionnelle :

  • Ajout de paramètres d’entrée facultatifs (chaînes de requête, etc.)
  • Ajout de paramètres facultatifs dans une requête ou un callback
  • Ajout de codes d’erreur

Ces changements affectent la version mineure.

# Changement majeur de version de ressource

Les modifications ci-après sont considérées comme rétro-incompatibles. L’implémenteur n’a PAS à garantir la prise en charge automatique :

  • Suppression ou ajout de paramètres obligatoires
  • Paramètres facultatifs devenant obligatoires
  • Renommage de paramètres
  • Changement de types de données
  • Changement de logique métier
  • Modification des URI de ressource/service

Cette liste n’est pas exhaustive.

# Négociation de version entre client et serveur

L’API prend en charge une négociation basique par HTTP content negotiation. Un client doit envoyer la version de ressource API souhaitée dans l’en-tête Accept (voir En-tête Accept HTTP). Si le serveur supporte cette version, elle est utilisée au callback (Version acceptable…). Si le serveur ne la supporte pas, il doit répondre HTTP 40622 avec une liste des versions supportées (Version non acceptable…).

# En-tête Accept HTTP

Voir ci-dessous un exemple de requête HTTP simplifiée avec seulement l’en-tête Accept23. Il convient de l’utiliser pour un client souhaitant une version majeure précise d’une ressource. Exemple 3 : « Je souhaite la version majeure 1, sinon donne la dernière ».

# Exemple 3
POST /service HTTP/1.1
Accept: application/vnd.interoperability.{resource}+json;version=1,
application/vnd.interoperability.{resource}+json

{
    ...
}

Exemple 3 — En-tête HTTP Accept : requête pour la version 1 ou la dernière supportée

Pour l’exemple de l’exemple 3 :

  • POST /service doit être remplacé par n’importe quelle méthode HTTP et le service associé (voir Tableau 6).
  • L’en-tête Accept indique la version de ressource API que le client souhaite utiliser.
    • Le type d’application est toujours application/vnd.interoperability.{resource}{resource} est la vraie ressource (participants, quotes, ...).
    • Le seul format d’échange de données actuellement supporté est json.
    • Pour n’importe quelle version mineure d’une version majeure : envoyer uniquement la version majeure : version=1 ou version=2.
    • Pour une version mineure précise : utiliser version=1.2 ou version=2.8. L’utilisation d’une version majeure.mineure spécifique est à éviter habituellement (les versions mineures étant rétrocompatibles).

# Version acceptable demandée par le client

Si le serveur supporte la version API demandée via Accept, il doit utiliser cette version dans le callback. La version majeure.mineure utilisée doit toujours être indiquée dans l’en-tête Content-Type, même si le client n’a demandé que la majeure. Par exemple (voir exemple 4) : version 1.0 utilisée :

# Exemple 4
Content-Type: application/vnd.interoperability.resource+json;version=1.0

Exemple 4 — Champ HTTP Content-Type

# Version non acceptable demandée par le client

Si le serveur ne supporte pas la version demandée dans Accept, il doit répondre HTTP 406 pour signifier l’absence de support.

Remarque : il est aussi possible que cette information soit envoyée via un callback d’erreur et non directement — par exemple si la requête passe via un Switch qui supporte la version, mais que le FSP de destination non.

En plus du HTTP 406, les versions supportées doivent figurer dans la liste des extensions de l’erreur, avec le numéro majeur comme clé et le mineur comme valeur. Voir exemple 5 : « Je ne supporte pas la version demandée, mais je supporte 1.0, 2.1 et 4.2. »

# Exemple 5
{
    "errorInformation": {
        "errorCode": "3001",
        "errorDescription": "Le client a demandé une version non supportée, voir la liste d'extensions pour les versions supportées.",
        "extensionList": {
            "extension":
            [
                { "key": "1", "value": "0"},
                { "key": "2", "value": "1"},
                { "key": "4", "value": "2"}
            ]
        }
    }
}

Exemple 5 — Message d’erreur : la version demandée n’est pas supportée


# Protocole Interledger

La version actuelle de l’API introduit une prise en charge basique du protocole Interledger (ILP), à travers l’implémentation concrète du protocole Interledger Payment Request24 dans la ressource API /quotes et /transfers.

# Plus d’informations

Ce document contient les informations ILP utiles à l’API. Pour davantage d’informations, consultez le site du projet Interledger25, le livre blanc Interledger26, et la spécification Interledger architecture27.

# Introduction à Interledger

ILP est une norme pour l’interconnexion des réseaux de paiement. De la même façon que le protocole IP constitue les bases pour la transmission et l’adressage entre réseaux de données différents, ILP définit des bases pour l’adressage des transactions financières et le transfert de valeur entre comptes sur différents réseaux de paiement.

ILP n’est pas un scheme en soi. C’est un ensemble de standards qui, s’il est mis en œuvre par plusieurs schemes de paiement, permettra leur interopérabilité. Par conséquent, implémenter ILP implique d’adapter un scheme existant à ces standards. Cela implique notamment que les transferts se fassent en deux phases (réserve et validation) et la définition d’une correspondance entre les comptes du scheme et le système d’adressage mondial ILP. Cela peut se faire en modifiant le scheme lui-même, ou via des entités qui fournissent une compatibilité ILP via des adaptateurs.

Les prérequis pour un paiement ILP sont l’adresse ILP du Bénéficiaire (voir Adressage ILP) et la condition (voir Transferts conditionnels). Dans la version actuelle de l’API, ces deux informations doivent être renvoyées par le FSP Bénéficiaire lors d’un devis (/quotes).

# Adressage ILP

Un composant clé du standard ILP est le système d’adressage28. Il s’agit d’un système hiérarchique définissant une ou plusieurs adresses pour chaque compte d’un registre.

Le tableau 5 donne des exemples d’adresses ILP dans différents scénarios. À noter : la structure est standardisée, le contenu non, sauf pour le premier segment (avant le premier point).

# Tableau 5
Adresse ILP Description
g.tz.fsp1.msisdn.1234567890 Un compte mobile money chez FSP1 pour l’utilisateur de MSISDN 1234567890.
g.pk.fsp2.ac03396c-4dba-4743 Un compte mobile money chez FSP2 identifié par un ID opaque.
g.us.bank1.bob Un compte bancaire chez Bank1 pour l’utilisateur bob.

Tableau 5 — Exemples d’adresses ILP

Le but principal d’une adresse ILP est d’identifier un compte et de router une transaction financière vers ce compte.

Remarque : Une adresse ILP ne doit pas servir à identifier une contrepartie dans l’API d’interopérabilité. Voir la section Remboursement pour l’adressage d’une Party dans l’API.

Penser à une adresse ILP comme à une adresse IP : jamais vue par l’utilisateur final, mais utilisée côté système pour router une transaction et identifier un compte. Un même compte aura souvent plusieurs adresses ILP. Le système qui tient le compte peut suivre toutes ou seulement une partie si elles partagent un préfixe commun.

# Transferts conditionnels

ILP se base sur les transferts conditionnels, où tous les registres impliqués dans une transaction financière peuvent d’abord réserver des fonds du compte Payeur puis, plus tard, les déposer dans celui du Bénéficiaire. Le transfert du Payeur au Bénéficiaire dépend de la présentation d’un accomplissement (fulfilment) qui respecte la condition associée à la requête d’origine.

Pour supporter les transferts conditionnels, un registre doit permettre d’attacher une condition et une expiration à chaque transfert. Le registre doit réserver les fonds du compte Payeur, puis attendre l’un des événements suivants :

  • L’accomplissement de la condition est soumis au registre : les fonds sont crédités sur le compte du Bénéficiaire.
  • L’expiration est atteinte, ou la transaction est rejetée (par le Bénéficiaire, son FSP…). Le transfert est alors annulé et les fonds remis au Payeur.

Lorsqu’un accomplissement est soumis, le registre doit s’assurer qu’il satisfait bien la condition associée à la requête. Si oui, le transfert est validé ; sinon, il est refusé, et reste en attente jusqu’à obtention d’un accomplissement valide ou expiration.

ILP supporte différentes conditions, mais les implémenteurs de l’API doivent utiliser le hash SHA-256 d’un pré-image de 32 octets. La condition jointe au transfert est le SHA-256, l’accomplissement étant le pré-image. Ainsi, quand la condition jointe est un SHA-256, une fois un accomplissement soumis, le registre le valide en calculant son SHA-256 et vérifiant qu’il correspond.

Voir Interledger Payment Request pour des informations concrètes sur la génération de l’accomplissement (fulfilment) et de la condition.

# Paquet ILP

Le paquet ILP sert à emballer des données de bout en bout pouvant être transmises service par service. Il est inclus comme champ dans les requêtes « hop by hop » et ne doit jamais être modifié par un intermédiaire. L'intégrité du paquet est liée à celle du transfert de fonds, car le déclencheur de validation (fulfilment) est généré à partir d'un hash du paquet.

Le paquet a un format binaire strict, car il peut transiter par des systèmes à haut débit/volume, qui doivent lire l’adresse ILP et le montant depuis les headers, sans avoir à interpréter le champ data du paquet (voir Exemple 6). Comme ils ne doivent pas l’interpréter, ce champ reste au format octet variable dans la définition. Voir Interledger Payment Request pour le détail sur la manière de peupler ce champ dans l’API.

Le paquet ILP relie les transferts livre à livre qui composent tout paiement ILP. Il est parsé par le destinataire du premier transfert, utilisé pour savoir vers où router le suivant et pour quel montant, lui est passé, etc., jusqu’au Bénéficiaire final qui fournit l’accomplissement, ce qui valide les transferts en chaîne, du dernier au premier.

Le format du paquet ILP est défini en ASN.129 (Abstract Syntax Notation One), voir Exemple 6. L’encodage se fait avec les règles canoniques Octet Encoding Rules.

# Exemple 6
InterledgerProtocolPaymentMessage ::= SEQUENCE {
    -- Montant qui doit être reçu à destination : amount UInt64,
    -- Adresse ILP destinataire : account Address,
    -- Information pour le destinataire (couche de transport) : data OCTET STRING (SIZE (0..32767)),
    -- Extensibilité ASN.1
    extensions SEQUENCE {
        ...
    }
}

Exemple 6 — Format du paquet ILP en ASN.1

Remarque : Les seuls éléments obligatoires sont le montant à transférer au Bénéficiaire et son adresse ILP.


# Fonctionnalités courantes de l'API

Cette section décrit les fonctionnalités communes utilisées par l'API, incluant :

# Devis (Quoting)

Le devis est le processus qui détermine les frais et les commissions nécessaires pour effectuer une transaction financière entre deux FSP. Il est toujours initié par le FSP Payeur vers le FSP Bénéficiaire, ce qui signifie que le devis circule dans le même sens qu'une transaction financière.

Deux modes différents pour établir un devis entre FSP sont pris en charge dans l’API : Non-divulgation des frais et Divulgation des frais.

  • La Non-divulgation des frais doit être utilisée lorsque le FSP Payeur ne souhaite pas montrer sa structure de frais au FSP Bénéficiaire, ou lorsqu’il souhaite avoir plus de contrôle sur les frais payés par le Payeur une fois le devis établi (ce dernier cas s’applique uniquement pour le montant à recevoir ; voir la liste suivante).

  • La Divulgation des frais peut être utilisée dans des cas où le FSP Bénéficiaire souhaite subventionner la transaction ; par exemple, lors d'un dépôt d'espèces chez un agent d’un autre FSP.

La Non-divulgation des frais doit être le mode standard de devis supporté dans la plupart des schémas. La Divulgation des frais peut être utilisée dans certains schémas, par exemple lorsqu’une structure de frais dynamique est utilisée et qu’un FSP souhaite pouvoir subventionner le cas d’usage de dépôt d’espèces sur la base d’un coût dynamique.

En outre, le Payeur peut décider si le montant doit être un montant à recevoir ou montant à envoyer.

  • Montant à envoyer doit être interprété comme le montant réel à déduire du compte du Payeur, frais inclus.

  • Montant à recevoir doit être interprété comme le montant qui doit être crédité sur le compte du Bénéficiaire, indépendamment des frais de transaction interopérables. Ce montant exclut d’éventuels frais internes ajoutés par le FSP Bénéficiaire.

Le FSP Bénéficiaire peut choisir d’envoyer ou non le montant réellement reçu par le Bénéficiaire dans la réponse au FSP Payeur. Ce montant doit inclure les éventuels frais internes appliqués par le FSP Bénéficiaire au Bénéficiaire.

Toutes les taxes sont supposées être internes au FSP, ce qui signifie qu'elles ne sont pas transmises via l'API. Consultez Informations fiscales pour plus de détails sur la fiscalité.

Remarque : Les frais dynamiques mis en œuvre via un Switch ou tout autre intermédiaire ne sont pas pris en charge dans cette version de l’API.

# Non-divulgation des frais

Les paiements de frais et de commissions relatifs à une transaction interopérable lorsque les frais ne sont pas divulgués sont illustrés dans la Figure 7. Les frais et commissions faisant directement partie de l’API sont identifiés en texte vert. Les éléments internes (frais, commissions, bonus internes) sont identifiés en texte rouge—et ne font pas partie de la transaction entre un FSP Payeur et un FSP Bénéficiaire, mais le montant reçu par le Bénéficiaire après déduction de frais internes peut être communiqué à titre informatif par le FSP Bénéficiaire.

Pour un montant à envoyer (voir Montant à envoyer sans divulgation), des frais internes du FSP Payeur appliqués au Payeur vont affecter le montant envoyé par ce FSP (ex : pour une transaction de 100 USD avec 1 USD de frais, 99 USD sont envoyés). Pour un montant à recevoir (voir Montant à recevoir sans divulgation), ces frais internes n'ont pas d'effet sur le montant envoyé. Les bonus ou commissions internes du FSP Payeur doivent être cachés, quel que soit le mode (envoi/réception).

# Figure 7

Figure 7

Figure 7 -- Frais et commissions liés à l’interopérabilité lorsque les frais ne sont pas divulgués

Voir Types de frais pour plus d’informations sur les types de frais envoyés via l’API.

# Montant à recevoir sans divulgation

Figure 8 présente un exemple de montant à recevoir sans divulgation, où le Payeur souhaite que le Bénéficiaire reçoive exactement 100 USD. Dans ce cas, le FSP Payeur ne fixe pas nécessairement les frais internes avant d’avoir reçu le devis, puisque le FSP Bénéficiaire connaît déjà le montant qu’il recevra.

Dans cet exemple, le FSP Bénéficiaire décide de verser une commission au FSP Payeur, car les fonds sont injectés dans le système du FSP Bénéficiaire et seront ultérieurement dépensés, ce qui représente un gain futur pour le FSP Bénéficiaire. Le FSP Payeur décide ensuite des frais à facturer au Payeur. Par exemple, s'il veut percevoir 1 USD de frais du Payeur (et reçoit aussi 1 USD de commission), il gagne au total 2 USD.

# Figure 8

Figure 8 -- Exemple de montant à recevoir sans divulgation

# Figure 9

Figure 9

Figure 9 -- Vue simplifiée du mouvement de fonds pour l’exemple précédent

Pour calculer l’élément transferAmount dans le FSP Bénéficiaire pour un devis à montant à recevoir sans divulgation, appliquer l’équation Listing 9, où le Montant de transfert correspond à transferAmount (Tableau 24), le Montant du devis à amount (Tableau 23), les frais FSP Bénéficiaire à payeeFspFee (Tableau 24), et la commission FSP Bénéficiaire à payeeFspCommission (Tableau 24).

# Listing 7
Montant de transfert = Montant du devis + Frais FSP Bénéficiaire – Commission FSP Bénéficiaire

Listing 7 -- Relation entre le montant de transfert et le montant du devis pour ce cas

# Montant à envoyer sans divulgation

Figure 10 montre un exemple où le Payeur souhaite envoyer 100 USD. Ici, le FSP Payeur doit déterminer les frais, commissions ou les deux avant d’envoyer le devis, pour que le FSP Bénéficiaire connaisse le montant qui sera reçu. Le montant retiré du compte du Payeur n’est pas communiqué, ni les frais.

Dans cet exemple, le FSP Payeur et le FSP Bénéficiaire veulent chacun 1 USD de frais, donc le Bénéficiaire recevra 98 USD. Le montant reçu peut être indiqué dans la réponse sous l’élément payeeReceiveAmount, mais ce n’est pas obligatoire.

# Figure 10

Figure 10 -- Exemple de montant à envoyer sans divulgation

# Figure 11

Figure 11 : vue simplifiée du mouvement d’argent.

Figure 11

Figure 11 -- Vue simplifiée du mouvement de fonds pour cet exemple

Pour calculer transferAmount, utiliser l’équation du Listing 8 : Montant du transfert = transferAmount (Tableau 24), Montant du devis = amount, commission = payeeFspCommission.

# Listing 8
Montant de transfert = Montant du devis – Commission FSP Bénéficiaire

Listing 8 -- Relation entre le montant de transfert et le montant du devis pour ce cas

La raison pour laquelle les frais FSP Bénéficiaire sont absents de l’équation : le Payeur veut envoyer un certain montant de son compte, le Bénéficiaire reçoit donc moins au lieu que des frais soient ajoutés au montant.

# Divulgation des frais

Les paiements de frais et de commissions relatifs à une transaction interopérable lorsque les frais sont divulgués se trouvent en Figure 12. Ce qui est directement lié à l’API est indiqué en vert. Les frais, bonus, et commissions internes sont en rouge : ils impactent le montant envoyé/reçu mais ne sont pas transmis dans la transaction interopérable. Le montant net reçu par le Bénéficiaire (après frais internes) peut être transmis à titre d’information.

Quand la divulgation des frais est utilisée, la commission envoyée par le FSP Bénéficiaire doit subventionner tout ou partie du coût de la transaction pour le Payeur. Si la commission est supérieure aux frais pour le Payeur, l’excédent doit être traité comme un frais payé du Bénéficiaire au Payeur. Un exemple : ici.

# Figure 12

Figure 12

Figure 12 -- Frais et commissions liés à l’interopérabilité lorsque les frais sont divulgués

Voir Types de frais pour plus d'informations.

# Montant à recevoir avec divulgation

Figure 13 : le Payeur veut que le Bénéficiaire reçoive 100 USD. Le FSP Payeur doit évaluer la transaction en interne avant d’envoyer la demande de devis, car les frais sont divulgués. Exemple : le FSP Payeur veut 1 USD de frais, le FSP Bénéficiaire attribue 1 USD de commission pour subventionner, rendant la transaction gratuite pour le Payeur.

# Figure 13

Figure 13 -- Exemple avec montant à recevoir en divulgation

Figure 14 : vue simplifiée.

# Figure 14

Figure 14

Figure 14 -- Vue simplifiée du mouvement de fonds

Pour calculer transferAmount côté FSP Bénéficiaire pour ce type de devis, appliquer l'équation du Listing 9, où Montant transfert = transferAmount, Montant devis = amount, frais FSP Bénéficiaire = payeeFspFee, commission FSP Bénéficiaire = payeeFspCommission.

# Listing 9
Montant de transfert = Montant du devis + Frais FSP Bénéficiaire – Commission FSP Bénéficiaire

Listing 9 -- Relation pour ce cas

# Montant à envoyer avec divulgation

Figure 15 : le Payeur souhaite envoyer 100 USD au Bénéficiaire. Les frais doivent être calculés avant la demande de devis, car ils sont divulgués. Exemple : chaque FSP souhaite 1 USD de frais.

# Figure 15

Figure 15 -- Exemple avec montant à envoyer en divulgation

# Figure 16

Figure 16 : vue simplifiée du mouvement de fonds.

Figure 16

Figure 16 -- Vue simplifiée pour ce cas

Pour calculer transferAmount (côté FSP Bénéficiaire), l’équation du Listing 10 doit être utilisée :

# Listing 10
Si (Frais Payeur <= Commission FSP Bénéficiaire)
    Montant de transfert = Montant du devis
Sinon
    Montant de transfert = Montant du devis – (Frais Payeur – Commission FSP Bénéficiaire)

Listing 10 -- Relation pour ce cas

Les frais FSP Bénéficiaire sont absents : on souhaite envoyer un montant précis, le Bénéficiaire reçoit donc moins, plutôt que d’ajouter les frais « par-dessus ».

# Exemple d’excédent de commission FSP

Figure 17 : excédent de commission FSP avec divulgation du montant à envoyer : le Payeur souhaite envoyer 100 USD, le FSP Payeur veut 1 USD de frais, le FSP Bénéficiaire donne 3 USD de commission. Sur les 3 USD, 1 USD couvre les frais Payeur, 2 USD reviennent au FSP Payeur.

# Figure 17

Figure 17 -- Exemple d’excédent de commission

# Figure 18

Figure 18 : vue simplifiée du mouvement de fonds.

Figure 18

Figure 18 -- Vue simplifiée pour ce cas

# Types de frais

Comme vu en Figure 7 et Figure 12, il existe deux types de frais et commissions dans l’objet Quote entre FSP :

  1. Frais FSP Bénéficiaire : frais de transaction que le FSP Bénéficiaire souhaite obtenir pour la gestion de la transaction.
  2. Commission FSP Bénéficiaire : commission que le FSP Bénéficiaire veut verser au FSP Payeur (non-divulgation) ou subventionner la transaction en payant à la place du FSP Payeur (divulgation). Si excédent, il est traité comme frais payé du Bénéficiaire vers le Payeur, voir l’exemple d’excès de commission.

# Équations de devis

Section contenant des formules utiles pour les devis qui n’ont pas encore été mentionnées.

# Relation entre montant reçu par le Bénéficiaire et montant de transfert

Le montant que doit recevoir le Bénéficiaire, hors frais internes, bonus ou commission FSP Bénéficiaire, peut être calculé par le FSP Payeur via Listing 11. Montant de transfert = transferAmount, frais FSP Bénéficiaire = payeeFspFee, commission = payeeFspCommission.

# Listing 11
Montant reçu Bénéficiaire = Montant de transfert - Frais FSP Bénéficiaire + Commission FSP Bénéficiaire

Listing 11 -- Relation entre montant de transfert et montant reçu

Le montant reçu peut optionnellement être transmis lors du retour du devis sous payeeReceiveAmount.


# Informations fiscales

Aucune information de taxe n’est transmise via l’API (toute la fiscalité est considérée comme interne). Les sections suivantes détaillent les cas les plus courants.

# Taxe sur la commission des agents

Taxe sur la commission d’un agent (en tant que revenu). C’est l’agent ou son FSP qui gère la relation avec l’administration fiscale, selon le cas. Toutes les commissions agent étant internes, rien n’est transmis dans l’API.

# Taxe sur les frais internes FSP

Un FSP peut être taxé sur certains frais internes reçus : ex : frais Payeur vers son FSP, ou frais Bénéficiaire vers son FSP. Cette taxe doit être gérée et collectée en interne par le FSP concerné.

# Taxe sur le montant (TVA, taxe de vente, ... )

La TVA ou les taxes de vente sont des taxes sur un montant, typiquement supportées par le consommateur lors d’un achat marchand. Le marchand collecte la taxe et reverse à l’administration. Si la TVA s’applique, elle doit être incluse dans la somme demandée au client, et le montant reçu par le FSP Bénéficiaire est taxé en conséquence.

# Taxe sur frais FSP

Dans l’API, un FSP Bénéficiaire peut ajouter un frais à payer par le Payeur ou son FSP. Il doit gérer la fiscalité conformément à la pratique locale, en interne et sans transmettre de détail via l’API.

# Taxe sur la commission FSP

Un FSP Bénéficiaire peut ajouter une commission, soit pour subventionner la transaction (divulgation), soit pour inciter le FSP Payeur (non-divulgation).

# Non-divulgation des frais

Dans ce cas, toute commission FSP Bénéficiaire doit être considérée comme un frais reçu par le FSP Payeur. La taxe correspondante est gérée en interne comme tout frais reçu.

# Divulgation des frais

Si le montant de commission est inférieur ou égal aux frais à la charge du Payeur, la commission sert à couvrir ces frais. Si elle les dépasse, l’excédent est traité comme dans la non-divulgation.


# Exemples pour chaque cas d’usage

Cette section présente un ou plusieurs exemples pour chaque cas.

# Virement P2P

Un virement P2P est typiquement un montant à recevoir, sans aucune divulgation de frais côté Bénéficiaire (Figure 19). Ex : le Payeur veut que le Bénéficiaire reçoive 100 USD. Le FSP Bénéficiaire offre une commission au FSP Payeur. Le FSP Payeur prend 1 USD de frais à son client : il gagne donc 2 USD (1 USD venant du client, 1 USD en commission). 99 USD sont transférés après déduction de la commission.

# Figure 19

Figure 19 -- Exemple virement P2P avec montant à recevoir

# Vue simplifiée du mouvement de fonds
# Figure 20

Voir Figure 20 pour une vue très simplifiée du mouvement.

Figure 20

Figure 20 -- Vue simplifiée virement P2P

# Dépôt d’espèces initié par l’agent (Montant à envoyer)

Figure 21 : dépôt avec divulgation des frais. Le Bénéficiaire veut savoir les frais avant d’accepter l’opération. Exemple : le client souhaite déposer 100 USD chez un agent du FSP Payeur. Celui-ci prend 2 USD de frais, le FSP Bénéficiaire subventionne la transaction avec 2 USD de commission pour couvrir ces frais. 98 USD sont transférés après déduction de la commission.

# Figure 21

Figure 21 -- Exemple dépôt agent, montant à envoyer

# Vue simplifiée

Voir Figure 22.

# Figure 22

Figure 22

Figure 22 -- Vue simplifiée dépôt agent

# Dépôt d’espèces initié par l’agent (Montant à recevoir)

Figure 23 : dépôt avec divulgation des frais, client souhaite recevoir exactement 100 USD. Le FSP Payeur souhaite 2 USD de frais pour la commission agent ; le FSP Bénéficiaire subventionne 1 USD en commission (50 % des frais). 99 USD transférés après déduction de la commission.

# Figure 23

Figure 23 -- Exemple dépôt agent, montant à recevoir

# Vue simplifiée
# Figure 24

Voir Figure 24.

Figure 24

Figure 24 -- Vue simplifiée dépôt agent montant à recevoir

# Paiement marchand initié par le client

Typiquement un montant à recevoir sans divulgation des frais. Ex : achat de biens/ services pour 100 USD auprès d’un marchand dans le FSP Bénéficiaire. Le FSP Bénéficiaire ne facture pas le client mais prend un frais caché d’1 USD au marchand. Le FSP Payeur prélève 1 USD au client. 100 USD sont transférés.

# Figure 25

Figure 25 -- Exemple paiement marchand client

# Vue simplifiée

Voir Figure 26.

# Figure 26

Figure 26

Figure 26 -- Vue simplifiée paiement marchand client

# Retrait d’espèces initié par le client (Montant à recevoir)

Typiquement, montant à recevoir sans divulgation des frais. Ex : le client veut retirer 100 USD en espèces. Le FSP Bénéficiaire prend 2 USD de frais (commission agent), le FSP Payeur prend 1 USD. 102 USD transférés.

# Figure 27

Figure 27 -- Exemple retrait client (montant à recevoir)

# Vue simplifiée

Voir Figure 28.

# Figure 28

Figure 28

Figure 28 -- Vue simplifiée retrait client (montant à recevoir)

# Retrait d’espèces initié par le client (Montant à envoyer)

Normalement, typiquement montant à recevoir, mais ici exemple avec montant à envoyer : voir Figure 29. Le client veut retirer 100 USD de son compte. Le FSP Bénéficiaire prend 2 USD (commission agent), le FSP Payeur prend 1 USD. 99 USD transférés.

# Figure 29

Figure 29 -- Exemple retrait client (montant à envoyer)

# Vue simplifiée

Voir Figure 30.

# Figure 30

Figure 30

Figure 30 -- Vue simplifiée retrait client (montant à envoyer)

# Retrait initié par agent

Montant à recevoir, pas de divulgation des frais côté FSP Payeur. Ex : le client veut recevoir 100 USD en liquide. Frais : 2 USD côté FSP Bénéficiaire ; 1 USD côté FSP Payeur. 102 USD transférés.

# Figure 31

Figure 31 -- Exemple retrait agent

# Vue simplifiée

Voir Figure 32.

# Figure 32

Figure 32

Figure 32 -- Vue simplifiée retrait agent

# Paiement marchand initié par le marchand

Montant à recevoir, pas de divulgation des frais. Ex : achat de 100 USD, aucun frais Bénéficiaire, mais 1 USD de frais côté Payeur. 100 USD transférés.

# Figure 33

Figure 33 -- Exemple paiement marchand initié par marchand

# Vue simplifiée

Voir Figure 34.

# Figure 34

Figure 34

Figure 34 -- Vue simplifiée paiement marchand initié par marchand

# Retrait initié par ATM

Montant à recevoir, pas de divulgation. Ex : retrait de 100 USD en espèces, 1 USD de frais côté FSP Bénéficiaire (frais ATM), 1 USD côté FSP Payeur. 101 USD transférés.

# Figure 35

Figure 35 -- Exemple retrait ATM

# Vue simplifiée

Voir Figure 36.

# Figure 36

Figure 36

Figure 36 -- Vue simplifiée retrait ATM

# Paiement marchand initié par le marchand autorisé sur un TPE

Montant à recevoir, pas de divulgation des frais. Ex : achat de 100 USD, le FSP Bénéficiaire accorde 1 USD de commission, le FSP Payeur l’utilise comme frais. 100 USD transférés.

# Figure 37

Figure 37 -- Exemple paiement marchand sur TPE

# Vue simplifiée

Voir Figure 38.

# Figure 38

Figure 38

Figure 38 -- Vue simplifiée paiement marchand sur TPE

# Remboursement

Figure 39 présente un exemple de remboursement du montant entier d’un dépôt d’espèces (voir exemple plus haut).

# Figure 39

Figure 39 -- Exemple de remboursement

# 5.1.6.11.1 Vue simplifiée du mouvement de fonds

Voir Figure 40.

# Figure 40

Figure 40

Figure 40 -- Vue simplifiée du remboursement


# Adressage des Parties

Les deux parties d’une transaction financière (le Payeur et le Bénéficiaire) sont identifiées dans l’API par un Type d’ID de Partie (PartyIdType), un ID de Partie (PartyIdentifier), et, éventuellement, un Sous-ID ou Type de Partie (PartySubIdOrType). Certains sous-types sont prévus en standard pour des identifiants personnels (PersonalIdentifierType), par ex. pour le numéro de passeport ou le permis de conduire.

Exemples de base d’utilisation des éléments Party ID Type et Party ID :

  • Pour utiliser le numéro de téléphone mobile +123456789 comme contrepartie, mettre Party ID Type à MSISDN et Party ID à +123456789.

    • Exemple de service pour obtenir le FSP :

      **GET /participants/MSISDN/+123456789**
      
  • Pour utiliser l'adresse email john@doe.com, mettre Party ID Type à EMAIL et Party ID à john@doe.com.

    • Exemple :

      **GET /participants/EMAIL/john\@doe.com**
      
  • Pour utiliser l’IBAN SE45 5000 0000 0583 9825 7466 : Party ID Type = IBAN, Party ID = SE4550000000058398257466 (sans espaces).

    • Exemple :

      **GET /participants/IBAN/SE4550000000058398257466**
      

Exemples avancés :

  • Pour une personne dont le numéro de passeport est 12345678 : Party ID Type = PERSONAL_ID, Party ID = 12345678, Party Sub ID or Type = PASSPORT.

    • Exemple :

      **GET /participants/PERSONAL_ID/123456789/PASSPORT**
      
  • Pour employeeId1 travaillant chez Shoe-company : Party ID Type = BUSINESS, Party ID = Shoe-company, Party Sub ID or Type = employeeId1

    • Exemple :

      **GET /participants/BUSINESS/Shoe-company/employeeId1**
      

5.2.1 Caractères interdits dans Party ID et Party Sub ID or Type

Le Party ID et Party Sub ID or Type font partie de l’URI (voir Syntaxe URI), donc certaines restrictions existent :

  • Barre oblique (/) interdite (utilisée dans le Path pour la séparation).
  • Point d’interrogation (?) interdit (identifie la Query dans l’URI).

# Correspondance des cas d’usage et des types de transaction

Cette section décrit comment mapper les cas d’usage non-bulk actuellement supportés dans l’API vers le type complexe TransactionType), en utilisant les éléments TransactionScenario), et TransactionInitiator).

Plus de détails dans Cas d’usage de l’API.

# Virement P2P

Pour effectuer un virement P2P :

# Dépôt d’espèces initié par agent

# Retrait d’espèces initié par agent

# Retrait d’espèces par agent sur TPE

# Retrait d’espèces initié par client

# Paiement marchand initié par client

# Paiement marchand initié par marchand

# Paiement marchand initié par marchand sur TPE

# Retrait initié par ATM

# Remboursement

Pour effectuer un remboursement, configurez les éléments comme suit :

De plus, le type complexe Refund doit être renseigné avec l’identifiant de la transaction d’origine à rembourser.


# Services de l’API

Cette section présente et détaille tous les services que l’API prend en charge pour chaque ressource et méthode HTTP. Chaque ressource et service de l’API est également mappé à une ressource et un service logique décrits dans les Modèles génériques de transaction.

# Services API de haut niveau

À un niveau élevé, l’API peut être utilisée pour réaliser les actions suivantes :

  • Recherche d’informations sur un participant — Déterminer dans quel FSP se situe la contrepartie d’une transaction financière.

    • Utilisez les services fournis par la ressource API /participants.
  • Recherche d’informations sur une partie — Obtenir des informations sur la contrepartie d’une transaction financière.

    • Utilisez les services fournis par la ressource API /parties.
  • Demande de transaction — Demander à un payeur de transférer des fonds électroniques au bénéficiaire, à la demande du bénéficiaire. Le payeur peut approuver ou refuser la demande. Une approbation initiera effectivement la transaction financière.

    • Utilisez les services fournis par la ressource API /transactionRequests.
  • Calculer une devis — Calculer tous les éléments d’une transaction qui influenceront le montant de la transaction, c’est-à-dire les frais et la commission du FSP.

    • Utilisez les services fournis par la ressource API /quotes pour le devis d’une transaction individuelle (un payeur vers un bénéficiaire).
    • Utilisez les services fournis par la ressource API /bulkQuotes pour le devis d’une transaction groupée (un payeur vers plusieurs bénéficiaires).
  • Réaliser une autorisation — Demander au payeur de saisir les identifiants requis lorsqu’il a initié la transaction depuis un terminal de paiement, un DAB, ou un appareil similaire dans le système FSP du bénéficiaire.

    • Utilisez les services fournis par la ressource API /authorizations.
  • Effectuer un transfert — Réaliser effectivement la transaction financière en transférant les fonds électroniques du payeur au bénéficiaire, éventuellement via des registres intermédiaires.

    • Utilisez les services fournis par la ressource API /transfers pour une transaction unique (un payeur vers un bénéficiaire).
    • Utilisez les services fournis par la ressource API /bulkTransfers pour une transaction groupée (un payeur vers plusieurs bénéficiaires).
  • Récupérer les informations de transaction — Obtenir les informations relatives à la transaction financière ; par exemple, un jeton créé en cas de transaction réussie.

    • Utilisez les services fournis par la ressource API /transactions.

# Services API pris en charge

Tableau 6 inclut des descriptions de haut niveau des services que l’API propose. Pour plus d’informations détaillées, consultez les sections suivantes.

# Tableau 6
URI Méthode HTTP GET Méthode HTTP PUT Méthode HTTP POST Méthode HTTP DELETE Méthode HTTP PATCH
/participants Non pris en charge Non pris en charge Demande à un ALS de créer les informations FSP concernant les parties fournies dans le corps ou, si l'information existe déjà, demande à l’ALS de la mettre à jour Non pris en charge Non pris en charge
/participants/{ID} Non pris en charge Callback pour informer un FSP pair d’une liste de parties précédemment créée. Non pris en charge Non pris en charge Non pris en charge
/participants/{Type}/{ID} Alternative : /participants/{Type}/{ID}/{SubId} Obtenir les informations FSP concernant une partie depuis un FSP pair ou un ALS. Callback pour informer un FSP pair des informations FSP demandées ou créées. Demander à un ALS de créer une information FSP concernant une partie ou, si elle existe déjà, de la mettre à jour Demander à un ALS de supprimer les informations FSP concernant une partie. Non pris en charge
/parties/{Type}/{ID} Alternative : /parties/{Type}/{ID}/{SubId} Obtenir des informations concernant une partie depuis un FSP pair. Callback pour informer un FSP pair des informations demandées sur la partie. Non pris en charge Non pris en charge Non pris en charge
/transactionRequests Non pris en charge Non pris en charge Demander à un FSP pair de solliciter l’approbation d’un payeur pour transférer des fonds à un bénéficiaire. Le payeur peut approuver ou refuser la demande. Non pris en charge Non pris en charge
/transactionRequests/{ID} Obtenir des informations concernant une demande de transaction déjà envoyée. Callback pour informer un FSP pair d’une demande de transaction déjà envoyée. Non pris en charge Non pris en charge Non pris en charge
/quotes Non pris en charge Non pris en charge Demander à un FSP pair de créer une nouvelle devis pour réaliser une transaction. Non pris en charge Non pris en charge
/quotes/{ID} Obtenir des informations concernant une devis déjà demandée. Callback pour informer un FSP pair d’une devis demandée précédemment. Non pris en charge Non pris en charge Non pris en charge
/authorizations/{ID} Obtenir l’autorisation pour une transaction du payeur qui interagit avec le système FSP du bénéficiaire. Callback pour informer le FSP payeur concernant les informations d’autorisation. Non pris en charge Non pris en charge Non pris en charge
/transfers Non pris en charge Non pris en charge Demander à un FSP pair d’effectuer le transfert des fonds liés à une transaction. Non pris en charge Non pris en charge
/transfers/{ID} Obtenir des informations concernant un transfert déjà effectué. Callback pour informer un FSP pair d’un transfert déjà effectué. Non pris en charge Non pris en charge Notification d’engagement au FSP bénéficiaire
/transactions/{ID} Obtenir des informations concernant une transaction déjà réalisée. Callback pour informer un FSP pair d’une transaction déjà réalisée. Non pris en charge Non pris en charge Non pris en charge
/bulkQuotes Non pris en charge Non pris en charge Demander à un FSP pair de créer une nouvelle devis pour effectuer une transaction groupée. Non pris en charge Non pris en charge
/bulkQuotes/{ID} Obtenir des informations concernant une devis groupé déjà demandée. Callback pour informer un FSP pair d’une devis groupé déjà demandée. Non pris en charge Non pris en charge Non pris en charge
/bulkTransfers Non pris en charge Non pris en charge Demander à un FSP pair de créer un transfert groupé. Non pris en charge Non pris en charge
/bulkTransfers/{ID} Obtenir des informations concernant un transfert groupé déjà envoyé. Callback pour informer un FSP pair d’un transfert groupé déjà envoyé. Non pris en charge Non pris en charge Non pris en charge

Tableau 6 – Services fournis par l’API

# Versions actuelles des ressources

Tableau 7 contient la version de chaque ressource décrite dans ce document.

# Tableau 7
Ressource Version actuelle Dernière modification
/participants 1.1 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/parties 1.1 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/transactionRequests 1.1 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/quotes 1.1 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/authorizations 1.0 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/transfers 1.1 Ajout d’une possible notification de validation via PATCH /transfers/<ID>. Le processus d’utilisation des notifications de validation est décrit à la section 6.7.2.6. Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/transactions 1.0 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/bulkQuotes 1.1 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
/bulkTransfers 1.1 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.

Tableau 7 – Versions actuelles des ressources


# Ressource API /participants

Cette section définit la ressource API logique Participants, décrite dans les Modèles génériques de transaction.

Les services fournis par la ressource /participants servent principalement à déterminer dans quel FSP se trouve la contrepartie d’une transaction financière. Selon le schéma, ces services doivent être pris en charge, au minimum, soit par les FSP individuels soit par un service commun.

Si un service commun (par exemple, un ALS) est pris en charge dans le schéma, les services de la ressource /participants peuvent aussi être utilisés par les FSP pour ajouter et supprimer des informations dans ce système.

# Historique des versions de la ressource

Tableau 8 fournit une description de chaque version différente de la ressource /participants.

# Tableau 8
Version Date Description
1.0 2018-03-13 Version initiale
1.1 2020-05-19 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.
Pour garantir la cohérence, le modèle de données pour les appels POST /participants/{Type}/{ID} et POST /participants/{Type}/{ID}/{SubId} du Tableau 10 a également été mis à jour pour inclure l’élément ExtensionList optionnel.

Tableau 8 – Historique des versions pour la ressource /participants

# Détails des services

Différents modèles sont utilisés pour la recherche de compte, selon qu’un ALS existe ou non. Les sections suivantes décrivent chaque modèle à tour de rôle.

# Système sans service commun de recherche de comptes

Figure 41 montre comment effectuer une recherche de compte s’il n’existe pas d’ALS commun dans un schéma. Le processus consiste à demander aux autres FSP (en séquence) s’ils « possèdent » la partie avec le couple identité/type délivré jusqu’à trouver la partie.

Si ce modèle est utilisé, tous les FSP doivent prendre en charge à la fois la partie cliente et serveur des différents services HTTP GET de la ressource /participants. Les services HTTP POST ou DELETE de la ressource /participants ne doivent pas être utilisés, car les FSP sont directement sollicités pour récupérer les informations (au lieu d’un ALS commun).

# Figure 41

Figure 41 — Comment utiliser les services fournis par /participants s’il n’existe pas de système commun de recherche de comptes

# Système de recherche de comptes commun

Figure 42 montre comment une recherche de compte peut être effectuée s’il existe un ALS commun dans un schéma. Le processus consiste à demander au service commun de recherche de comptes quel FSP détient la partie avec l’identité fournie. Le service commun est représenté comme « Account Lookup » dans les flux ; ce service peut être mis en œuvre par le Switch ou comme un service séparé, selon le marché.

Les FSP n’ont pas besoin de prendre en charge la partie serveur des différents services HTTP GET sous la ressource /participants ; cette partie doit être assurée par l’ALS. À la place, les FSP (clients) doivent fournir des informations FSP concernant leurs comptes et titulaires de comptes (parties) à l’ALS (serveur) en utilisant les méthodes HTTP POST (pour créer ou mettre à jour les informations FSP, voir POST /participants et POST /participants/{Type}/{ID}) et HTTP DELETE (pour supprimer les informations FSP existantes, voir DELETE /participants/{Type}/{ID}).

# Figure 42

Figure 42 — Comment utiliser les services fournis par /participants s’il existe un système commun de recherche de comptes

# Requêtes

Cette section décrit les services qu’un client peut demander sur la ressource /participants.

# GET /participants/{Type}/{ID}

URI alternative : GET /participants/{Type}/{ID}/{SubId}

Service logique API : Recherche d’informations sur un participant

La requête HTTP GET /participants/{Type}/{ID} (ou GET /participants/{Type}/{ID}/{SubId}) sert à déterminer dans quel FSP se trouve la partie demandée, définie par {Type}, {ID} et éventuellement {SubId} (par exemple, GET /participants/MSISDN/123456789, ou GET /participants/BUSINESS/shoecompany/employee1). Voir Remboursement pour plus d’informations sur l’adressage d’une partie.

Cette requête HTTP doit prendre en charge une chaîne de requête (voir Syntaxe URI pour plus d’informations sur la syntaxe URI) pour filtrer par devise. Pour utiliser le filtrage par devise, la requête HTTP GET /participants/{Type}/{ID}?currency=XYZ doit être utilisée, où XYZ est la devise demandée.

Informations de callback et de modèle de données pour GET /participants/{Type}/{ID} (alternative GET /participants/{Type}/{ID}/{SubId}):

# POST /participants

URI alternative : N/A

Service logique API : Création d’informations bulk sur un participant

La requête HTTP POST /participants est utilisée pour créer des informations sur le serveur concernant la liste d’identités fournie. Cette requête doit être utilisée pour la création groupée d’informations FSP pour plusieurs parties. Le paramètre de devise optionnel doit indiquer que chaque partie fournie prend en charge la devise.

Callback et modèle de données pour POST /participants :

# Tableau 9
Nom Cardinalité Type Description
requestId 1 CorrelationId L’identifiant de la requête, choisi par le client. Utilisé pour identifier le callback du serveur.
partyList 1..10000 PartyIdInfo Liste des éléments PartyIdInfo pour lesquels le client souhaite créer ou mettre à jour les informations FSP.
currency 0..1 Currency Indique que la devise fournie est prise en charge par chaque PartyIdInfo de la liste.

Tableau 9 — Modèle de données POST /participants

# POST /participants/{Type}/{ID}

URI alternative : POST /participants/{Type}/{ID}/{SubId}

Service logique API : Création d’informations sur un participant

La requête HTTP POST /participants/{Type}/{ID} (ou POST /participants/{Type}/{ID}/{SubId}) est utilisée pour créer sur le serveur les informations concernant l’identité fournie, définie par {Type}, {ID} et éventuellement {SubId} (par exemple, POST /participants/MSISDN/123456789 ou POST /participants/BUSINESS/shoecompany/employee1). Voir Remboursement pour plus d’informations sur l’adressage d’une partie.

Callback et modèle de données pour POST /participants/{Type}/{ID} (alternative POST /participants/{Type}/{ID}/{SubId}):

# Tableau 10
Nom Cardinalité Type Description
fspId 1 FspId Identifiant FSP auquel appartient la partie.
currency 0..1 Currency Indique que la devise fournie est prise en charge par la partie.
extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

Tableau 10 — Modèle de données POST /participants/{Type}/{ID} (ou POST /participants/{Type}/{ID}/{SubId})

# DELETE /participants/{Type}/{ID}

URI alternative : DELETE /participants/{Type}/{ID}/{SubId}

Service logique API : Suppression d’informations sur un participant

La requête HTTP DELETE /participants/{Type}/{ID} (ou DELETE /participants/{Type}/{ID}/{SubId}) est utilisée pour supprimer les informations sur le serveur concernant l’identité fournie, définie par {Type} et {ID} (par exemple, DELETE /participants/MSISDN/123456789) et éventuellement {SubId}. Voir Remboursement pour plus d’informations sur l’adressage d’une partie.

Cette requête HTTP doit prendre en charge une chaîne de requête (voir Syntaxe URI) pour supprimer les informations FSP concernant uniquement une devise spécifique. Pour supprimer uniquement une devise spécifique, la requête HTTP DELETE /participants/{Type}/{ID}?currency=XYZ doit être utilisée, où XYZ est la devise demandée.

Note : L’ALS doit vérifier que c’est bien le FSP actuel de la partie qui supprime l’information FSP.

Callback et modèle de données pour DELETE /participants/{Type}/{ID} (alternative GET /participants/{Type}/{ID}/{SubId}):


# Callbacks

Cette section décrit les callbacks utilisés par le serveur pour les services fournis par la ressource /participants.

# PUT /participants/{Type}/{ID}

URI alternative : PUT /participants/{Type}/{ID}/{SubId}

Service logique API : Retour d’information sur un participant

Le callback PUT /participants/{Type}/{ID} (ou PUT /participants/{Type}/{ID}/{SubId}) est utilisé pour informer le client d’un succès à la suite d’une recherche, création ou suppression des informations FSP liées à la partie. Si l’information FSP a été supprimée, l’élément fspId doit être vide ; sinon il doit contenir l’information FSP de la partie.

Voir Tableau 11 pour le modèle de données.

# Tableau 11
Nom Cardinalité Type Description
fspId 0..1 FspId Identifiant FSP auquel appartient la partie.

Tableau 11 — Modèle de données PUT /participants/{Type}/{ID} (ou PUT /participants/{Type}/{ID}/{SubId})

# PUT /participants/{ID}

URI alternative : N/A

Service logique API : Retour d’informations groupées sur les participants

Le callback PUT /participants/{ID} est utilisé pour informer le client du résultat de la création de la liste d’identités fournie.

Voir Tableau 12 pour le modèle de données.

# Tableau 12
Nom Cardinalité Type Description
partyList 1..10000 PartyResults Liste des éléments PartyResult qui ont été créés ou dont la création a échoué.
currency 0..1 Currency Indique que la devise fournie a été définie comme prise en charge par chaque PartyIdInfo ajouté avec succès.

Tableau 12 — Modèle de données PUT /participants/{ID}

####Callbacks d’erreur

Cette section décrit les callbacks d’erreur utilisés par le serveur pour la ressource /participants.

# PUT /participants/{Type}/{ID}/error

URI alternative : PUT /participants/{Type}/{ID}/{SubId}/error

Service logique API : Erreur de retour d’information sur un participant

Si le serveur ne parvient pas à trouver, créer ou supprimer l’association FSP pour l’identité fournie, ou si une autre erreur de traitement est survenue, le callback d’erreur PUT /participants/{Type}/{ID}/error (ou PUT /participants/{Type}/{ID}/{SubId}/error) est utilisé. Voir Tableau 13 pour le modèle de données.

# Tableau 13
Nom Cardinalité Type Description
errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

Tableau 13 — Modèle de données PUT /participants/{Type}/{ID}/error (ou PUT /participants/{Type}/{ID}/{SubId}/error)

# PUT /participants/{ID}/error

URI alternative : N/A

Service logique API : Erreur de retour d’informations sur des participants groupés

En cas d’erreur lors de la création des informations FSP sur le serveur, le callback d’erreur PUT /participants/{ID}/error est utilisé. L’{ID} de l’URI doit contenir le requestId (voir Tableau 9) qui a servi à la création de l’information du participant. Voir Tableau 14 pour le modèle de données.

# Tableau 14
Nom Cardinalité Type Description
errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

Tableau 14 — Modèle de données PUT /participants/{ID}/error

# États

Aucun état n’est défini pour la ressource /participants ; soit le serveur détient des informations FSP pour l’identité demandée, soit il n’en détient pas.


# Ressource API /parties

Cette section définit la ressource API logique Parties, décrite dans les Modèles génériques de transaction.

Les services fournis par la ressource /parties servent à obtenir des informations concernant une partie détenue par un FSP pair.

# Historique des versions de la ressource

Tableau 15 présente une description de chaque version de la ressource /parties.

# Tableau 15
Version Date Description
1.0 2018-03-13 Version initiale
1.1 2020-05-19 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.

Tableau 15 — Historique des versions de la ressource /parties

# Détails des services

Figure 43 contient un exemple de processus pour la ressource /parties. D’autres déploiements sont possibles, par exemple un où le Switch et l’ALS sont sur le même serveur, ou un où le FSP de l’utilisateur interroge directement le FSP 1 pour obtenir les informations sur la partie.

# Figure 43

Figure 43 — Exemple de processus pour la ressource /parties


# Requêtes

Cette section décrit les services qui peuvent être demandés par un client sur la ressource /parties de l’API.

# GET /parties/{Type}/{ID}

URI alternative : GET /parties/{Type}/{ID}/{SubId}

Service logique API : Recherche d’informations sur une partie

La requête HTTP GET /parties/{Type}/{ID} (ou GET /parties/{Type}/{ID}/{SubId}) est utilisée pour rechercher des informations sur la partie demandée, définie par {Type}, {ID} et éventuellement {SubId} (par exemple, GET /parties/MSISDN/123456789 ou GET /parties/BUSINESS/shoecompany/employee1). Voir Remboursement pour plus d’informations sur l’adressage d’une partie.

Callback et modèle de données pour GET /parties/{Type}/{ID} (alternative GET /parties/{Type}/{ID}/{SubId}):


# Callbacks

Cette section décrit les callbacks utilisés par le serveur pour les services fournis par la ressource /parties.

# PUT /parties/{Type}/{ID}

URI alternative : PUT /parties/{Type}/{ID}/{SubId}

Service logique API : Retour d’informations sur une partie

Le callback PUT /parties/{Type}/{ID} (ou PUT /parties/{Type}/{ID}/{SubId}) est utilisé pour informer le client d’un succès à la suite de la recherche d’une partie. Voir Tableau 16 pour le modèle de données.

# Tableau 16
Nom Cardinalité Type Description
party 1 Party Informations sur la partie demandée.

Tableau 16 — Modèle de données PUT /parties/{Type}/{ID} (ou PUT /parties/{Type}/{ID}/{SubId})

# Callbacks d’erreur

Cette section décrit les callbacks d’erreur utilisés par le serveur pour la ressource /parties.

# PUT /parties/{Type}/{ID}/error

URI alternative : PUT /parties/{Type}/{ID}/{SubId}/error

Service logique API : Erreur de retour d’informations sur une partie

Si le serveur ne peut pas trouver les informations de la partie pour l’identité fournie, ou si une autre erreur de traitement est survenue, le callback d’erreur PUT /parties/{Type}/{ID}/error (ou PUT /parties/{Type}/{ID}/{SubId}/error) est utilisé. Voir Tableau 17 pour le modèle de données.

# Tableau 17
Nom Cardinalité Type Description
errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

Tableau 17 — Modèle de données PUT /parties/{Type}/{ID}/error (ou PUT /parties/{Type}/{ID}/{SubId}/error)

# États

Aucun état n’est défini pour la ressource /parties ; soit un FSP dispose d’informations sur l’identité demandée, soit il n’en a pas.


# Ressource API /transactionRequests

Cette section définit la ressource API logique Transaction Requests (« demandes de transaction »), décrite dans les Modèles génériques de transaction.

Le service principal qu’offre la ressource /transactionRequests permet à un bénéficiaire de demander à un payeur de lui transférer des fonds électroniques. Le payeur peut approuver ou refuser la demande émise par le bénéficiaire. La décision du payeur peut être prise de manière programmatique si :

  • Le bénéficiaire est de confiance (c’est-à-dire que le payeur l’a pré-approuvé dans son FSP), ou
  • Une valeur d’autorisation — c’est-à-dire un mot de passe à usage unique (OTP) — a été vérifiée correctement à l’aide de la ressource API /authorizations (voir Section 6.6).

Alternativement, le payeur peut prendre la décision manuellement.

# Historique des versions de la ressource

Tableau 18 présente une description de chaque version de la ressource /transactionRequests.

# Tableau 18
Version Date Description
1.0 2018-03-13 Version initiale
1.1 2020-05-19 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.

Tableau 18 — Historique des versions de la ressource /transactionRequests

# Détails des services

Figure 44 montre comment fonctionne le processus de demande de transaction à l’aide de la ressource /transactionRequests. L’approbation ou le refus n’est pas montré dans la figure. Un refus est un callback PUT /transactionRequests/{ID} avec un état REJECTED, similaire au callback de la figure avec l’état RECEIVED, tel que décrit dans la Section 6.4.2.1. Une approbation du payeur n’est pas envoyée en tant que callback ; à la place, une devis et un transfert sont envoyés contenant une référence à la demande de transaction.

# Figure 44

Figure 44 — Comment utiliser le service /transactionRequests

# Demande de transaction rejetée par le payeur

Figure 45 montre le processus par lequel une demande de transaction est rejetée. Les raisons possibles du refus incluent :

  • Le payeur a rejeté la demande manuellement.
  • Un dépassement de limite automatique s’est produit.
  • Le payeur a saisi un OTP de façon erronée plus que le nombre de fois autorisé.
# Figure 45

Figure 45 — Exemple de processus dans lequel une demande de transaction est rejetée

# Requêtes

Cette section décrit les services qu’un client peut demander pour la ressource /transactionRequests.

# GET /transactionRequests/{ID}

URI alternative : N/A

Service logique API : Récupérer les informations de demande de transaction

La requête HTTP GET /transactionRequests/{ID} est utilisée pour obtenir des informations sur une demande de transaction préalablement créée ou sollicitée. L’{ID} dans l’URI doit contenir le transactionRequestId (voir Tableau 15) qui a été utilisé lors de la création de la demande de transaction.

Callback et modèle de données pour GET /transactionRequests/{ID} :

# POST /transactionRequests

URI alternative : N/A

Service logique API : Effectuer une demande de transaction

La requête HTTP POST /transactionRequests est utilisée pour demander la création d’une demande de transaction financière sur le serveur.

Callback et modèle de données pour POST /transactionRequests :

# Tableau 19
Nom Cardinalité Type Description
transactionRequestId 1 CorrelationId Identifiant partagé entre les FSP pour l’objet de la demande de transaction, défini par le FSP bénéficiaire. L’ID doit être réutilisé pour les renvois de la même demande de transaction. Un nouvel ID doit être généré pour chaque nouvelle demande.
payee 1 Party Informations sur le bénéficiaire de la transaction financière proposée.
payer 1 PartyInfo Informations sur le type de payeur, id, sous-type/id, FSP Id dans la transaction financière proposée.
amount 1 Money Montant demandé à transférer du payeur au bénéficiaire.
transactionType 1 TransactionType Type de transaction.
note 0..1 Note Motif de la demande de transaction, destiné au payeur.
geoCode 0..1 GeoCode Longitude et latitude de la partie initiatrice. Peut être utilisé pour détecter une fraude.
authenticationType 0..1 AuthenticationType OTP ou code QR, sinon vide.
expiration 0..1 DateTime Peut être défini pour obtenir un échec rapide si le FSP pair met trop longtemps à répondre. Il peut aussi être utile pour le consommateur, l’agent ou le commerçant de savoir que leur demande a une durée limitée.
extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

Tableau 19 — Modèle de données POST /transactionRequests

# Callbacks

Cette section décrit les callbacks utilisés par le serveur pour la ressource /transactionRequests.

# PUT /transactionRequests/{ID}

URI alternative : N/A

Service logique API : Retour d’informations de demande de transaction

Le callback PUT /transactionRequests/{ID} est utilisé pour informer le client d’une demande de transaction créée ou sollicitée. L’{ID} dans l’URI doit contenir le transactionRequestId (voir Tableau 19) utilisé lors de la création de la demande, ou l’{ID} utilisé dans le GET /transactionRequests/{ID}. Voir Tableau 20 pour le modèle de données.

# Tableau 20
Nom Cardinalité Type Description
transactionId 0..1 CorrelationId Identifie la transaction liée (si une transaction a été créée).
transactionRequestState 1 TransactionRequestState État de la demande de transaction.
extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

Tableau 20 — Modèle de données PUT /transactionRequests/{ID}

# Callbacks d’erreur

Cette section décrit les callbacks d’erreur utilisés par le serveur pour la ressource /transactionRequests.

# PUT /transactionRequests/{ID}/error

URI alternative : N/A

Service logique API : Erreur de retour d’informations sur une demande de transaction

Si le serveur ne parvient pas à trouver ou créer une demande de transaction, ou si une autre erreur de traitement survient, le callback d’erreur PUT /transactionRequests/{ID}/error est utilisé. L’{ID} de l’URI doit contenir le transactionRequestId (voir Tableau 19) utilisé lors de la création de la demande, ou l’{ID} utilisé dans le GET /transactionRequests/{ID}. Voir Tableau 21 pour le modèle de données.

# Tableau 21
Nom Cardinalité Type Description
errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

Tableau 21 — Modèle de données PUT /transactionRequests/{ID}/error

# 6.4.6 États

Les états possibles d’une demande de transaction sont représentés dans la Figure 46.

Note : Un serveur n’a pas besoin de conserver les objets de demande de transaction qui ont été rejetés dans sa base de données. Cela signifie qu’un client doit s’attendre à recevoir un callback d’erreur pour une demande de transaction rejetée.

# Figure 46

Figure 46

Figure 46 — États possibles d’une demande de transaction


# Ressource API /quotes

Cette section définit la ressource API logique Quotes (« Devis »), décrite dans les Modèles génériques de transaction.

Le principal service proposé par la ressource /quotes est le calcul des frais éventuels et des commissions FSP liés à la réalisation d’une transaction financière interopérable. Les FSP payeur et bénéficiaire doivent chacun calculer leur part du devis pour obtenir une vue globale de tous les frais et commissions applicables à la transaction.

Une devis est irrévocable ; elle ne peut pas être modifiée après sa création. Elle peut cependant expirer (toutes les devis sont valables uniquement jusqu’à leur date d’expiration).

Note : Une devis n’est pas une garantie que la transaction financière réussira. La transaction peut toujours échouer ultérieurement. Une devis garantit uniquement que les frais et commissions appliqués à la transaction spécifiée restent valables jusqu’à expiration du devis.

Pour plus d’informations, voir la section Devis.

# Historique des versions de la ressource

Tableau 22 présente une description de chaque version de la ressource /quotes.

# Tableau 22
Version Date Description
1.0 2018-03-13 Version initiale
1.1 2020-05-19 Le modèle de données a été mis à jour pour ajouter un élément ExtensionList optionnel au type complexe PartyIdInfo selon la Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30. À la suite de cela, le modèle de données décrit dans le Tableau 93 a été mis à jour.

Tableau 22 – Historique des versions de la ressource /quotes

# Détails des services

Figure 47 présente un exemple de processus pour la ressource API /quotes. Cet exemple montre une transaction initiée par le payeur, mais elle peut aussi être initiée par le bénéficiaire, en utilisant la ressource API /transactionRequests. Dans ce cas, la recherche sera effectuée par le FSP du bénéficiaire.

# Figure 47

Figure 47 — Exemple de processus pour la ressource /quotes

# Détails de l’expiration du devis

La demande de devis du FSP payeur peut contenir une date d’expiration, si le FSP payeur souhaite indiquer à partir de quand il n’est plus utile pour le FSP bénéficiaire de renvoyer une devis. Par exemple, la transaction peut expirer ou sa devis peut expirer.

Le FSP bénéficiaire doit définir une expiration dans le callback du devis pour indiquer à partir de quand elle n’est plus valable pour le FSP payeur.

# Rejet d’une devis

Le FSP bénéficiaire peut rejeter une demande de devis émise par le FSP payeur en envoyant le callback d’erreur PUT /quotes/{ID}/error plutôt que le callback PUT /quotes/{ID}. Selon le modèle générique de transaction utilisé (voir Section 8 pour plus d’informations), le FSP payeur peut rejeter une devis en utilisant l’une des méthodes suivantes :

  • Si la transaction est initiée par le payeur (voir Section 8.1), le FSP payeur ne doit pas informer le FSP bénéficiaire du rejet. La devis créée chez le FSP bénéficiaire doit avoir une date d’expiration, après laquelle elle est automatiquement supprimée.
  • Si la transaction est initiée par le bénéficiaire (voir Section 8.2 et 8.3), le FSP payeur doit informer le FSP bénéficiaire du rejet par le callback PUT /transactionRequests/{ID} avec un état « rejected ». Le processus est décrit plus en détail à la Section 6.4.2.1.

# Demande de paiement Interledger

Dans le cadre de la prise en charge d’Interledger et de l’implémentation concrète de la demande de paiement Interledger (voir Protocole Interledger), le FSP bénéficiaire doit :

  • Déterminer l’adresse ILP (voir Adresses ILP pour plus d’informations) du bénéficiaire et le montant qu’il recevra. Notez que puisque l’élément amount dans le paquet ILP est défini comme un UInt64 (donc valeur entière), le montant doit être multiplié par l’exposant du devise (par exemple, l’exposant de l’USD est 2, donc le montant doit être multiplié par 102, et celui du JPY est 0, donc multiplié par 100). L’adresse ILP et le montant doivent être renseignés dans le paquet ILP (voir ILP Packet pour plus d’informations).

  • Renseigner l’élément data dans le paquet ILP par le modèle de données Transaction.

  • Générer la fulfilment et la condition (voir Transferts conditionnels pour plus de détails). Renseigner l’élément condition dans le PUT /quotes/**{ID}). Le Tableau 19 montre le modèle de données avec la condition générée.

La fulfilment est un secret temporaire généré pour chaque transaction financière par le FSP bénéficiaire et utilisé comme déclencheur pour valider les transferts constituant un paiement ILP.

Le FSP bénéficiaire utilise un secret local pour générer un HMAC SHA-256 du paquet ILP. Le même secret peut être utilisé pour toutes les transactions financières, ou le FSP bénéficiaire peut stocker un secret différent par bénéficiaire ou selon une autre segmentation.

Le choix et la cardinalité du secret local sont une décision d’implémentation, qui peut être dictée par les règles du système. Le seul prérequis est que le FSP bénéficiaire puisse déterminer à quel secret correspond un paquet ILP reçu ultérieurement dans le cadre d’un transfert entrant (voir Ressource API Transfers).

La fulfilment et la condition sont générées conformément à l’algorithme défini dans le Listing 12. Une fois que le FSP bénéficiaire a dérivé la condition, la fulfilment peut être supprimée puisqu’elle peut être régénérée plus tard.

# Listing 12

Génération du fulfilment (accomplissement) et de la condition

Entrées :

  • Secret local (chaîne binaire de 32 octets)
  • Paquet ILP

Algorithme :

  1. Le fulfilment est obtenu en exécutant l’algorithme HMAC SHA-256 sur le paquet ILP en utilisant le secret local comme clé.

  2. La condition est obtenue en exécutant l’algorithme de hachage SHA-256 sur le fulfilment.

Sorties :

  • Fulfilment (chaîne binaire de 32 octets)
  • Condition (chaîne binaire de 32 octets)

Listing 12 -- Algorithme pour générer le fulfilment et la condition

# Requêtes

Cette section décrit les services pouvant être demandés par un client de l’API sur la ressource /quotes.

# GET /quotes/{ID}

URI alternative : N/A

Service logique de l’API : Récupérer les informations du devis

La requête HTTP GET /quotes/{ID} permet d’obtenir des informations sur une devis préalablement créée ou demandée. Le {ID} dans l’URI doit contenir le quoteId (voir Tableau 23) qui a été utilisé pour la création du devis.

Informations sur les callbacks et le modèle de données pour GET /quotes/{ID} :

# POST /quotes

URI alternative : N/A

Service logique de l’API : Calculer les informations du devis

La requête HTTP POST /quotes est utilisée pour demander la création d’une devis pour la transaction financière fournie sur le serveur.

Informations sur les callbacks et le modèle de données pour POST /quotes :

# Tableau 23
Nom Cardinalité Type Description
quoteId 1 CorrelationId Identifiant commun entre les FSPs pour l’objet devis, décidé par le FSP du payeur. Cet ID doit être réutilisé pour les renvois de la même devis pour une transaction. Un nouvel ID doit être généré pour chaque nouvelle devis pour une transaction.
transactionId 1 CorrelationId Identifiant commun (décidé par le FSP du payeur) entre les FSPs pour l’objet de la future transaction. La transaction réelle sera créée dans le cadre d’un processus de transfert réussi. L’ID doit être réutilisé pour les renvois de la même devis pour une transaction. Un nouvel ID doit être généré pour chaque nouvelle devis pour une transaction.
transactionRequestId 0..1 CorrelationId Identifie une demande de transaction optionnelle envoyée précédemment.
payee 1 Party Informations concernant le bénéficiaire de la transaction financière proposée.
payer 1 Party Informations concernant le payeur de la transaction financière proposée.
amountType 1 AmountType SEND pour montant envoyé, RECEIVE pour montant reçu.
amount 1 Money Selon amountType :
Si SEND : Le montant que le payeur souhaite envoyer ; c’est-à-dire le montant à prélever du compte payeur, frais inclus. Le montant est mis à jour par chaque entité participant à la transaction.
Si RECEIVE : Le montant que le bénéficiaire doit recevoir ; c’est-à-dire le montant qui doit être envoyé au destinataire, frais exclus. Le montant n’est pas mis à jour par les entités participantes.
fees 0..1 Money Frais associés à la transaction.
  • L’élément fees doit être vide si les frais ne doivent pas être divulgués.
  • L’élément fees doit être renseigné si les frais doivent être divulgués.
  • transactionType 1 TransactionType Type de transaction pour laquelle le devis est demandée.
    geoCode 0..1 GeoCode Longitude et latitude de la partie initiatrice. Peut être utilisé pour détecter la fraude.
    note 0..1 Note Mémo à joindre à la transaction.
    expiration 0..1 DateTime L’expiration est optionnelle. Elle peut être fixée afin d’obtenir un échec rapide si le FSP pair met trop de temps à répondre. Elle peut également être utile pour que le consommateur, l’agent ou le commerçant sache que leur demande a une limite de temps.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 23 -- Modèle de données POST /quotes

    # Callbacks

    Cette section décrit les callbacks utilisés par le serveur sous la ressource /quotes.

    # PUT /quotes/{ID}

    URI alternative : N/A

    Service logique de l’API : Retourner les informations du devis

    Le callback PUT /quotes/{ID} est utilisé pour informer le client d’une devis demandée ou créée. Le {ID} dans l’URI doit contenir le quoteId (voir Tableau 23) qui a été utilisé pour la création du devis, ou le {ID} utilisé dans le GET /quotes/{ID}. Voir Tableau 24 pour le modèle de données.

    # Tableau 24
    Nom Cardinalité Type Description
    transferAmount 1 Money Le montant que le FSP payeur doit transférer au FSP bénéficiaire.
    payeeReceiveAmount 0..1 Money Le montant que le bénéficiaire doit recevoir dans la transaction de bout en bout. Optionnel si le FSP bénéficiaire ne souhaite pas divulguer de potentiels frais au bénéficiaire.
    payeeFspFee 0..1 Money Partie des frais de la transaction imputée au FSP bénéficiaire.
    payeeFspCommission 0..1 Money Commission du FSP bénéficiaire sur la transaction.
    expiration 1 DateTime Date et heure jusqu’à laquelle le devis est valide et peut être honorée lorsqu’elle est utilisée dans la transaction suivante.
    geoCode 0..1 GeoCode Longitude et latitude du bénéficiaire. Peut être utilisé pour détecter la fraude.
    ilpPacket 1 IlpPacket Le paquet ILP qui doit être joint au transfert par le payeur.
    condition 1 IlpCondition La condition qui doit être jointe au transfert par le payeur.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 24 -- Modèle de données PUT /quotes/{ID}

    # Callbacks d’erreur

    Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource /quotes.

    # PUT /quotes/{ID}/error

    URI alternative : N/A

    Service logique de l’API : Retourner une erreur d’information de devis

    Si le serveur ne parvient pas à trouver ou créer une devis, ou qu’une autre erreur de traitement se produit, le callback d’erreur PUT /quotes/{ID}/error est utilisé. Le {ID} dans l’URI doit contenir le quoteId (voir Tableau 23) utilisé pour la création du devis, ou le {ID} utilisé dans le GET /quotes/{ID}. Voir Tableau 25 pour le modèle de données.

    # Tableau 25
    Nom Cardinalité Type Description
    errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

    Tableau 25 -- Modèle de données PUT /quotes/{ID}/error

    # États

    # Figure 48

    Figure 48 contient la machine à états UML (Unified Modeling Language) pour les états possibles d’un objet devis.

    Remarque : Un serveur n’a pas besoin de conserver en base les objets devis ayant été rejetés ou expirés. Cela signifie qu’un client doit s’attendre à ce qu’un callback d’erreur puisse être retourné pour une devis expirée ou rejetée.

    Figure 48

    Figure 48 -- États possibles d’une devis


    # Ressource d’API /authorizations

    Cette section définit la ressource logique d’API Authorizations, décrite dans Modèles de transaction génériques.

    La ressource /authorizations est utilisée pour demander au payeur de saisir les identifiants applicables dans le système du FSP bénéficiaire pour approuver la transaction financière, lorsqu’il a initié la transaction depuis un POS, un DAB ou similaire, dans le système du FSP bénéficiaire et souhaite autoriser via un OTP.

    # Historique des versions de la ressource

    Tableau 26 décrit les différentes versions de la ressource /authorizations.

    # Tableau 26
    Version Date Description
    1.0 2018-03-13 Version initiale

    Tableau 26 – Historique des versions de la ressource /authorizations

    # Détails des services

    Figure 49 présente un exemple de processus pour la ressource API /authorizations. Le FSP bénéficiaire envoie d’abord une demande de transaction) qui est autorisée via OTP. Le FSP payeur réalise ensuite le devis (voir Ressource API Quotes) avant qu’une demande d’autorisation soit envoyée au système du FSP bénéficiaire pour que le payeur approuve via la saisie de l’OTP. Si l’OTP est correct, le processus de transfert doit être initié (voir Ressource API Transfers).

    # Figure 49

    Figure 49 -- Exemple de processus pour la ressource /authorizations

    # Renvoi de la valeur d’autorisation

    Si la notification contenant la valeur d’autorisation n’atteint pas le payeur, celui-ci peut demander le renvoi de la valeur d’autorisation si le POS, le DAB ou appareil similaire propose cette option. Voir Figure 50 pour un exemple où le payeur demande un renvoi de l’OTP.

    # Figure 50

    Figure 50 -- Le payeur demande le renvoi de la valeur d’autorisation (OTP)

    # Tentative de saisie de la valeur d’autorisation

    Le FSP payeur doit décider du nombre de tentatives autorisées pour la saisie de la valeur d’autorisation sur le POS, DAB ou appareil similaire. Ce nombre est fixé dans la chaîne de requête retriesLeft (voir Syntaxe URI pour plus de détails) dans le service GET /authorizations/{ID}. Si le FSP payeur envoie retriesLeft=1, cela signifie qu’il s’agit de la dernière tentative autorisée par le payeur. Voir Figure 51 pour un exemple où le payeur saisit un OTP incorrect et où la valeur retriesLeft est alors décrémentée.

    # Figure 51

    Figure 51 -- Le payeur saisit une valeur d’autorisation incorrecte (OTP)

    # Échec de l’autorisation OTP

    Si l’utilisateur échoue à saisir le bon OTP dans le nombre de tentatives autorisées, le processus décrit dans Demande de transaction rejetée par le payeur est suivi.

    # Requêtes

    Cette section décrit les services pouvant être demandés par un client de l’API sur la ressource /authorizations.

    # GET /authorizations/{ID}

    URI alternative : N/A

    Service logique d’API : Réaliser l’autorisation

    La requête HTTP GET /authorizations/{ID} est utilisée pour demander au payeur de saisir les identifiants dans le système du FSP bénéficiaire. Le {ID} dans l’URI doit contenir le transactionRequestID (voir Tableau 15), obtenu via le service POST /transactionRequests) plus tôt dans le processus.

    Cette requête nécessite que la chaîne de requête (voir Syntaxe URI pour plus d’infos) contienne les paires clé-valeur suivantes :

    • authenticationType={Type}, où {Type} est une valeur valide de l’énumération AuthenticationType.
    • retriesLeft={NrOfRetries}, où {NrOfRetries} est le nombre de tentatives restantes avant le rejet de la transaction financière. {NrOfRetries} doit être exprimé via le type de données Integer). retriesLeft=1 signifie qu’il s’agit de la dernière tentative.
    • amount={Amount}, où {Amount} est le montant de la transaction qui sera prélevé du compte du payeur. {Amount} doit être de type Amount.
    • currency={Currency}, où {Currency} est la devise de la transaction. La valeur {Currency} doit être conforme à l’énumération CurrencyCode).

    Exemple d’URI contenant toutes les clés requises :

    GET /authorization/3d492671-b7af-4f3f-88de-76169b1bdf88?authenticationType=OTP&retriesLeft=2&amount=102&currency=USD

    Informations sur les callbacks et le modèle de données pour GET /authorization/{ID} :

    # 6.6.4 Callbacks

    Cette section décrit les callbacks utilisés par le serveur sous la ressource /authorizations.

    # 6.6.4.1 PUT /authorizations/{ID}

    URI alternative : N/A

    Service logique d’API : Retourner le résultat de l’autorisation

    Le callback PUT /authorizations/ {ID} est utilisé pour informer le client du résultat d’une autorisation précédemment demandée. Le {ID} dans l’URI doit contenir l’identifiant utilisé dans le GET /authorizations/{ID}. Voir Tableau 27 pour le modèle de données.

    # Tableau 27
    Nom Cardinalité Type Description
    authenticationInfo 0..1 AuthenticationInfo OTP ou code QR si renseigné, sinon vide.
    responseType 1 AuthorizationResponse Enum contenant le résultat : si le client a saisi la valeur d’authentification, a rejeté la transaction ou a demandé le renvoi de la valeur d’authentification.

    Tableau 27 – Modèle de données PUT /authorizations/{ID}

    # Callbacks d’erreur

    Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource /authorizations.

    # PUT /authorizations/{ID}/error

    URI alternative : N/A

    Service logique d’API : Retourner une erreur d’autorisation

    Si le serveur ne trouve pas la demande de transaction, ou une autre erreur de traitement survient, le callback d’erreur PUT /authorizations/{ID} /error est utilisé. Le {ID} dans l’URI doit être celui utilisé dans le GET /authorizations/{ID}. Voir Tableau 28 pour le modèle de données.

    # Tableau 28
    Nom Cardinalité Type Description
    errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie

    Tableau 28 -- Modèle de données PUT /authorizations/{ID}/error

    # États

    Aucun état n’est défini pour la ressource /authorizations.


    # Ressource d’API /transfers

    Cette section définit la ressource logique d’API Transfers, décrite dans Modèles de transaction génériques.

    Les services fournis par la ressource d’API /transfers servent à effectuer le(s) transfert(s) ILP hop-by-hop et à réaliser la transaction financière de bout en bout en envoyant les détails de transaction du FSP payeur au FSP bénéficiaire. Les détails de la transaction sont envoyés en tant que partie du modèle de données de transfert dans le paquet ILP.

    Le protocole Interledger suppose que la mise en place d’une transaction financière se fait via un protocole de bout en bout, mais qu’un transfert ILP est réalisé via des protocoles hop-by-hop entre FSPs connectés au même registre. Dans la version actuelle de l’API, la ressource /quotes établit la transaction financière. Avant de réaliser un transfert, le devis doit être effectuée pour préparer la transaction. Voir Ressource API Quotes pour plus d’informations.

    Un transfert ILP s’effectue entre deux détenteurs de comptes sur chaque côté d’un registre commun. Il s’exprime généralement par une demande d’exécution d’un transfert sur le registre et une notification au bénéficiaire que le transfert est réservé en sa faveur, incluant une condition devant être remplie pour commettre le transfert.

    Quand le FSP bénéficiaire présente le fulfilment au registre commun, le transfert est commis sur le registre. Simultanément, le FSP payeur est notifié que le transfert a été commis ainsi que du fulfilment.

    # Historique des versions de la ressource

    Le Tableau 29 décrit les différentes versions de la ressource /transfers.

    Version Date Description
    1.0 2018-03-13 Version initiale
    1.1 2020-05-19 Ajout du support des notifications de commit via la méthode HTTP PATCH. La nouvelle requête PATCH /transfers/{ID} est décrite en Section 6.7.3.3. Le processus d’utilisation des notifications de commit est décrit en Section 6.7.2.6.

    Le modèle de données est mis à jour pour inclure un élément ExtensionList optionnel au type complexe PartyIdInfo (voir Change Request : https://github.com/mojaloop/mojaloop-specification/issues/30 (opens new window)). Suite à cela, le modèle de données du Tableau 93 a été mis à jour.

    Tableau 29 –- Historique des versions pour la ressource /transfers

    # Détails des services

    Cette section fournit des détails concernant les transferts hop-by-hop et les transactions financières de bout en bout.

    # Processus

    Figure 52 illustre le fonctionnement du processus transactionnel utilisant le service POST /transfers.

    # Figure 52

    Figure 52 -- Utilisation du service POST /transfers

    # Irrévocabilité des transactions

    L’API est conçue pour ne supporter que les transactions financières irrévocables ; c’est-à-dire qu’une transaction ne peut pas être modifiée, annulée ou inversée après sa création. Cela vise à simplifier et réduire les coûts pour les FSPs utilisant l’API. Une grande partie du coût opérationnel des systèmes financiers est due à l’inversion des transactions.

    Dès qu’un FSP payeur envoie une transaction au FSP bénéficiaire (via POST /transfers incluant la transaction de bout en bout), la transaction est irrévocable côté FSP payeur. Elle peut toutefois encore être rejetée côté FSP bénéficiaire, mais le payeur ne peut plus modifier ou rejeter la transaction. Une exception à cela serait si le délai d’expiration du transfert est dépassé avant que le FSP bénéficiaire ne réponde (voir Quote expirée et Client recevant un transfert expiré pour plus d’informations). Dès que la transaction a été acceptée par le FSP bénéficiaire, elle est irrévocable pour toutes les parties.

    # Devis expirée

    Si un serveur reçoit une transaction utilisant une devis expirée, il doit refuser le transfert ou la transaction.

    # Timeout et expiration

    Le FSP payeur doit toujours définir un temps d’expiration pour le transfert afin de permettre les cas d’utilisation nécessitant un traitement ou un échec rapide. Si le cas d’utilisation ne nécessite pas de réponse rapide, un délai d’expiration plus long peut être fixé. Si le FSP bénéficiaire ne répond pas avant le temps d’expiration, la transaction est annulée côté FSP payeur. Ce dernier doit cependant s’attendre à un callback du bénéficiaire.

    Les délais d’expiration courts sont souvent requis dans le commerce de détail, où un client se trouve devant un commerçant ; les deux parties doivent savoir si la transaction a réussi avant la remise d’un produit ou service.

    Dans Figure 52, un délai d’expiration de 30 secondes à partir de l’heure courante a été défini dans la requête du FSP payeur, et de 20 secondes dans la requête du Switch au FSP bénéficiaire. Cette stratégie de réduction du délai à chaque maillon de la chaîne du FSP payeur au bénéficiaire doit toujours être utilisée pour permettre un délai de communication supplémentaire.

    Remarque : Il est possible qu’un callback de succès soit reçu par le FSP payeur après l’expiration, par exemple lors d’une congestion réseau. Le FSP payeur devrait laisser un délai supplémentaire après l’expiration avant d’annuler la transaction dans le système. Si un callback de succès arrive après annulation, la transaction doit être marquée pour rapprochement et traitée à part.

    # Client recevant un transfert expiré

    Figure 53 illustre un scénario d’erreur lié à l’expiration et au timeout. Pour une raison quelconque, le callback du FSP bénéficiaire prend plus de temps à arriver que le délai d’expiration dans le Switch. Cela conduit le Switch à annuler le transfert réservé et à envoyer un callback d’erreur au FSP payeur. Ainsi, FSP payeur et bénéficiaire ont deux visions différentes du résultat de la transaction ; celle-ci doit être marquée pour rapprochement.

    # Figure 53

    Figure 53 -- Client recevant un transfert expiré

    Pour limiter ce type d’erreur, les clients (FSP payeur et Switch optionnel dans la Figure 52) participant au transfert ILP doivent permettre un délai supplémentaire post expiration permettant de recevoir le callback du serveur. Le(s) client(s) doivent aussi interroger le serveur après expiration et avant la fin du délai supplémentaire en cas de perte du callback. Un rapprochement pourrait néanmoins rester nécessaire, même avec ce délai et une interrogation du serveur.

    # Notification de commit

    Comme alternative pour éviter le scénario d’erreur décrit dans Client recevant un transfert expiré, pour les cas où il est compliqué d’effectuer un remboursement, un FSP bénéficiaire peut (si le schéma le permet) réserver le transfert puis attendre la notification de commit émise par le Switch. Demander une notification de commit plutôt qu’un commit direct relève de la décision métier du FSP bénéficiaire (si le schéma l’autorise), selon le contexte de la transaction. Par exemple, un retrait cash ou un paiement commerçant est plus risqué qu’un transfert P2P du fait de la difficulté de remboursement a posteriori. Pour demander la notification de commit depuis le Switch, le FSP bénéficiaire doit marquer l’état du transfert (voir Section 6.7.6) comme réservé (reserved) au lieu de commis (committed) dans le callback PUT /transfers/{ID} . Selon l’état, le Switch doit alors effectuer :

    • Si le transfert est commis, le Switch n’envoie pas de notification de commit puisque le FSP bénéficiaire a déjà accepté le risque. C’est la méthode de commit par défaut décrite dans Processus.
    • Si le transfert est réservé, le Switch doit envoyer une notification de commit au FSP bénéficiaire à la fin du traitement (commit ou annulation).

    La notification de commit est envoyée avec la requête PATCH /transfers/{ID} du Switch au FSP bénéficiaire. Si ce dernier ne reçoit pas la notification dans un délai raisonnable, il doit renvoyer le callback PUT /transfers/{ID} au Switch. Le FSP bénéficiaire doit recevoir la notification de commit du Switch avant de commettre le transfert, ou accepter le risque que le transfert ait échoué côté Switch. Il n’a pas le droit de rollbacker sans avoir reçu un état "aborted" (voir Section 6.7.6) du Switch, car il a déjà envoyé le fulfilment (déclencheur du commit). Figure 54 illustre un cas où une notification de commit est demandée. Ici, le commit a réussi côté Switch.

    # Figure 54

    Figure 54 -- Notification de commit après succès du transfert dans le Switch

    Figure 55 montre un exemple où le commit dans le Switch a échoué (par exemple expiration du délai dans le Switch à cause d’un incident réseau). C’est le même scénario que Figure 53, mais sans rapprochement à réaliser car le FSP bénéficiaire reçoit la notification de commit avant de réaliser effectivement le transfert.

    # Figure 55

    Figure 55 -- Notification de commit après échec du commit dans le Switch

    # Remboursements

    Au lieu de supporter les inversions, l’API supporte les remboursements. Pour rembourser une transaction via l’API, une nouvelle transaction doit être créée par le bénéficiaire initial. Celle-ci doit annuler la transaction originale (en totalité ou partiellement) ; par exemple, si le client X a envoyé 100 USD au commerçant Y, celui-ci crée une nouvelle transaction pour reverser 100 USD à X. Il existe un type de transaction spécifique pour indiquer un remboursement ; cela permet de gérer différemment le devis. L’ID de la transaction d’origine doit être inclus dans la nouvelle transaction à des fins d’information et de rapprochement.

    # Demande de paiement Interledger

    Dans le cadre du support d’Interledger et de la demande de paiement Interledger (voir Protocole Interledger), le FSP payeur doit joindre au transfert le paquet ILP, la condition ainsi qu’une date d’expiration. La condition et le paquet ILP sont les mêmes que ceux envoyés par le FSP bénéficiaire dans le callback du devis ; voir Demande de paiement Interledger pour plus d’informations.

    Le paiement ILP de bout en bout est une chaîne d’un ou plusieurs transferts conditionnels tous dépendants de la même condition. La condition est fournie par le FSP payeur lors de l’initiation du transfert vers le prochain ledger.

    Le récepteur du transfert extrait l’adresse ILP du bénéficiaire dans le paquet ILP et effectue un autre transfert sur le ledger suivant, en joignant le même paquet ILP et condition et en fixant une expiration plus courte que celle du transfert entrant.

    Quand le FSP bénéficiaire reçoit le dernier transfert entrant pour le compte du bénéficiaire, il extrait le paquet ILP et procède ainsi :

    1. Valide que l’adresse ILP du bénéficiaire dans le paquet ILP correspond au compte bénéficiaire de destination.
    2. Valide que le montant dans le paquet ILP correspond au montant du transfert et déclenche la réservation sur le registre local (moins les éventuels frais cachés au bénéficiaire, voir Devis).
    3. Si la réservation est un succès, le FSP bénéficiaire génère le fulfilment à l’aide du même algorithme que celui utilisé pour générer la condition envoyée dans le callback du devis (voir Demande de paiement Interledger).
    4. Le fulfilment est soumis au registre du FSP bénéficiaire pour engager la réservation en faveur du bénéficiaire. Le registre valide que le hash SHA-256 du fulfilment correspond à la condition du transfert. Si oui, il valide la transaction. Sinon, il la rejette, et le FSP bénéficiaire annule la réservation préalablement effectuée.

    Le fulfilment est ensuite transmis au FSP payeur via la même chaîne de registres dans le callback du transfert. Chaque ledger engage les fonds après validation du fulfilment, et l’entité initiatrice est notifiée que ses fonds ont été libérés et reçoit le fulfilment.

    Le dernier transfert à engager est celui sur le registre du FSP payeur, où la réservation est déduite de son compte. Le FSP payeur notifie alors le payeur du succès de la transaction.

    # Requêtes

    Cette section décrit les services pouvant être demandés par un client de l’API sur la ressource /transfers.

    # GET /transfers/{ID}

    URI alternative : N/A

    Service logique d’API : Retourner le résultat de l’autorisation

    La requête HTTP GET /transfers/{ID} est utilisée pour obtenir des informations sur un transfert créé ou demandé précédemment. Le {ID} dans l’URI doit contenir le transferId (voir Tableau 23) utilisé lors de la création du transfert.

    Informations sur les callbacks et modèle de données pour GET /transfers/{ID} :

    # POST /transfers

    URI alternative : N/A

    Service logique d’API : Effectuer le transfert

    La requête HTTP POST /transfers est utilisée pour demander la création d’un transfert pour le prochain ledger, et une transaction financière pour le FSP bénéficiaire.

    Informations sur les callbacks et modèle de données pour POST /transfers :

    # Tableau 30
    Nom Cardinalité Type Description
    transferId 1 CorrelationId Identifiant commun entre les FSPs et le Switch optionnel pour l’objet de transfert, défini par le FSP payeur. À réutiliser pour les rééditions, à régénérer pour chaque nouveau transfert.
    payeeFsp 1 FspId FSP bénéficiaire dans la transaction financière proposée.
    payerFsp 1 FspId FSP payeur dans la transaction financière proposée.
    amount 1 Money Montant à transférer.
    ilpPacket 1 IlpPacket Paquet ILP contenant le montant remis au bénéficiaire, l’adresse ILP du bénéficiaire et toutes données end-to-end.
    condition 1 IlpCondition Condition devant être remplie pour engager le transfert.
    expiration 1 DateTime L’expiration permet de générer un échec rapide si besoin. Le transfert doit être annulé si aucun fulfilment n’est délivré avant cette limite.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 30 – Modèle de données POST /transfers

    # PATCH /transfers/{ID}

    URI alternative : N/A

    Service logique d’API : Notification de commit

    La requête HTTP PATCH /transfers/{ID} est utilisée par un Switch pour mettre à jour l’état d’un transfert réservé si le FSP bénéficiaire a demandé une notification de commit, une fois le traitement terminé côté Switch. Le {ID} doit contenir le transferId (voir Tableau 30) utilisé pour la création du transfert. Notez que cette requête ne génère pas de callback. Voir Tableau 31 pour le modèle de données.

    # Tableau 31
    Nom Cardinalité Type Description
    completedTimestamp 1 DateTime Date et heure d’achèvement de la transaction
    transferState 1 TransferState État du transfert
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 31 – Modèle de données PATCH /transfers/{ID}

    # Callbacks

    Cette section décrit les callbacks utilisés par le serveur sous la ressource /transfers.

    # PUT /transfers/{ID}

    URI alternative : N/A

    Service logique d’API : Retourner les informations du transfert

    Le callback PUT /transfers/{ID} est utilisé pour informer le client d’un transfert demandé ou créé. Le {ID} dans l’URI doit contenir le transferId (voir Tableau 30) utilisé à la création ou celui utilisé dans le GET /transfers/{ID}. Voir Tableau 32 pour le modèle de données.

    Remarque : pour les callbacks PUT /transfers/{ID} , l’état ABORTED n’est pas une option valide pour le champ transferState en Tableau 32. Si un transfert doit être rejeté, l’émetteur du callback doit utiliser un callback d’erreur, c’est-à-dire callback sur l’endpoint /error. Cependant, l’état ‘ABORTED’ est valide en réponse à un appel GET /transfers/{ID} .

    # Tableau 32
    Nom Cardinalité Type Description
    fulfilment 0..1 IlpFulfilment Fulfilment (accomplissement) de la condition spécifiée avec la transaction. Obligatoire en cas de succès du transfert.
    completedTimestamp 0..1 DateTime Date et heure d’achèvement de la transaction
    transferState 1 TransferState État du transfert
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement

    Tableau 32 -- Modèle de données PUT /transfers/{ID}

    # Callbacks d’erreur

    Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource /transfers.

    # PUT /transfers/{ID}/error

    URI alternative : N/A

    Service logique d’API : Retourner une erreur d’information de transfert

    Si le serveur ne trouve pas ou ne crée pas un transfert, ou qu’une autre erreur de traitement survient, le callback d’erreur PUT

    /transfers/{ID}/error est utilisé. Le {ID} dans l’URI doit être le transferId (voir Tableau 30) utilisé lors de la création du transfert, ou celui utilisé dans le GET /transfers/{ID}. Voir Tableau 33 pour le modèle de données.

    # Tableau 33
    Nom Cardinalité Type Description
    errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

    Tableau 33 -- Modèle de données PUT /transfers/{ID}/error

    6.7.6 États

    # Figure 56

    Les états possibles d’un transfert sont représentés dans Figure 56.

    Figure 56

    Figure 56 -- États possibles d’un transfert


    # Ressource d’API /transactions

    Cette section définit la ressource logique d’API Transactions, décrite dans Modèles de transaction génériques.

    Les services fournis par la ressource /transactions permettent d’obtenir des informations sur la transaction financière de bout en bout exécutée ; par exemple, obtenir les détails d’un éventuel code/ticket généré lors de la transaction.

    La transaction financière réelle est exécutée via la ressource d’API /transfers, qui inclut la transaction de bout en bout entre le FSP payeur et le FSP bénéficiaire.

    # Historique des versions de la ressource

    Tableau 34 décrit les différentes versions de la ressource /transactions.

    # Tableau 34
    Version Date Description
    1.0 2018-03-13 Version initiale

    Tableau 34 – Historique des versions de la ressource /transactions

    # Détails des services

    Figure 57 montre un exemple du processus de transaction. La transaction réelle sera exécutée lors du processus de transfert. Le service GET /transactions/{TransactionID} peut ensuite être utilisé pour obtenir plus d’informations sur la transaction financière exécutée lors du transfert.

    # Figure 57

    Figure 57 -- Exemple de processus de transaction

    # Requêtes

    Cette section décrit les services pouvant être demandés par un client sur la ressource /transactions.

    # GET /transactions/{ID}

    URI alternative : N/A

    Service logique d’API : Récupérer les informations sur la transaction

    La requête HTTP GET /transactions/{ID} est utilisée pour obtenir des informations sur une transaction financière précédemment créée. Le {ID} doit correspondre au transactionId utilisé lors de la création du devis (voir Tableau 23), car la transaction est créée dans le cadre d’un autre processus (le transfert, voir API Resource Transfers).

    Informations sur les callbacks et modèles de données pour GET /transactions/{ID} :

    # Callbacks

    Cette section décrit les callbacks utilisés par le serveur sous la ressource /transactions.

    # PUT /transactions/{ID}

    URI alternative : N/A

    Service logique d’API : Retourner les informations de la transaction

    Le callback PUT /transactions/{ID} est utilisé pour informer le client d’une transaction demandée. Le {ID} doit être celui utilisé dans le GET /transactions/{ID}. Voir Tableau 35 pour le modèle de données.

    # Tableau 35
    Nom Cardinalité Type Description
    completedTimestamp 0..1 DateTime Date et heure d’achèvement de la transaction.
    transactionState 1 TransactionState État de la transaction.
    code 0..1 Code Information de code/jeton de rédemption optionnelle fournie au payeur après finalisation de la transaction.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 35 -- Modèle de données PUT /transactions/{ID}

    # Callbacks d’erreur

    Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource /transactions.

    # PUT /transactions/{ID}/error

    URI alternative : N/A

    Service logique d’API : Retourner une erreur concernant la transaction

    Si le serveur ne parvient pas à trouver ou créer une transaction, ou en cas d’erreur de traitement, le callback d’erreur PUT /transactions/{ID}/error est utilisé. Le {ID} doit être celui utilisé dans le GET /transactions/{ID}. Voir Tableau 36 pour le modèle de données.

    # Tableau 36
    Nom Cardinalité Type Description
    errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

    Tableau 36 -- Modèle de données PUT /transactions/{ID}/error

    # États

    # Figure 58

    Les états possibles d'une transaction sont illustrés à la Figure 58.

    Remarque : À des fins de rapprochement, un serveur doit conserver dans sa base de données, pendant une période définie par le système, les objets transactionnels ayant été rejetés. Cela signifie qu’un client peut s’attendre à recevoir un callback approprié concernant une transaction (si celle-ci a bien été reçue par le serveur) lorsqu’il demande des informations à son sujet.

    Figure 58

    Figure 58 -- États possibles d'une transaction


    # Ressource API /bulkQuotes

    Cette section définit la ressource logique d'API Bulk Quotes (Devis en lot), comme décrit dans Modèles de transactions génériques.

    Les services fournis par la ressource API /bulkQuotes sont utilisés pour demander la création d’un devis en lot, c’est-à-dire un devis pour plus d’une transaction financière. Pour plus d’informations concernant un devis unique pour une transaction, voir la ressource API /quotes.

    Un objet de devis en lot créé contient un devis pour chaque transaction individuelle du lot au sein d’un FSP Pair. Un devis en lot est irrévocable ; il ne peut pas être modifié après sa création. Toutefois, il peut expirer (tous les devis en lot ne sont valables que jusqu’à leur expiration).

    Remarque : Un devis en lot n’est pas une garantie de réussite de la transaction financière. La transaction en lot peut toujours échouer ultérieurement dans le processus. Un devis en lot garantit seulement que les frais et commissions FSP applicables à l'opération spécifiée restent valables tant que le devis n’est pas expiré.

    # Historique des versions de la ressource

    Le Tableau 37 présente une description de chaque version différente de la ressource /bulkQuotes.

    Version Date Description
    1.0 2018-03-13 Version initiale
    1.1 2020-05-19 Le modèle de données a été mis à jour pour ajouter un élément optionnel ExtensionList au type complexe PartyIdInfo suite à la demande de changement : https://github.com/mojaloop/mojaloop-specification/issues/30. Par la suite, le modèle de données tel que spécifié dans le Tableau 93 a été mis à jour.

    Tableau 37 –- Historique des versions pour la ressource /bulkQuotes

    # Détails du service

    La Figure 59 illustre le fonctionnement du processus de devis en lot, utilisant le service POST /bulkQuotes. À la réception d’un lot de transactions de la part du Payeur, le FSP du Payeur doit :

    1. Rechercher à quel FSP appartient chaque Bénéficiaire ; par exemple, en utilisant la ressource API /participants.

    2. Diviser le lot selon le FSP du Bénéficiaire. Le service POST /bulkQuotes est alors utilisé pour chaque FSP de Bénéficiaire pour obtenir les devis en lot de chacun. Chaque résultat de devis contiendra le paquet ILP et la condition (voir Paquet ILP et Transferts conditionnels) nécessaires pour effectuer chaque transfert dans le transfert en lot (voir la ressource API /bulkTransfers), qui réalisera effectivement la transaction financière du Payeur vers chaque Bénéficiaire.

    # Figure 59

    Figure 59 -- Exemple de processus de devis en lot

    # Requêtes

    Cette section décrit les services pouvant être demandés par un client sur la ressource API /bulkQuotes.

    # GET /bulkQuotes/{ID}

    URI alternative : N/A

    Service logique d’API : Récupérer les informations du devis en lot

    La requête HTTP GET /bulkQuotes/{ID} est utilisée pour obtenir des informations concernant un devis en lot préalablement créé ou demandé.

    Le {ID} de l’URI doit contenir le bulkQuoteId (voir Tableau 38) utilisé pour la création du devis en lot.

    Informations sur les callbacks et le modèle de données pour GET /bulkQuotes/{ID} :

    # POST /bulkQuotes

    URI alternative : N/A

    Service logique d’API : Calculer un devis en lot

    La requête HTTP POST /bulkQuotes est utilisée pour demander la création d’un devis en lot pour les transactions financières fournies sur le serveur.

    Informations sur les callbacks et le modèle de données pour POST /bulkQuotes :

    # Tableau 38
    Nom Cardinalité Type Description
    bulkQuoteId 1 CorrelationId Identifiant commun entre les FSPs pour l'objet devis en lot, décidé par le FSP du Payeur. L’ID doit être réutilisé pour les renvois du même devis en lot. Un nouvel ID doit être généré pour chaque nouveau devis en lot.
    payer 1 Party Informations sur le Payeur dans la transaction financière proposée.
    geoCode 0..1 GeoCode Longitude et latitude de la Partie initiatrice. Peut être utilisé pour détecter une fraude.
    expiration 0..1 DateTime L’expiration est optionnelle et permet au FSP du Bénéficiaire de savoir quand un devis n’a plus besoin d’être renvoyé.
    individualQuotes 1..1000 IndividualQuote Liste des éléments de devis individuels.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 38 -- Modèle de données POST /bulkQuotes

    # Callbacks

    Cette section décrit les callbacks utilisés par le serveur sous la ressource /bulkQuotes.

    # PUT /bulkQuotes/{ID}

    URI alternative : N/A

    Service logique d’API : Retourner les informations du devis en lot

    Le callback PUT /bulkQuotes/{ID} est utilisé pour informer le client d’un devis en lot demandé ou créé. Le {ID} de l’URI doit contenir le bulkQuoteId (voir Tableau 38) utilisé pour la création du devis en lot, ou le {ID} qui a été utilisé dans le GET /bulkQuotes/{ID}. Voir Tableau 39 pour le modèle de données.

    # Tableau 39
    Nom Cardinalité Type Description
    individualQuoteResults 0..1000 IndividualQuoteResult Frais pour chaque transaction individuelle, si certains sont facturés par transaction.
    expiration 1 DateTime Date et heure jusqu'à laquelle le devis est valable et peut être honoré dans une demande de transaction ultérieure.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 39 -- Modèle de données PUT /bulkQuotes/{ID}

    # Callbacks d’erreur

    Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource /bulkQuotes.

    # PUT /bulkQuotes/{ID}/error

    URI alternative : N/A

    Service logique d’API : Retourner une erreur concernant le devis en lot

    Si le serveur ne parvient pas à trouver ou créer un devis en lot, ou en cas d’erreur de traitement, le callback d’erreur PUT /bulkQuotes/{ID}/error est utilisé. Le {ID} de l’URI doit contenir le bulkQuoteId (voir Tableau 38) utilisé pour la création du devis, ou le {ID} utilisé dans le GET /bulkQuotes/{ID}. Voir Tableau 40 pour le modèle de données.

    # Tableau 40
    Nom Cardinalité Type Description
    errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

    Tableau 40 -- Modèle de données PUT /bulkQuotes/{ID}/error

    # États

    # Figure 60

    Les états possibles d’un devis en lot sont illustrés à la Figure 60.

    Remarque : Un serveur n’a pas besoin de conserver dans sa base de données les objets de devis en lot qui ont été rejetés ou expirés. Cela signifie qu’un client doit s’attendre à recevoir un callback d’erreur pour un devis en lot rejeté ou expiré.

    Figure 60

    Figure 60 -- États possibles d’un devis en lot


    # Ressource API /bulkTransfers

    Cette section définit la ressource logique d'API Bulk Transfers (Transferts en lot), comme décrit dans Modèles de transactions génériques.

    Les services fournis par la ressource API /bulkTransfers sont utilisés pour demander la création d’un transfert en lot ou pour obtenir des informations sur un transfert en lot précédemment demandé. Pour plus d'informations sur un transfert individuel, voir la ressource API /transfers. Avant qu’un transfert en lot ne puisse être demandé, un devis en lot doit être réalisé. Voir la ressource API /bulkQuotes pour plus d’informations.

    Un transfert en lot est irrévocable ; il ne peut pas être modifié, annulé ou inversé après avoir été envoyé par le FSP du Payeur.

    # Historique des versions de la ressource

    Le Tableau 41 présente une description de chaque version différente de la ressource /bulkTransfers.

    Version Date Description
    1.0 2018-03-13 Version initiale
    1.1 2020-05-19 Le modèle de données a été mis à jour pour ajouter un élément optionnel ExtensionList au type complexe PartyIdInfo suite à la demande de changement : https://github.com/mojaloop/mojaloop-specification/issues/30. Par la suite, le modèle de données tel que spécifié dans le Tableau 93 a été mis à jour.

    Tableau 41 –- Historique des versions pour la ressource /bulkTransfers

    # Détails du service

    La Figure 61 illustre le fonctionnement du processus de transfert en lot utilisant le service POST /bulkTransfers. Lors de la réception des transactions groupées du Payeur, le FSP du Payeur doit effectuer les étapes suivantes :

    1. Rechercher à quel FSP appartient chaque Bénéficiaire ; par exemple, en utilisant la ressource API /participants, Section 6.2.
    2. Effectuer le processus de devis en lot en utilisant la ressource API /bulkQuotes, Section 6.9. Le callback du devis en lot doit contenir les paquets ILP requis et les conditions nécessaires à l’exécution de chaque transfert.
    3. Effectuer le processus de transfert en lot comme dans la Figure 61 en utilisant POST /bulkTransfers. Ceci réalise chaque transfert “hop-to-hop” et la transaction financière de bout en bout. Pour plus d’informations sur les transferts “hop-to-hop” versus les transactions financières de bout en bout, voir Section 6.7.
    # Figure 61

    Figure 61 -- Exemple de processus de transfert en lot

    # Requêtes

    Cette section décrit les services pouvant être demandés par un client sur la ressource /bulkTransfers.

    # GET /bulkTransfers/{ID}

    URI alternative : N/A

    Service logique d’API : Récupérer les informations du transfert en lot

    La requête HTTP GET /bulkTransfers/{ID} est utilisée pour obtenir des informations concernant un transfert en lot préalablement créé ou demandé. Le {ID} de l’URI doit contenir le bulkTransferId (voir Tableau 42) utilisé pour la création du transfert.

    Informations sur les callbacks et le modèle de données pour GET /bulkTransfers/{ID} :

    # POST /bulkTransfers

    URI alternative : N/A

    Service logique d’API : Exécuter un transfert en lot

    La requête HTTP POST /bulkTransfers est utilisée pour demander la création d’un transfert en lot sur le serveur.

    # Tableau 42
    Nom Cardinalité Type Description
    bulkTransferId 1 CorrelationId Identifiant commun entre les FSPs et éventuellement le Switch pour l'objet transfert en lot, décidé par le FSP du Payeur. L’ID doit être réutilisé pour les renvois du même transfert en lot. Un nouvel ID doit être généré pour chaque nouveau transfert en lot.
    bulkQuoteId 1 CorrelationId ID du devis en lot associé
    payeeFsp 1 FspId Identifiant du FSP du Bénéficiaire.
    payerFsp 1 FspId Identifiant du FSP du Payeur.
    individualTransfers 1..1000 IndividualTransfer Liste des éléments IndividualTransfer.
    expiration 1 DateTime Date d’expiration des transferts.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 42 -- Modèle de données POST /bulkTransfers

    # Callbacks

    Cette section décrit les callbacks utilisés par le serveur sous la ressource /bulkTransfers.

    # PUT /bulkTransfers/{ID}

    URI alternative : N/A

    Service logique d’API : Récupérer les informations du transfert en lot

    Le callback PUT /bulkTransfers/{ID} est utilisé pour informer le client d’un transfert en lot demandé ou créé. Le {ID} de l’URI doit contenir le bulkTransferId (voir Tableau 42) utilisé pour la création du transfert (POST /bulkTransfers), ou le {ID} utilisé dans le GET /bulkTransfers/{ID}. Voir Tableau 43 pour le modèle de données.

    # Tableau 43
    Nom Cardinalité Type Description
    completedTimestamp 0..1 DateTime Date et heure de la finalisation de la transaction de lot.
    individualTransferResults 0..1000 Erreur ! Source de référence introuvable. Liste des éléments Erreur ! Source de référence introuvable.
    bulkTransferState 1 BulkTransferState État du transfert en lot.
    extensionList 0..1 ExtensionList Extension optionnelle, spécifique au déploiement.

    Tableau 43 -- Modèle de données PUT /bulkTransfers/{ID}

    # Callbacks d’erreur

    Cette section décrit les callbacks d’erreur utilisés par le serveur sous la ressource /bulkTransfers.

    # PUT /bulkTransfers/{ID}/error

    URI alternative : N/A

    Service logique d’API : Retourner une erreur concernant le transfert en lot

    Si le serveur ne parvient pas à trouver ou créer un transfert en lot, ou en cas d’erreur de traitement, le callback d’erreur PUT /bulkTransfers/{ID}/error est utilisé. Le {ID} de l’URI doit contenir le bulkTransferId (voir Tableau 42) utilisé pour la création du transfert (POST /bulkTransfers), ou le {ID} utilisé dans le GET /bulkTransfers/{ID}. Voir Tableau 44 pour le modèle de données.

    # Tableau 44
    Nom Cardinalité Type Description
    errorInformation 1 ErrorInformation Code d’erreur, description de la catégorie.

    Tableau 44 -- Modèle de données PUT /bulkTransfers/{ID}/error

    # États

    # Figure 62

    Les états possibles d’un transfert en lot sont illustrés à la Figure 62.

    Remarque : À des fins de rapprochement, un serveur doit conserver dans sa base de données les objets de transfert en lot ayant été rejetés durant une période définie par le marché. Cela signifie qu’un client peut s’attendre à recevoir un callback approprié concernant un transfert en lot (si celui-ci a bien été reçu par le serveur) lorsqu’il demande des informations à son sujet.

    Figure 62

    Figure 62 -- États possibles d’un transfert en lot


    # Modèles de données de support de l’API

    Cette section fournit des informations sur des modèles de données complémentaires utilisés par l’API.

    # Introduction sur le format

    Cette section introduit les formats utilisés pour les types de données des éléments employés par l’API.

    Tous les types de données d’élément ont à la fois une longueur minimale et maximale. Ces longueurs sont indiquées de l’une des façons suivantes :

    • Une longueur minimale et maximale
    • Une longueur exacte
    • Une expression régulière limitant l’élément de façon à n’autoriser qu’une ou plusieurs longueurs spécifiques.

    # Longueur minimale et maximale

    Lorsqu’une longueur minimale et maximale est utilisée, cela sera indiqué après le type de données entre parenthèses : d’abord la valeur minimale (incluse), suivie de deux points consécutifs, puis la valeur maximale (incluse).

    Exemples :

    • String(1..32) – Une chaîne de caractères d’au moins un caractère et au maximum 32 caractères.
    • Integer(3..10) - Un entier d’au moins 3 chiffres et au maximum 10 chiffres.

    # Longueur exacte

    Lorsqu’une longueur exacte est utilisée, cela sera indiqué après le type de données entre parenthèses contenant une seule valeur exacte. Les autres longueurs ne sont pas permises.

    Exemples :

    • String(3) – Une chaîne de caractères d’exactement trois caractères.
    • Integer(4) – Un entier d’exactement quatre chiffres.

    # Expressions régulières

    Certains types de données d’élément sont limités par des expressions régulières. Les expressions régulières dans ce document utilisent la norme de syntaxe et les classes de caractères établies par le langage de programmation Perl30 (opens new window).

    # Formats des types de données d’éléments

    Cette section définit les types de données d’éléments utilisés par l’API.

    # String

    Le type de données API String est une chaîne JSON normale31 (opens new window), limitée par un nombre maximum et minimum de caractères.

    # Exemple de format I

    String(1..32) – Une chaîne de caractères d’au moins 1 caractère et au maximum 32 caractères.

    Un exemple de String(1..32) apparaît ci-dessous :

    • Cette chaîne fait 28 caractères
    # Exemple de format II

    String(1..128) – Une chaîne de caractères d’au moins 1 caractère et au maximum 128 caractères.

    Un exemple de String(32..128) apparaît ci-dessous :

    • Cette chaîne est plus longue que 32 caractères, mais inférieure à 128

    # Enum

    Le type de données API Enum est une liste restreinte de valeurs JSON String) autorisées ; une énumération de valeurs. D’autres valeurs que celles définies dans la liste ne sont pas autorisées.

    # Exemple de format

    Enum of String(1..32) – Une chaîne de caractères d’au moins un caractère et au maximum 32 caractères restreinte par la liste des valeurs autorisées. La description de l’élément contient un lien vers l’énumération.


    # UndefinedEnum

    Le type de données d’API UndefinedEnum est une chaîne JSON constituée de 1 à 32 caractères en majuscule, incluant le caractère de soulignement (**_****).

    # Expression régulière

    L’expression régulière limitant le type UndefinedEnum apparaît dans Liste 13.

    # Liste 13
    ^[A-Z_]{1,32}$
    

    Liste 13 -- Expression régulière pour le type de données UndefinedEnum


    # Name

    Le type de données API Name est une chaîne JSON, restreinte par une expression régulière pour éviter les caractères généralement non utilisés dans un nom.

    # Expression régulière

    L’expression régulière limitant le type Name apparaît dans la Liste 14 ci-dessous. La contrainte n’autorise pas une chaîne constituée uniquement d’espaces, tous les caractères Unicode32 sont autorisés, ainsi que le point (.), l’apostrophe ('), le tiret (-), la virgule (,) et l’espace ( ). Le nombre maximal de caractères pour Name est 128.

    Remarque : Dans certains langages de programmation, le support Unicode doit être explicitement activé. Par exemple, si Java est utilisé, il faut activer le flag UNICODE_CHARACTER_CLASS pour permettre les caractères Unicode.

    # Liste 14
    ^(?!\s*$)[\w .,'-]{1,128}$
    

    Liste 14 -- Expression régulière pour le type de données Name


    # Integer

    Le type de données API Integer est une chaîne JSON composée uniquement de chiffres. Les nombres négatifs et les zéros initiaux ne sont pas autorisés. Le type de données est toujours limité par un nombre de chiffres.

    # 7.2.5.1 Expression régulière

    L’expression régulière restreignant le type Integer apparaît à la Liste 15.

    # Liste 15
    ^[1-9]\d*$
    

    Liste 15 -- Expression régulière pour le type de données Integer

    # Exemple de format

    Integer(1..6) – Un Integer d’au moins un chiffre et de six chiffres au maximum.

    Un exemple de Integer(1..6) apparaît ci-dessous :

    • 123456

    # OtpValue

    Le type de données API OtpValue est une chaîne JSON de trois à dix caractères composée uniquement de chiffres. Les nombres négatifs ne sont pas autorisés. Un ou plusieurs zéros initiaux sont autorisés.

    # Expression régulière

    L’expression régulière limitant le type OtpValue apparaît dans la Liste 16.

    # Liste 16
    ^\d{3,10}$
    

    Liste 16 -- Expression régulière pour le type de données OtpValue


    # BopCode

    Le type de données API BopCode est une chaîne JSON de trois caractères, composée uniquement de chiffres. Les nombres négatifs ne sont pas autorisés. Un zéro initial n’est pas permis.

    # Expression régulière

    L’expression régulière limitant le type BopCode apparaît à la Liste 17.

    # Liste 17
    ^[1-9]\d{2}$
    

    Liste 17 -- Expression régulière pour le type de données BopCode


    # ErrorCode

    Le type de données API ErrorCode est une chaîne JSON de quatre caractères, composée uniquement de chiffres. Les nombres négatifs ne sont pas autorisés. Un zéro initial n’est pas permis.

    # Expression régulière

    L’expression régulière limitant le type ErrorCode apparaît à la Liste 18.

    # Liste 18
    ^[1-9]\d{3}$
    

    Liste 18 -- Expression régulière pour le type de données ErrorCode


    # TokenCode

    Le type de données API TokenCode est une chaîne JSON comprise entre quatre et 32 caractères. Elle peut être composée de chiffres, de lettres majuscules (A à Z), de lettres minuscules (a à z), ou d’une combinaison des trois.

    # 7.2.9.1 Expression régulière

    L’expression régulière limitant le type TokenCode apparaît à la Liste 19.

    # Liste 19
    ^[0-9a-zA-Z]{4,32}$
    

    Liste 19 -- Expression régulière pour le type de données TokenCode


    # MerchantClassificationCode

    Le type de données API MerchantClassificationCode est une chaîne JSON composée de un à quatre chiffres.

    # 7.2.10.1 Expression régulière

    L’expression régulière limitant le type MerchantClassificationCode apparaît à la Liste 20.

    # Liste 20
    ^[\d]{1,4}$
    

    Liste 20 -- Expression régulière pour le type de données MerchantClassificationCode


    # Latitude

    Le type de données API Latitude est une chaîne JSON au format lexical restreinte par une expression régulière pour des raisons d’interopérabilité.

    # 7.2.11.1 Expression régulière

    L’expression régulière limitant le type Latitude apparaît à la Liste 21.

    # Liste 21
    ^(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$
    

    Liste 21 -- Expression régulière pour le type de données Latitude


    # Longitude

    Le type de données API Longitude est une chaîne JSON au format lexical restreinte par une expression régulière pour des raisons d’interopérabilité.

    # 7.2.12.1 Expression régulière

    L’expression régulière limitant le type Longitude apparaît à la Liste 22.

    # Liste 22
    ^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$
    

    Liste 22 -- Expression régulière pour le type de données Longitude


    # Amount

    Le type de données API Amount est une chaîne JSON au format canonique restreinte par une expression régulière pour des raisons d’interopérabilité.

    # Expression régulière

    L’expression régulière limitant le type Amount apparaît à la Liste 23. Ce motif n’autorise aucune décimale finale à zéro, mais autorise un montant sans unité monétaire mineure. Il permet également uniquement quatre chiffres dans l’unité monétaire mineure ; une valeur négative n’est pas acceptée. L’utilisation de plus de 18 chiffres dans l’unité monétaire majeure n’est pas acceptée.

    # Liste 23
    ^([0]|([1-9][0-9]{0,17}))([.][0-9]{0,3}[1-9])?$
    

    Liste 23 -- Expression régulière pour le type de données Amount

    # Exemples de valeurs

    Consultez le Tableau 45 pour les résultats de validation pour quelques exemples de valeurs Amount à l’aide de l’expression régulière.

    # Tableau 45
    Valeur Résultat de validation
    5 Acceptée
    5.0 Rejetée
    5. Rejetée
    5.00 Rejetée
    5.5 Acceptée
    5.50 Rejetée
    5.5555 Acceptée
    5.55555 Rejetée
    555555555555555555 Acceptée
    5555555555555555555 Rejetée
    -5.5 Rejetée
    0.5 Acceptée
    .5 Rejetée
    00.5 Rejetée
    0 Acceptée

    Tableau 45 -- Exemples de résultats pour différentes valeurs du type Amount


    # DateTime

    Le type de données API DateTime est une chaîne JSON au format lexical qui est restreinte par une expression régulière pour des raisons d’interopérabilité.

    # 7.2.14.1 Expression Régulière

    L’expression régulière limitant le type DateTime apparaît à la Liste 24. Le format est conforme à l’ISO 8601, exprimé en une date, une heure et un fuseau horaire combinés. Une version plus lisible du format est :

    aaaa-MM-jjTHH:mm:ss.SSS[-HH:MM]

    # Liste 24
    ^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468\][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:(\.\d{3}))(?:Z|[+-][01]\d:[0-5]\d)$
    

    Liste 24 -- Expression régulière pour le type de données DateTime

    # Exemples

    Deux exemples du type DateTime apparaissent ci-dessous :

    2016-05-24T08:38:08.699-04:00

    2016-05-24T08:38:08.699Z (où Z indique le fuseau horaire Zulu, identique à UTC).


    # Date

    Le type de données API Date est une chaîne JSON au format lexical restreinte par une expression régulière pour garantir l’interopérabilité.

    # Expression Régulière

    L’expression régulière restreignant le type Date apparaît à la Liste 25. Ce format, tel que spécifié dans la norme ISO 8601, contient uniquement une date. Une version plus lisible est aaaa-MM-jj.

    # Liste 25
    ^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)$
    

    Liste 25 -- Expression régulière pour le type de données Date

    # Exemples

    Deux exemples de type Date apparaissent ci-dessous :

    • 1982-05-23

    • 1987-08-05


    # UUID

    Le type de données API UUID (Identifiant Unique Universel) est une chaîne JSON au format canonique, conforme à la RFC 4122, restreinte par une expression régulière pour garantir l’interopérabilité. Un UUID fait toujours 36 caractères de long, soit 32 caractères hexadécimaux et quatre tirets (« - »).

    # 7.2.16.1 Expression Régulière

    L’expression régulière restreignant le type UUID figure à la Liste 26.

    # Liste 26
    ^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    

    Liste 26 -- Expression régulière pour le type de données UUID

    # Exemple

    Un exemple de type UUID :

    • a8323bc6-c228-4df2-ae82-e5a997baf898

    # BinaryString

    Le type de données API BinaryString est une chaîne JSON. La chaîne est un encodage base64url d’une séquence d’octets bruts, où un caractère de bourrage (‘=’) est ajouté à la fin des données si besoin afin de garantir que la chaîne est un multiple de quatre caractères. La contrainte de longueur indique le nombre de caractères autorisés.

    # Expression Régulière

    L’expression régulière limitant le type BinaryString apparaît à la Liste 27.

    # Liste 27
    ^[A-Za-z0-9-_]+[=]{0,2}$
    

    Liste 27 -- Expression régulière pour le type de données BinaryString

    # Exemple de format

    BinaryString(32) – 32 octets de données encodés en base64url.

    Un exemple de BinaryString(32..256) figure ci-dessous. Notez qu’un caractère de bourrage '=' a été ajouté pour garantir que la chaîne soit un multiple de quatre caractères.

    • QmlsbCAmIE1lbGluZGEgR2F0ZXMgRm91bmRhdGlvbiE=

    # BinaryString32

    Le type de données API BinaryString32 est une version à taille fixe du type de données API BinaryString défini plus haut, où les données sont toujours de 32 octets. BinaryString32 ne doit pas utiliser de caractère de bourrage puisque la taille des données sous-jacentes est fixe.

    # Expression Régulière

    L’expression régulière limitant le type BinaryString32 apparaît à la Liste 28.

    # Liste 28
    ^[A-Za-z0-9-_]{43}$
    

    Liste 28 -- Expression régulière pour le type de données BinaryString32

    # Exemple de format

    BinaryString(32) – 32 octets de données encodés en base64url.

    Un exemple de BinaryString32 figure ci-dessous. Il s’agit des mêmes données binaires que dans l’exemple du format d’exemple du type BinaryString, mais comme la taille sous-jacente est fixe, le caractère de bourrage '=' est exclu.

    QmlsbCAmIE1lbGluZGEgR2F0ZXMgRm91bmRhdGlvbiE
    

    # Définitions des éléments

    Cette section définit les types d’éléments utilisés par l’API.

    # Élément AmountType

    Le tableau 46 ci-dessous présente le modèle de données pour l’élément AmountType.

    # Tableau 46
    Nom Cardinalité Type Description
    AmountType 1 Enum de String(1..32) Cet élément contient le type de montant. Voir l’énumération AmountType pour plus d’informations sur les valeurs autorisées.

    Tableau 46 – Élément AmountType


    # Élément AuthenticationType

    Le tableau 47 ci-dessous présente le modèle de données pour l’élément AuthenticationType.

    # Tableau 47
    Nom Cardinalité Type Description
    Authentication 1 Enum de String(1..32) Cet élément contient le type d’authentification. Voir l’énumération AuthenticationType pour les valeurs possibles.

    Tableau 47 – Élément AuthenticationType


    # Élément AuthenticationValue

    Le tableau 48 ci-dessous présente le modèle de données pour l’élément AuthenticationValue.

    # Tableau 48
    Nom Cardinalité Type Description
    AuthenticationValue 1 Dépend de AuthenticationType.

    Si OTP : le type est Integer(1..6). Par exemple : 123456

    OtpValue
    Si QRCODE : le type est String(1..64)
    Cet élément contient la valeur d’authentification. Le format dépend du type d’authentification utilisé dans le type complexe AuthenticationInfo.

    Tableau 48 – Élément AuthenticationValue


    # Élément AuthorizationResponse

    Le tableau 49 ci-dessous présente le modèle de données pour l’élément AuthorizationResponse.

    # Tableau 49
    Nom Cardinalité Type Description
    AuthorizationResponse 1 Enum de String(1..32) Cet élément contient la réponse d’autorisation. Voir l’énumération AuthorizationResponse pour les valeurs possibles.

    Tableau 49 – Élément AuthorizationResponse


    # Élément BalanceOfPayments

    Le tableau 50 ci-dessous présente le modèle de données pour l’élément BalanceOfPayment.

    # Tableau 50
    Nom Cardinalité Type Description
    BalanceOfPayments 1 BopCode Les valeurs et significations possibles sont définies dans https://www.imf.org/external/np/sta/bopcode/ (opens new window)

    Tableau 50 – Élément BalanceOfPayments


    # Élément BulkTransferState

    Le tableau 51 ci-dessous présente le modèle de données pour l’élément BulkTransferState.

    # Tableau 51
    Nom Cardinalité Type Description
    BulkTransferState 1 Enum de String(1..32) Voir l’énumération BulkTransferState pour connaître les valeurs autorisées.

    Tableau 51 – Élément BulkTransferState


    # Élément Code

    Le tableau 52 ci-dessous présente le modèle de données pour l’élément Code.

    # Tableau 52
    Nom Cardinalité Type Description
    Code 1 TokenCode Tout code/jeton retourné par l’IFP bénéficiaire.

    Tableau 52 – Élément Code


    # Élément CorrelationId

    Le tableau 53 ci-dessous présente le modèle de données pour l’élément CorrelationId.

    # Tableau 53
    Nom Cardinalité Type Description
    CorrelationId 1 UUID Identifiant permettant de corréler tous les messages d’une même séquence.

    Tableau 53 – Élément CorrelationId


    # Élément Currency

    Le tableau 54 ci-dessous présente le modèle de données pour l’élément Currency.

    # Tableau 54
    Nom Cardinalité Type Description
    Currency 1 Enum de String(3) Voir l’énumération Currency pour plus d’informations sur les valeurs autorisées.

    Tableau 54 – Élément Currency


    # Élément DateOfBirth

    Le tableau 55 ci-dessous présente le modèle de données pour l’élément DateOfBirth.

    # Tableau 55
    Nom Cardinalité Type Description
    DateOfBirth 1 Exemples

    Deux exemples du type DateTime figurent ci-dessous :

    2016-05-24T08:38:08.699-04:00

    2016-05-24T08:38:08.699Z (où Z indique le fuseau Zulu, équivalent à UTC).

    Date

    Date de naissance du participant.

    Tableau 55 – Élément DateOfBirth


    # Élément ErrorCode

    Le tableau 56 ci-dessous présente le modèle de données pour l’élément ErrorCode.

    # Tableau 56
    Nom Cardinalité Type Description
    ErrorCode 1 ErrorCode Code d’erreur à quatre chiffres, voir la section sur les Codes d’erreur pour plus d’informations.

    Tableau 56 – Élément ErrorCode


    # Élément ErrorDescription

    Le tableau 57 ci-dessous présente le modèle de données pour l’élément ErrorDescription.

    # Tableau 57
    Nom Cardinalité Type Description
    ErrorDescription 1 String(1..128) Description de l’erreur.

    Tableau 57 – Élément ErrorDescription


    # Élément ExtensionKey

    Le tableau 58 ci-dessous présente le modèle de données pour l’élément ExtensionKey.

    # Tableau 58
    Nom Cardinalité Type Description
    ExtensionKey 1 String(1..32) La clé de l’extension.

    Tableau 58 – Élément ExtensionKey


    # Élément ExtensionValue

    Le tableau 59 ci-dessous présente le modèle de données pour l’élément ExtensionValue.

    # Tableau 59
    Nom Cardinalité Type Description
    ExtensionValue 1 String(1..128) La valeur de l’extension.

    Tableau 59 – Élément ExtensionValue


    # Élément FirstName

    Le tableau 60 ci-dessous présente le modèle de données pour l’élément FirstName.

    # Tableau 60
    Nom Cardinalité Type Description
    FirstName 1 Name Prénom du participant

    Tableau 60 – Élément FirstName


    # Élément FspId

    Le tableau 61 ci-dessous présente le modèle de données pour l’élément FspId.

    # Tableau 61
    Nom Cardinalité Type Description
    FspId 1 String(1..32) Identifiant de l’IFP (Institution Financière de Paiement).

    Tableau 61 – Élément FspId


    # Élément IlpCondition

    Le tableau 62 ci-dessous présente le modèle de données pour l’élément IlpCondition.

    # Tableau 62
    Nom Cardinalité Type Description
    IlpCondition 1 BinaryString32 Condition qui doit être jointe au transfert par le Payeur.

    Tableau 62 – Élément IlpCondition


    # Élément IlpFulfilment

    Le tableau 63 ci-dessous présente le modèle de données pour l’élément IlpFulfilment.

    # Tableau 63
    Nom Cardinalité Type Description
    IlpFulfilment 1 BinaryString32 Exécution qui doit être jointe au transfert par le Bénéficiaire.

    Tableau 63 – Élément IlpFulfilment


    # Élément IlpPacket

    Le tableau 64 ci-dessous présente le modèle de données pour l’élément IlpPacket.

    # Tableau 64
    Nom Cardinalité Type Description
    IlpPacket 1 Exemple

    Un exemple de type UUID :

    a8323bc6-c228-4df2-ae82-e5a997baf898

    BinaryString(1..32768)

    Informations pour le destinataire (informations de niveau transport).

    Tableau 64 – Élément IlpPacket


    # Élément LastName

    Le tableau 65 ci-dessous présente le modèle de données pour l’élément LastName.

    # Tableau 65
    Nom Cardinalité Type Description
    LastName 1 Name Nom de famille du participant (définition ISO 20022).

    Tableau 65 – Élément LastName


    # Élément MerchantClassificationCode

    Le tableau 66 ci-dessous présente le modèle de données pour l’élément MerchantClassificationCode.

    # Tableau 66
    Nom Cardinalité Type Description
    MerchantClassificationCode 1 MerchantClassificationCode Un ensemble limité de numéros prédéfinis. Cette liste identifie des types de marchands populaires comme frais d’école, bars et restaurants, épiceries, etc.

    Tableau 66 – Élément MerchantClassificationCode


    # Élément MiddleName

    Le tableau 67 ci-dessous présente le modèle de données pour l’élément MiddleName.

    # Tableau 67
    Nom Cardinalité Type Description
    MiddleName 1 Name Deuxième prénom du participant (définition ISO 20022).

    Tableau 67 – Élément MiddleName


    # Élément Note

    Le tableau 68 ci-dessous présente le modèle de données pour l’élément Note.

    # Tableau 68
    Nom Cardinalité Type Description
    Note 1 String(1..128) Mémo ou libellé affecté à la transaction.

    Tableau 68 – Élément Note


    # Élément PartyIdentifier

    Le tableau 69 ci-dessous présente le modèle de données pour l’élément PartyIdentifier.

    # Tableau 69
    Nom Cardinalité Type Description
    PartyIdentifier 1 String(1..128) Identifiant du participant.

    Tableau 69 – Élément PartyIdentifier


    # Élément PartyIdType

    Le tableau 70 ci-dessous présente le modèle de données pour l’élément PartyIdType.

    # Tableau 70
    Nom Cardinalité Type Description
    PartyIdType 1 Enum de String(1..32) Voir l’énumération PartyIdType pour plus d’informations sur les valeurs autorisées.

    Tableau 70 – Élément PartyIdType


    # Élément PartyName

    Le tableau 71 ci-dessous présente le modèle de données pour l’élément PartyName.

    # Tableau 71
    Nom Cardinalité Type Description
    PartyName 1 Name Nom du participant. Peut être un vrai nom ou un surnom.

    Tableau 71 – Élément PartyName


    # Élément PartySubIdOrType

    Le tableau 72 ci-dessous présente le modèle de données pour l’élément PartySubIdOrType.

    # Tableau 72
    Nom Cardinalité Type Description
    PartySubIdOrType 1 String(1..128) Un sous-identifiant d’un PartyIdentifier ou un sous-type du PartyIdType, souvent un PersonalIdentifierType.

    Tableau 72 – Élément PartySubIdOrType


    # Élément RefundReason

    Le tableau 73 ci-dessous présente le modèle de données pour l’élément RefundReason.

    # Tableau 73
    Nom Cardinalité Type Description
    RefundReason 1 String(1..128) Raison du remboursement.

    Tableau 73 – Élément RefundReason


    # Élément TransactionInitiator

    Le tableau 74 ci-dessous présente le modèle de données pour l’élément TransactionInitiator.

    # Tableau 74
    Nom Cardinalité Type Description
    TransactionInitiator 1 Enum de String(1..32) Voir l’énumération TransactionInitiator pour plus d’informations sur les valeurs autorisées.

    Tableau 74 – Élément TransactionInitiator


    # Élément TransactionInitiatorType

    Le tableau 75 ci-dessous présente le modèle de données pour l’élément TransactionInitiatorType.

    # Tableau 75
    Nom Cardinalité Type Description
    TransactionInitiatorType 1 Enum de String(1..32) Voir l’énumération TransactionInitiatorType pour plus d’informations sur les valeurs autorisées.

    Tableau 75 – Élément TransactionInitiatorType


    # Élément TransactionRequestState

    Le tableau 76 ci-dessous présente le modèle de données pour l’élément TransactionRequestState.

    # Tableau 76
    Nom Cardinalité Type Description
    TransactionRequestState 1 Enum de String(1..32) Voir l’énumération TransactionRequestState pour plus d’informations sur les valeurs autorisées.

    Tableau 76 – Élément TransactionRequestState


    # Élément TransactionScenario

    Le tableau 77 ci-dessous présente le modèle de données pour l’élément TransactionScenario.

    # Tableau 77
    Nom Cardinalité Type Description
    TransactionScenario 1 Enum de String(1..32) Voir l’énumération TransactionScenario pour plus d’informations sur les valeurs autorisées.

    Tableau 77 – Élément TransactionScenario


    # Élément TransactionState

    Le tableau 78 ci-dessous présente le modèle de données pour l’élément TransactionState.

    # Tableau 78
    Nom Cardinalité Type Description
    TransactionState 1 Enum de String(1..32) Voir l’énumération TransactionState pour plus d’informations sur les valeurs autorisées.

    Tableau 78 – Élément TransactionState


    # Élément TransactionSubScenario

    Le tableau 79 ci-dessous présente le modèle de données pour l’élément TransactionSubScenario.

    # Tableau 79
    Nom Cardinalité Type Description
    TransactionSubScenario 1 UndefinedEnum Sous-scénario possible, défini localement au sein du système.

    Tableau 79 – Élément TransactionSubScenario


    # Élément TransferState

    Le tableau 80 ci-dessous présente le modèle de données pour l’élément TransferState.

    # Tableau 80
    Nom Cardinalité Type Description
    TransactionState 1 Enum de String(1..32) Voir l’énumération TransferState pour plus d’informations sur les valeurs autorisées.

    Tableau 80 – Élément TransferState


    # Types Complexes

    Cette section décrit les types complexes utilisés par l’API.

    # AuthenticationInfo

    Le tableau 81 présente le modèle de données pour le type complexe AuthenticationInfo.

    # Tableau 81
    Nom Cardinalité Format Description
    authentication 1 AuthenticationType Type d’authentification.
    authenticationValue 1 AuthenticationValue Valeur d’authentification.

    Tableau 81 -- Type complexe AuthenticationInfo


    # ErrorInformation

    Le tableau 82 présente le modèle de données pour le type complexe ErrorInformation.

    # Tableau 82
    Nom Cardinalité Format Description
    errorCode 1 Errorcode Numéro d’erreur spécifique.
    errorDescription 1 ErrorDescription Chaîne décrivant l’erreur.
    extensionList 1 ExtensionList Liste facultative d’extensions, spécifique au déploiement.

    Tableau 82 -- Type complexe ErrorInformation


    # Extension

    Le tableau 83 présente le modèle de données pour le type complexe Extension.

    # Tableau 83
    Nom Cardinalité Format Description
    key 1 ExtensionKey Clé d’extension.
    value 1 ExtensionValue Valeur de l’extension.

    Tableau 83 -- Type complexe Extension


    # ExtensionList

    Le tableau 84 présente le modèle de données pour le type complexe ExtensionList.

    # Tableau 84
    Nom Cardinalité Format Description
    extension 1..16 Extension Nombre d’éléments Extension.

    Tableau 84 -- Type complexe ExtensionList


    # IndividualQuote

    Le tableau 85 présente le modèle de données pour le type complexe IndividualQuote.

    # Tableau 85
    Nom Cardinalité Format Description
    quoteId 1 CorrelationId Identifie le message du devis.
    transactionId 1 CorrelationId Identifie le message de transaction.
    payee 1 Party Informations concernant le bénéficiaire dans la transaction financière proposée.
    amountType 1 AmountType SEND pour le montant envoyé, RECEIVE pour le montant à recevoir.
    amount 1 Money Selon amountType :
    Si SEND : montant que le payeur souhaite envoyer, c’est-à-dire le montant à débiter y compris les frais. Le montant est mis à jour par chaque entité participante.
    Si RECEIVE : montant à recevoir par le bénéficiaire (hors frais). Le montant n’est pas mis à jour par les entités participantes.
    fees 0..1 Money Frais de la transaction.
    • Doit être vide si les frais ne doivent pas être divulgués.
    • Doit être renseigné si les frais sont à divulguer.
    transactionType 1 TransactionType Type de transaction pour laquelle le devis est demandé.
    note 0..1 Note Mémo joint à la transaction.
    extensionList 0..1 ExtensionList Extension facultative, spécifique au déploiement.

    Tableau 85 -- Type complexe IndividualQuote


    # IndividualQuoteResult

    Le tableau 86 présente le modèle de données pour le type complexe IndividualQuoteResult.

    # Tableau 86
    Nom Cardinalité Format Description
    quoteId 1 CorrelationId Identifie le message du devis.
    payee 0..1 Party Informations sur le bénéficiaire dans la transaction financière proposée.
    transferAmount 0..1 Money Montant que le FSP du Payeur doit transférer au FSP du Bénéficiaire.
    payeeReceiveAmount 0..1 Money Montant que le Bénéficiaire devra recevoir au final. Facultatif si le FSP du Bénéficiaire ne souhaite pas divulguer de frais optionnels.
    payeeFspFee 0..1 Money Part des frais de transaction du FSP du Bénéficiaire.
    payeeFspCommission 0..1 Money Commission de transaction du FSP du Bénéficiaire.
    ilpPacket 0..1 IlpPacket Paquet ILP à joindre au transfert par le Payeur.
    condition 0..1 IlpCondition Condition à joindre au transfert par le Payeur.
    errorInformation 0..1 ErrorInformation Code d’erreur, description de la catégorie.
    Remarque : Les paramètres payee, transferAmount, payeeReceiveAmount, payeeFspFee, payeeFspCommission, ilpPacket et condition ne doivent pas être définis si errorInformation est renseigné.
    extensionList 0..1 ExtensionList Extension facultative, spécifique au déploiement.

    Tableau 86 -- Type complexe IndividualQuoteResult


    # IndividualTransfer

    Le tableau 87 présente le modèle de données pour le type complexe IndividualTransfer.

    # Tableau 87
    Nom Cardinalité Format Description
    transferId 1 CorrelationId Identifie les messages liés à la même séquence /transfers.
    transferAmount 1 Money Montant de la transaction à envoyer.
    ilpPacket 1 IlpPacket Paquet ILP contenant le montant destiné au bénéficiaire, l’adresse ILP du bénéficiaire et toutes données end-to-end.
    condition 1 IlpCondition Condition qui doit être remplie pour engager le transfert.
    extensionList 0..1 ExtensionList Extension facultative, spécifique au déploiement.

    Tableau 87 -- Type complexe IndividualTransfer


    # IndividualTransferResult

    Le tableau 88 présente le modèle de données pour le type complexe IndividualTransferResult.

    # Tableau 88
    Nom Cardinalité Format Description
    transferId 1 CorrelationId Identifie les messages liés à la même séquence /transfers.
    fulfilment 0..1 IlpFulfilment Fulfilment (preuve) de la condition définie avec la transaction.
    Remarque : Soit fulfilment, soit errorInformation doit être renseigné, jamais les deux.
    errorInformation 0..1 ErrorInformation Si le transfert est REJECTED, les informations d’erreur peuvent être fournies.
    Remarque : Soit fulfilment, soit errorInformation doit être renseigné, jamais les deux.
    extensionList 0..1 ExtensionList Extension facultative, spécifique au déploiement.

    Tableau 88 -- Type complexe IndividualTransferResult


    # GeoCode

    Le tableau 89 présente le modèle de données pour le type complexe GeoCode.

    # Tableau 89
    Nom Cardinalité Format Description
    latitude 1 Latitude Latitude de la Partie.
    longitude 1 Longitude Longitude de la Partie.

    Tableau 89 -- Type complexe GeoCode


    # Money

    Le tableau 90 présente le modèle de données pour le type complexe Money.

    # Tableau 90
    Nom Cardinalité Format Description
    currency 1 Currency Devise du montant.
    amount 1 Amount Montant d’argent.

    Tableau 90 -- Type complexe Money


    # Party

    Le tableau 91 présente le modèle de données pour le type complexe Party.

    # Tableau 91
    Nom Cardinalité Format Description
    partyIdInfo 1 PartyIdInfo Type d’id de la Partie, id, sous-id ou type, et FSP Id.
    merchantClassificationCode 0..1 MerchantClassificationCode Utilisé pour la partie Bénéficiaire marchande.
    name 0..1 PartyName Nom affiché de la Partie, peut être un nom réel ou un pseudo.
    personalInfo 0..1 PartyPersonalInfo Informations personnelles pour vérifier l’identité de la Partie (nom, prénom, date de naissance, etc.).

    Tableau 91 -- Type complexe Party


    # PartyComplexName

    Le tableau 92 présente le modèle de données pour le type complexe PartyComplexName.

    # Tableau 92
    Nom Cardinalité Format Description
    firstName 0..1 FirstName Prénom de la Partie.
    middleName 0..1 MiddleName Deuxième prénom de la Partie.
    lastName 0..1 LastName Nom de famille de la Partie.

    Tableau 92 -- Type complexe PartyComplexName


    # PartyIdInfo

    Le tableau 93 présente le modèle de données pour le type complexe PartyIdInfo.

    # Tableau 93
    Nom Cardinalité Format Description
    partyIdType 1 PartyIdType Type d’identifiant.
    partyIdentifier 1 PartyIdentifier Identifiant de la Partie.
    partySubIdOrType 0..1 PartySubIdOrType Sous-identifiant ou sous-type pour la Partie.
    fspId 0..1 FspId Identifiant FSP (si connu).
    extensionList 0..1 ExtensionList Extension facultative, spécifique au déploiement.

    Tableau 93 -- Type complexe PartyIdInfo


    # PartyPersonalInfo

    Le tableau 94 présente le modèle de données pour le type complexe PartyPersonalInfo.

    # Tableau 94
    Nom Cardinalité Format Description
    complexName 0..1 PartyComplexName Prénom, deuxième prénom et nom de famille de la Partie.
    dateOfBirth 0..1 DateOfBirth Date de naissance de la Partie.

    Tableau 94 -- Type complexe PartyPersonalInfo


    # PartyResult

    Le tableau 95 présente le modèle de données pour le type complexe PartyResult.

    # Tableau 95
    Nom Cardinalité Format Description
    partyId 1 PartyIdInfo Type d’id de la Partie, id, sous-id ou type, et FSP Id.
    errorInformation 0..1 ErrorInformation Si la Partie n’a pas pu être ajoutée, une information d’erreur doit être fournie. Sinon, ce paramètre doit être vide pour indiquer le succès.

    Tableau 95 -- Type complexe PartyResult


    # Refund

    Le tableau 96 présente le modèle de données pour le type complexe Refund.

    # Tableau 96
    Nom Cardinalité Format Description
    originalTransactionId 1 CorrelationId Référence à l’ID de la transaction d’origine à rembourser.
    refundReason 0..1 RefundReason Texte libre précisant la raison du remboursement.

    Tableau 96 -- Type complexe Refund


    # Transaction

    Le tableau 97 présente le modèle de données pour le type complexe Transaction. Le type Transaction sert à véhiculer des données de bout en bout entre le FSP Payeur et le FSP Bénéficiaire dans le paquet ILP, voir IlpPacket. Les champs transactionId et quoteId sont décidés par le FSP Payeur lors du POST /quotes, voir Tableau 23.

    # Tableau 97
    Nom Cardinalité Format Description
    transactionId 1 CorrelationId ID de la transaction, défini par le FSP Payeur lors de la création du devis.
    quoteId 1 CorrelationId ID du devis, défini par le FSP Payeur lors de la création du devis.
    payee 1 Party Informations sur le bénéficiaire dans la transaction proposée.
    payer 1 Party Informations sur le payeur dans la transaction proposée.
    amount 1 Money Montant de la transaction à envoyer.
    transactionType 1 TransactionType Type de la transaction.
    note 0..1 Note Mémo associé à la transaction, destiné au bénéficiaire.
    extensionList 0..1 ExtensionList Extension facultative, spécifique au déploiement.

    Tableau 97 -- Type complexe Transaction


    # TransactionType

    Le tableau 98 présente le modèle de données pour le type complexe TransactionType.

    # Tableau 98
    Nom Cardinalité Format Description
    scenario 1 TransactionScenario Dépôt, retrait, remboursement, ...
    subScenario 0..1 TransactionSubScenario Sous-scénario éventuel, défini localement.
    initiator 1 TransactionInitiator Initiateur de la transaction : Payeur ou Bénéficiaire.
    initiatorType 1 TransactionInitiatorType Consommateur, agent, entreprise, ...
    refundInfo 0..1 Refund Informations supplémentaires particulières pour les remboursements. À renseigner uniquement si le scénario est REFUND.
    balanceOfPayments 0..1 BalanceOfPayments Code Balance des Paiements.

    Tableau 98 -- Type complexe TransactionType


    # Énumérations

    Cette section présente les énumérations utilisées par l’API.

    # AmountType enum

    Le tableau 99 présente les valeurs autorisées pour l’énumération AmountType.

    # Tableau 99
    Nom Description
    SEND Montant que le payeur souhaite envoyer ; c’est-à-dire le montant à débiter, frais inclus.
    RECEIVE Montant que le payeur souhaite que le bénéficiaire reçoive, c’est-à-dire montant crédité hors frais.

    Tableau 99 -- Énumération AmountType


    # AuthenticationType enum

    Le tableau 100 présente les valeurs autorisées pour l’énumération AuthenticationType.

    # Tableau 100
    Nom Description
    OTP Mot de passe à usage unique généré par le FSP du payeur.
    QRCODE Code QR utilisé comme mot de passe à usage unique.

    Tableau 100 -- Énumération AuthenticationType


    # AuthorizationResponse enum

    Le tableau 101 présente les valeurs autorisées pour l’énumération AuthorizationResponse.

    # Tableau 101
    Nom Description
    ENTERED Le consommateur a saisi la valeur d’authentification.
    REJECTED Le consommateur a rejeté la transaction.
    RESEND Le consommateur demande de renvoyer la valeur d’authentification.

    Tableau 101 -- Énumération AuthorizationResponse


    # BulkTransferState enum

    Le tableau 102 présente les valeurs autorisées pour l’énumération BulkTransferState.

    # Tableau 102
    Nom Description
    RECEIVED Le FSP bénéficiaire a reçu le transfert en lot du FSP payeur.
    PENDING Le FSP bénéficiaire a validé le transfert en lot.
    ACCEPTED Le FSP bénéficiaire a accepté le transfert en lot pour traitement.
    PROCESSING Le FSP bénéficiaire a commencé à transférer les fonds aux bénéficiaires.
    COMPLETED Le FSP bénéficiaire a terminé le transfert des fonds aux bénéficiaires.
    REJECTED Le FSP bénéficiaire a rejeté le traitement du transfert en lot.

    Tableau 102 -- Énumération BulkTransferState


    # Code devise (CurrencyCode) enum

    Les codes de devise définis par la norme ISO 421736 sous forme de codes alphabétiques à trois lettres sont utilisés comme représentation standard des devises. Les codes ISO 4217 ne sont pas listés ici, les implémenteurs sont invités à se référer directement à la norme ISO 4217.


    # PartyIdType enum

    Le tableau 103 présente les valeurs autorisées pour l’énumération PartyIdType.

    # Tableau 103
    Nom Description
    MSISDN Un MSISDN (numéro international de téléphone mobile) est utilisé pour référencer une Partie. Il doit être au format E.164 ITU-T, éventuellement précédé d’un "+".
    EMAIL Une adresse email est utilisée pour référencer une Partie. Format selon RFC 3696.
    PERSONAL_ID Un identifiant personnel (numéro de passeport, d'acte de naissance, d’enregistrement national, etc.) Pour le type voir PartySubIdOrType.
    BUSINESS Une entreprise spécifique (ex : société, organisation) est utilisée pour référencer un participant. Format libre. Pour cibler un identifiant spécifique (utilisateur, facture, etc.) utiliser PartySubIdOrType.
    DEVICE Un identifiant de dispositif spécifique (ex : TPE ou DAB) est utilisé pour une Partie. Pour une référence sous une entreprise, utiliser PartySubIdOrType.
    ACCOUNT_ID Un numéro de compte bancaire ou identifiant FSP doit être utilisé pour référencer un participant. Format libre variant selon le pays et le FSP.
    IBAN Un numéro IBAN est utilisé pour référencer un participant. Jusqu’à 34 caractères alphanumériques sans espaces.
    ALIAS Un alias est utilisé pour référencer un participant (ex : username/pseudo). Un sous-compte peut aussi être ciblé via PartySubIdOrType.

    Tableau 103 -- Énumération PartyIdType


    # PersonalIdentifierType enum

    Le tableau 104 présente les valeurs autorisées pour l’énumération PersonalIdentifierType.

    # Tableau 104
    Nom Description
    PASSPORT Numéro de passeport.
    NATIONAL_REGISTRATION Numéro d’enregistrement national.
    DRIVING_LICENSE Permis de conduire.
    ALIEN_REGISTRATION Numéro d’enregistrement d’étranger.
    NATIONAL_ID_CARD Numéro de carte d’identité nationale.
    EMPLOYER_ID Numéro d’identification fiscale (employeur).
    TAX_ID_NUMBER Numéro d’identification fiscale.
    SENIOR_CITIZENS_CARD Numéro de carte senior.
    MARRIAGE_CERTIFICATE Numéro d’acte de mariage.
    HEALTH_CARD Numéro de carte de santé.
    VOTERS_ID Numéro de carte d’électeur.
    UNITED_NATIONS Numéro ONU.
    OTHER_ID Tout autre type d’identifiant.

    Tableau 104 -- Énumération PersonalIdentifierType


    # TransactionInitiator

    Le tableau 105 décrit les valeurs autorisées pour l’énumération TransactionInitiator.

    # Tableau 105
    Nom Description
    PAYER Le payeur initie la transaction. Le compte source lui appartient ou lui est associé d’une manière ou d’une autre.
    PAYEE Le bénéficiaire initie la transaction en envoyant une demande de transaction. Le payeur doit approuver (automatiquement ou manuellement).

    Tableau 105 -- Énumération TransactionInitiator


    # TransactionInitiatorType

    Le tableau 106 présente les valeurs autorisées pour l’énumération TransactionInitiatorType.

    # Tableau 106
    Nom Description
    CONSUMER Le consommateur est l’initiateur de la transaction.
    AGENT L’agent est l’initiateur de la transaction.
    BUSINESS L’entreprise est l’initiatrice de la transaction.
    DEVICE L’équipement est l’initiateur de la transaction.

    Tableau 106 -- Énumération TransactionInitiatorType


    # TransactionRequestState

    Le tableau 107 présente les valeurs autorisées pour l’énumération TransactionRequestState.

    # Tableau 107
    Nom Description
    RECEIVED Le FSP du payeur a reçu la transaction du FSP du bénéficiaire.
    PENDING Le FSP du payeur a transmis la demande de transaction au payeur.
    ACCEPTED Le payeur a approuvé la transaction.
    REJECTED Le payeur a rejeté la transaction.

    Tableau 107 -- Énumération TransactionRequestState


    # TransactionScenario

    Le tableau 108 présente les valeurs autorisées pour l’énumération TransactionScenario.

    # Tableau 108
    Nom Description
    DEPOSIT Pour effectuer un dépôt (cash-in) : transfert de fonds électroniques vers le consommateur, remise d’espèces au commerçant.
    WITHDRAWAL Pour effectuer un retrait (cash-out) : transfert de fonds électroniques au commerçant, remise d’espèces au client.
    TRANSFER Pour un transfert de personne à personne (P2P).
    PAYMENT Pour effectuer le paiement d’un consommateur à un commerçant ou une organisation, ou un paiement B2B. Peut concerner un achat en ligne, un paiement sur place, une facture, un don, etc.
    REFUND Pour effectuer un remboursement.

    Tableau 108 -- Énumération TransactionScenario


    # TransactionState

    Le tableau 109 présente les valeurs autorisées pour l’énumération TransactionState.

    # Tableau 109
    Nom Description
    RECEIVED Le FSP du bénéficiaire a reçu la transaction du FSP du payeur.
    PENDING Le FSP du bénéficiaire a validé la transaction.
    COMPLETED Le FSP du bénéficiaire a exécuté la transaction avec succès.
    REJECTED Le FSP du bénéficiaire a échoué à réaliser la transaction.

    Tableau 109 -- Énumération TransactionState


    # TransferState

    Le tableau 110 présente les valeurs autorisées pour l’énumération TransferState.

    # Tableau 110
    Nom Description
    RECEIVED Le ledger suivant a reçu le transfert.
    RESERVED Le ledger suivant a réservé le transfert.
    COMMITTED Le ledger suivant a validé le transfert.
    ABORTED Le ledger suivant a annulé le transfert à cause d’un rejet ou d’un échec.

    Tableau 110 -- Énumération TransferState


    # Codes d’erreur

    # Figure 63

    Chaque code d’erreur de l’API est un nombre à quatre chiffres, par exemple 1234, où le premier chiffre (1 ici) indique la catégorie d’erreur principale, le deuxième (2) la sous-catégorie, et les deux derniers (34) l’erreur spécifique. Figure 63 montre la structure d’un code d’erreur. Les sections suivantes détaillent les codes d’erreur définis pour chaque catégorie.

    Figure 63

    Figure 63 -- Structure des codes d’erreur

    Chaque combinaison de catégories principale et secondaire possède une erreur générique (x0xx), utilisable s’il n’existe pas d’erreur plus spécifique, ou si le serveur ne souhaite pas communiquer plus d’information.

    Toutes les erreurs spécifiques inférieures à xx40 (c’est-à-dire de xx00 à xx39) sont réservées à un usage ultérieur de l’API. Celles à partir de xx40 peuvent servir pour des besoins propres à un schéma. Si un client reçoit une erreur inconnue propre à un schéma, elle devra être traitée comme une erreur générique de la catégorie (xx00).

    # Erreurs de communication -- 1_xxx_

    Toutes les erreurs de communication ou réseau n’étant pas couvertes par un code HTTP doivent utiliser le code d’erreur principal 1 (codes 1xxx). Comme tous les services de l’API sont asynchrones, ces erreurs sont généralement émises par le Switch au client FSP si le FSP pair est injoignable ou si aucun callback n’est reçu dans le délai convenu.

    Sous-catégories pour les erreurs de communication :

    • Erreur de communication générique -- 10xx

    Voir Tableau 111 pour la liste des erreurs de ce type.

    # Tableau 111
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    1000 Erreur de communication Erreur de communication générique. X X X X X X X X X
    1001 Erreur de communication destination La destination de la requête n’a pas pu être jointe (échec de réponse intermédiaire). X X X X X X X X X

    Tableau 111 -- Erreurs de communication -- 1_xxx_

    # Erreurs serveur -- 2_xxx_

    Toutes les erreurs survenues côté serveur où ce dernier n’a pas pu satisfaire une requête apparemment valide du client utilisent la catégorie 2 (codes 2xxx). Ces erreurs signifient que le serveur est conscient d’avoir rencontré une erreur ou d’être incapable de traiter la demande.

    Sous-catégories pour les erreurs serveur :

    • Erreur serveur générique -- 20xx

    Voir Tableau 112 pour les erreurs serveur définies.

    # Tableau 112
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    2000 Erreur serveur générique Erreur serveur générique pour ne pas divulguer d’informations privées. X X X X X X X X X
    2001 Erreur serveur interne Exception inattendue générique (bug ou cas non géré). X X X X X X X X X
    2002 Non implémenté Service demandé non supporté par le serveur. X X X X X X X X X
    2003 Service indisponible Service demandé indisponible (maintenance, panne temporaire, etc.). X X X X X X X X X
    2004 Timeout serveur Le serveur n’a pas reçu de callback dans le délai imparti (timeout). X X X X X X X X X
    2005 Serveur surchargé Le serveur refuse les requêtes pour surcharge. Réessayez plus tard. X X X X X X X X X

    Tableau 112 -- Erreurs serveur -- 2_xxx_

    # Erreurs côté Client -- 3_xxx_

    Toutes les erreurs possibles se produisant sur le serveur, où ce dernier signale que le client a envoyé un ou plusieurs paramètres erronés, doivent utiliser le code d’erreur principal 3 (codes d’erreur 3xxx). Ces codes d’erreur indiquent que le serveur n’a pas pu effectuer le service selon la demande du client. Le serveur doit fournir une explication sur la raison pour laquelle le service n’a pas pu être exécuté.

    Catégories de bas niveau définies sous les erreurs client :

    • Erreur Générique du Client -- 30xx

      • Voir Tableau 113 pour la liste des erreurs génériques côté client définies dans l’API.
    • Erreur de Validation -- 31xx

      • Voir Tableau 114 pour la liste des erreurs de validation dans l’API.
    • Erreur d’Identifiant -- 32xx

      • Voir Tableau 115 pour la liste des erreurs d’identification dans l’API.
    • Erreur d’Expiration -- 33xx

      • Voir Tableau 116 pour la liste des erreurs d’expiration dans l’API.
    # Tableau 113
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    3000 Erreur générique côté client Erreur générique côté client, utilisée pour ne pas divulguer d’informations sensibles. X X X X X X X X X
    3001 Version demandée non acceptable Le client a demandé une version du protocole qui n’est pas supportée par le serveur. X X X X X X X X X
    3002 URI inconnue L’URI fournie est inconnue du serveur. X X X X X X X X X
    3003 Erreur d’ajout d’information de Partie Une erreur s’est produite lors de l’ajout ou de la mise à jour des informations concernant une Partie. X X X X X X X X X

    Tableau 113 -- Erreurs génériques côté client -- 30_xx_

    # Tableau 114
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    3100 Erreur de validation générique Erreur de validation générique utilisée pour ne pas divulguer d’informations sensibles. X X X X X X X X X
    3101 Syntaxe mal formée Le format du paramètre n’est pas valide. Par exemple, montant fixé à 5.ABC. Le champ de description d’erreur devrait préciser quel élément est erroné. X X X X X X X X X
    3102 Élément obligatoire manquant Élément obligatoire absent dans le modèle de données. X X X X X X X X X
    3103 Trop d’éléments Le nombre d’éléments dans un tableau dépasse le nombre maximum autorisé. X X X X X X X X X
    3104 Charge utile trop volumineuse La taille de la charge utile dépasse la taille maximale autorisée. X X X X X X X X X
    3105 Signature invalide Certains paramètres du message ont été modifiés, rendant la signature invalide. Cela peut indiquer que le message a été modifié de manière malveillante. X X X X X X X X X
    3106 Requête modifiée Une précédente requête avec le même ID a déjà été traitée, mais avec des paramètres différents. X X X X X X X
    3107 Paramètre d’extension obligatoire manquant Un paramètre d’extension obligatoire pour le schéma est absent. X X X X X X X

    Tableau 114 -- Erreurs de validation -- 31_xx_

    # Tableau 115
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    3200 Identifiant générique non trouvé Erreur générique d’identifiant fournie par le client. X X X X X X X X X
    3201 Erreur FSP Destinataire Le FSP destinataire n’existe pas ou est introuvable. X X X X X X X X X
    3202 Identifiant FSP Payeur introuvable Identifiant FSP Payeur fourni introuvable. X X
    3203 Identifiant FSP Bénéficiaire introuvable Identifiant FSP Bénéficiaire fourni introuvable. X X
    3204 Partie non trouvée Partie avec l’identifiant, le type d’identifiant et le sous-id ou type optionnel fournis non trouvée. X X X X
    3205 Identifiant de devis introuvable Devis fourni introuvable sur le serveur. X X
    3206 ID de demande de transaction introuvable Demande de Transaction fournie introuvable sur le serveur. X X
    3207 ID de transaction introuvable ID de transaction fourni introuvable sur le serveur. X
    3208 ID de transfert introuvable ID de transfert fourni introuvable sur le serveur. X
    3209 ID de devis groupé introuvable ID de devis groupé fourni introuvable sur le serveur. X X
    3210 ID de transfert groupé introuvable ID de transfert groupé fourni introuvable sur le serveur. X

    Tableau 115 -- Erreurs d’identifiant -- 32_xx_

    # Tableau 116
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    3300 Erreur générique d’expiration Erreur d’objet expiré générique, à utiliser pour ne pas divulguer d’informations sensibles. X X X X X X X X X
    3301 Demande de transaction expirée Le client a demandé d’utiliser une demande de transaction qui a déjà expiré. X
    3302 Devis expiré Le client a demandé d’utiliser un devis qui a déjà expiré. X X X
    3303 Transfert expiré Le client a demandé d’utiliser un transfert qui a déjà expiré. X X X X X X X X X

    Tableau 116 -- Erreurs d’expiration -- 33_xx_

    # Erreurs côté Payeur -- 4_xxx_

    Toutes les erreurs se produisant sur le serveur dont la cause est liée au Payeur ou à son FSP doivent utiliser le code d’erreur principal 4 (codes 4xxx). Ces codes d’erreur indiquent qu’il n’y a pas eu d’erreur sur le serveur ni dans la requête du client, mais que la requête a échoué pour une raison liée au Payeur ou à son FSP. Le serveur doit fournir une explication sur la raison pour laquelle le service n’a pas pu être exécuté.

    Catégories de bas niveau définies pour les erreurs côté Payeur :

    • Erreur Générique Payeur -- 40xx
    • Erreur de Rejet Payeur -- 41xx
    • Erreur de Limite Payeur -- 42xx
    • Erreur de Permission Payeur -- 43xx
    • Erreur Payeur Bloqué -- 44xx

    Voir Tableau 117 pour les erreurs Payeur définies dans l’API.

    # Tableau 117
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    4000 Erreur générique Payeur Erreur générique liée au Payeur ou à son FSP. Utilisée pour protéger les informations pouvant être sensibles. X X X X X X X
    4001 FSP Payeur liquidité insuffisante Le FSP Payeur n’a pas assez de liquidité pour effectuer le transfert. X
    4100 Rejet générique Payeur Le Payeur ou le FSP Payeur a rejeté la requête. X X X X X X X
    4101 Payeur a rejeté la demande de transaction Le Payeur a rejeté la demande de transaction du Bénéficiaire. X
    4102 FSP Payeur type de transaction non supporté Le FSP Payeur ne supporte pas ou a rejeté le type de transaction demandé. X
    4103 Payeur devise non supportée Le Payeur n’a pas de compte supportant la devise demandée. X
    4200 Erreur de limite Payeur Erreur de limite générique, par exemple nombre de paiements journalier/mensuel dépassé ou montant de la transaction supérieur au maximum autorisé. X X X X X
    4300 Erreur de permission Payeur Erreur de permission générique, le Payeur ou son FSP n’a pas les droits pour réaliser le service. X X X X X X X
    4400 Erreur Payeur bloqué générique Erreur Payeur bloqué générique ; le Payeur est bloqué ou a échoué les contrôles réglementaires. X X X X X X X

    Tableau 117 -- Erreurs côté Payeur -- 4_xxx_

    # Erreurs côté Bénéficiaire -- 5_xxx_

    Toutes les erreurs se produisant sur le serveur pour lesquelles le Bénéficiaire ou son FSP est la cause de l’erreur utilisent le code d’erreur principal 5 (codes 5xxx). Ces codes d’erreur indiquent qu’il n’y a pas eu d’erreur sur le serveur ni dans la requête du client, mais que la requête a échoué pour une raison liée au Bénéficiaire ou à son FSP. Le serveur doit fournir une explication sur la raison pour laquelle le service n’a pas pu être exécuté.

    Catégories de bas niveau pour les erreurs Bénéficiaire :

    • Erreur Générique Bénéficiaire -- 50xx
    • Erreur de Rejet Bénéficiaire -- 51xx
    • Erreur de Limite Bénéficiaire -- 52xx
    • Erreur de Permission Bénéficiaire -- 53xx
    • Erreur Bénéficiaire Bloqué -- 54xx

    Voir Tableau 118 pour toutes les erreurs Bénéficiaire définies dans l’API.

    # Tableau 118
    Code d’erreur Nom Description /participants /parties /transactionRequests /quotes /authorizations /transfers /transactions /bulkQuotes /bulkTransfers
    5000 Erreur générique Bénéficiaire Erreur générique due au Payeur ou à son FSP, à utiliser pour ne pas divulguer d’informations sensibles. X X X X X X X
    5001 FSP Bénéficiaire liquidité insuffisante FSP Bénéficiaire n’a pas assez de liquidité pour effectuer le transfert. X
    5100 Rejet générique Bénéficiaire Le Bénéficiaire ou son FSP a rejeté la requête. X X X X X X X
    5101 Bénéficiaire a rejeté le devis Le Bénéficiaire ne souhaite pas poursuivre la transaction après réception du devis. X X
    5102 FSP Bénéficiaire type de transaction non supporté FSP Bénéficiaire ne supporte pas ou a rejeté le type de transaction demandé. X X
    5103 FSP Bénéficiaire a rejeté le devis Le FSP Bénéficiaire ne souhaite pas poursuivre la transaction après réception du devis. X X
    5104 Bénéficiaire a rejeté la transaction Le Bénéficiaire a rejeté la transaction financière. X X
    5105 FSP Bénéficiaire a rejeté la transaction Le FSP Bénéficiaire a rejeté la transaction financière. X X
    5106 Devise non supportée par le Bénéficiaire Le Bénéficiaire ne possède pas de compte prenant en charge la devise demandée. X X X X
    5200 Erreur de limite Bénéficiaire Erreur de limite générique, par exemple Bénéficiaire recevant plus de paiements par jour/mois que permis, ou recevant un paiement dépassant le montant maximum par transaction. X X X X X
    5300 Erreur de permission Bénéficiaire Erreur de permission générique, le Bénéficiaire ou son FSP n’a pas les droits pour réaliser le service. X X X X X X X
    5400 Erreur Bénéficiaire bloqué générique Erreur générique Bénéficiaire bloqué, le Bénéficiaire est bloqué ou a échoué les contrôles réglementaires. X X X X X X X

    Tableau 118 -- Erreurs côté Bénéficiaire -- 5_xxx_

    # Liaison avec les schémas génériques des transactions

    Cette section décrit comment les schémas logiques de transaction présentés dans Schémas de Transactions Génériques sont utilisés dans la liaison REST asynchrone de l’API. De nombreuses informations sont présentées sous forme de diagrammes de séquence. Pour plus d’informations sur les étapes de ces diagrammes, voir Schémas de Transactions Génériques.

    # Transaction Initiée par le Payeur

    Le schéma Transaction Initiée par le Payeur est introduit dans Schémas de Transactions Génériques. À un niveau général, ce schéma doit être utilisé chaque fois qu’un Payeur souhaite transférer des fonds à une autre Partie qui ne se trouve pas dans le même FSP que le Payeur. Figure 64 présente le diagramme de séquence pour une Transaction Initiée par le Payeur utilisant la liaison REST asynchrone de la version logique. Le processus de chaque numéro dans le diagramme de séquence est décrit dans Schémas de Transactions Génériques.

    # Figure 64

    Figure 64 -- Schéma Transaction Initiée par le Payeur utilisant l’API REST asynchrone

    # Transaction Initiée par le Bénéficiaire

    Le schéma Transaction Initiée par le Bénéficiaire est introduit dans Schémas de Transactions Génériques. À un niveau général, le schéma doit être utilisé lorsqu’un Bénéficiaire souhaite demander au Payeur de transférer des fonds vers le Bénéficiaire. Le Payeur et le Bénéficiaire sont supposés dans des FSP différents, et l’approbation de la transaction est réalisée dans le FSP Payeur. Si l’entrée et l’approbation de la transaction ont lieu sur un appareil du Bénéficiaire, utilisez plutôt le schéma connexe Transaction Initiée par le Bénéficiaire avec OTP](#payee-initiated-transaction-using-otp). Figure 65 présente le diagramme de séquence pour une Transaction Initiée par le Bénéficiaire utilisant la liaison REST asynchrone de la version logique. Le processus pour chaque numéro du diagramme est décrit dans Schémas de Transactions Génériques.

    # Figure 65

    Figure 65 -- Schéma Transaction Initiée par le Bénéficiaire utilisant l’API REST asynchrone

    # Transaction Bénéficiaire Initiée avec OTP

    Le schéma Transaction Initiée par le Bénéficiaire avec OTP est introduit dans Schémas de Transactions Génériques. À un niveau général, ce schéma ressemble à Transaction Initiée par le Bénéficiaire ; cependant, dans ce schéma les informations de transaction et l’approbation du Payeur sont affichées et saisies sur un appareil du Bénéficiaire. Comme pour les autres schémas, le Payeur et le Bénéficiaire sont dans des FSP différents. Figure 66 montre le diagramme pour une Transaction Initiée par le Bénéficiaire avec OTP utilisant la liaison REST asynchrone de la version logique. Le processus de chaque étape du diagramme est décrit dans Schémas de Transactions Génériques.

    # Figure 66

    Figure 66 -- Schéma Transaction Initiée par le Bénéficiaire avec OTP via REST asynchrone

    # Transactions Groupées

    Le schéma Transactions Groupées est introduit dans Schémas de Transactions Génériques. Ce schéma est utilisé lorsque le Payeur souhaite transférer des fonds à plusieurs Bénéficiaires au sein d’une seule transaction. Les Bénéficiaires peuvent être dans différents FSP. Figure 67 montre le diagramme de séquence pour des Transactions Groupées utilisant la liaison REST asynchrone de la version logique. L’explication de chaque étape du diagramme est disponible dans Schémas de Transactions Génériques.

    # Figure 67

    Figure 67 -- Schéma Transactions groupées via REST asynchrone


    # Gestion des erreurs de l’API

    Cette section décrit comment gérer les réponses ou callbacks absents ainsi que les erreurs à traiter côté serveur lors du traitement d’une requête.

    # Requête Erronée

    Si un serveur reçoit une requête de service erronée qui peut être traitée immédiatement (par exemple, syntaxe mal formée ou ressource non trouvée), un code d’erreur HTTP approprié côté client (commençant par 4_xx_) doit être retourné au client dans la réponse. Les codes d’erreur HTTP définis pour l’API sont listés dans le Tableau 4. La réponse HTTP peut aussi contenir un élément ErrorInformation afin de donner plus de détails sur l’erreur (voir Informations d’erreur dans la réponse HTTP).


    # Erreur serveur lors du traitement d’une requête

    Figure 68 montre un exemple sur la gestion d’une erreur survenue lors du traitement serveur.

    # Figure 68

    Figure 68 -- Erreur côté serveur lors du traitement d’une requête

    # Étapes internes du traitement

    La liste suivante décrit les étapes de la séquence (voir Figure 68).

    1. Le client souhaite que le serveur crée un nouvel objet de service et utilise donc une requête POST.

    2. Le serveur reçoit la requête. Il envoie immédiatement une réponse accepted au client, puis tente de créer l’objet selon la demande. Une erreur de traitement survient et la demande ne peut être satisfaite. Le serveur envoie alors le callback PUT /{resource}/{ID}/error incluant un code d’erreur (Codes d’erreur) et une description pour notifier le client.

    3. Le client reçoit le callback d’erreur et répond immédiatement avec OK. Il gère ensuite l’erreur.

    4. Le serveur reçoit la réponse OK et le processus est terminé.


    # Gestion côté client d’un callback d’erreur

    Les sections suivantes expliquent comment un client doit traiter les callbacks d’erreur reçus d’un serveur.

    # Ressource API /participants

    L’erreur typique du service /participants est que la Partie demandée n’a pas été trouvée. Le client peut soit essayer un autre serveur, soit informer l’utilisateur final que la Partie recherchée est introuvable.

    # Ressource API /parties

    L’erreur typique du service /parties est que la Partie demandée n’a pas été trouvée. Le client peut soit essayer un autre serveur, soit informer l’utilisateur final que les informations recherchées sont indisponibles.

    # Ressource API /quotes

    L’erreur typique du service /quotes est qu’un devis n’a pas pu être calculé pour la transaction demandée. Le client doit notifier l’utilisateur final que la transaction n’a pas pu être réalisée.

    # Ressource API /transactionRequests

    L’erreur typique du service /transactionRequests est que le Payeur a rejeté la transaction ou qu’une validation automatique a échoué. Le client doit informer le Bénéficiaire que la demande de transaction a échoué.

    # Ressource API /authorizations

    L’erreur typique du service /authorizations est que la demande de transaction n’a pas été trouvée. Le client doit informer le Payeur que la demande a été annulée.

    # Ressource API /transfers

    L’erreur typique du service /transfers est qu’un échec a eu lieu lors du transfert hop-to-hop ou lors de la transaction financière de bout en bout. Par exemple : dépassement de limite ou Bénéficiaire introuvable. Dans tous les cas d’erreur, le client (FSP Payeur) doit annuler la réservation pour la transaction financière réalisée avant la demande d’exécution sur le serveur (FSP Bénéficiaire). Voir Figure 69 pour un exemple avec un Switch financier entre les FSP.

    # Figure 69

    Figure 69 -- Gestion du callback d’erreur suite à POST /transfers

    # Étapes internes du traitement

    La liste suivante détaille les étapes de la séquence (voir Figure 69).

    1. La réservation du transfert est faite depuis le compte du Payeur vers un compte Switch combiné ou un compte FSP Bénéficiaire. Lorsque la réservation est réussie, la demande POST /transfers est utilisée sur le Switch. Le transfert devient alors irrévocable côté FSP Payeur. Le FSP Payeur attend la réponse accepted du Switch.

    2. Le Switch reçoit la demande POST /transfers, envoie de suite une réponse accepted au FSP Payeur, puis effectue toutes les validations internes nécessaires. Si tout est valide, une réservation est effectuée du FSP Payeur vers le FSP Bénéficiaire. Une fois cette réservation réussie, POST /transfers est utilisé côté FSP Bénéficiaire. Le transfert est alors irrévocable du côté Switch. Le Switch attend une réponse accepted du FSP Bénéficiaire.

    3. Le FSP Bénéficiaire reçoit le POST /transfers et envoie immédiatement une réponse accepted au Switch. Il effectue ses propres validations. On suppose ici qu’une validation échoue (par exemple, pour dépassement de limite). Le callback d’erreur PUT /transfers/{ID}/error est utilisé vers le Switch pour informer le FSP Payeur de l’erreur. Le FSP Bénéficiaire attend alors la réponse OK du Switch pour conclure le processus.

    4. Le Switch reçoit le callback d’erreur PUT /transfers/{ID}/error et répond immédiatement avec OK. Il annule le transfert réservé suite à la réception du callback d’erreur. Le Switch utilise alors le callback PUT /transfers/{ID}/error vers le FSP Payeur avec les mêmes paramètres, et attend une réponse OK pour terminer la procédure.

    5. Le FSP Payeur reçoit le callback PUT /transfers/{ID}/error et répond immédiatement avec OK. Il annule sa propre réservation de transfert suite à la réception du callback d’erreur.

    # Ressource API /transactions

    L’erreur normale du service /transactions est que la transaction n’a pas été trouvée dans le FSP Pair.

    # Ressource API /bulkQuotes

    L’erreur typique du service /bulkQuotes est qu’un devis n’a pas pu être calculé pour la transaction demandée. Le client doit notifier l’utilisateur final que la transaction demandée a échoué.

    # Ressource API /bulkTransfers

    L’erreur classique du service /bulkTransfers est que la transaction groupée n’a pas été acceptée, par exemple suite à une erreur de validation. Dans tous les cas d’erreur, le client (FSP Payeur) doit annuler la réservation des transactions financières effectuées avant la demande côté FSP Bénéficiaire. Voir Figure 70 pour un exemple avec Switch financier entre les FSP.

    # Figure 70

    Figure 70 -- Gestion du callback d’erreur pour le service API /bulkTransfers

    # Étapes internes du traitement

    La liste suivante décrit les étapes de la séquence (voir Figure 70).

    1. Chaque transfert individuel du transfert groupé est réservé depuis le compte du Payeur vers un compte Switch combiné ou un compte FSP Bénéficiaire. Une fois toutes les réservations individuelles réussies, POST /bulkTransfers est utilisé sur le Switch. Le transfert groupé devient alors irrévocable côté FSP Payeur. Ce dernier attend une réponse accepted du Switch.

    2. Le Switch reçoit POST /bulkTransfers et répond immédiatement accepted au FSP Payeur. Il réalise toutes les validations nécessaires. Si celles-ci passent, chaque transfert individuel est réservé du FSP Payeur au FSP Bénéficiaire. Une fois les réservations validées, POST /bulkTransfers est utilisé vers le FSP Bénéficiaire. Le transfert groupé devient irrévocable côté Switch, qui attend alors la réponse accepted du FSP Bénéficiaire.

    3. Le FSP Bénéficiaire reçoit POST /bulkTransfers, répond de suite accepted au Switch, puis effectue ses validations sur le transfert groupé. Supposons qu’une validation empêche tout le transfert groupé. Le callback d’erreur PUT /bulkTransfers/{ID}/error est utilisé vers le Switch pour informer le FSP Payeur. Le FSP Bénéficiaire attend ensuite la réponse OK du Switch.

    4. Le Switch reçoit le callback d’erreur PUT /bulkTransfers/{ID}/error et répond immédiatement par OK. Il annule toutes les réservations de transferts précédentes, puis utilise à son tour le callback PUT /bulkTransfers/{ID}/error vers le FSP Payeur avec les paramètres identiques, et attend la réponse OK pour conclure.

    5. Le FSP Payeur reçoit le callback PUT /bulkTransfers/{ID}/error, répond par OK et annule toutes les réservations précédentes suite à la réception du callback d’erreur.


    # Absence de réponse du serveur côté Client - Réenvoi de la requête

    Figure 71 présente un exemple (UML) où un client (FSP ou Switch) gère une absence de réponse d’un serveur (Switch ou FSP Pair) suite à une requête de service, via le renvoi de la même requête de service.

    # Figure 71

    Figure 71 -- Gestion d’erreur côté client via réenvoi de la requête

    # Étapes internes du traitement

    Voici la description détaillée de chaque étape (voir Figure 71).

    1. Le client sollicite la création d’un nouvel objet de service coté serveur. La requête HTTP est perdue.

    2. Le client constate qu’aucune réponse n’a été reçue dans un délai imparti, et renvoie la requête de service.

    3. Le serveur reçoit la nouvelle requête, envoie immédiatement une réponse accepted au client, puis procède à la création de l’objet selon la demande initiale.

    4. La réponse HTTP accepted du serveur se perd en retour, le client constate à nouveau une absence de réponse dans le délai, et renvoie la requête de service.

    5. Le serveur reçoit la nouvelle requête, envoie à nouveau une réponse accepted au client, et constate qu’il s’agit d’un doublon (cf. étape 3). Nul besoin de créer un nouvel objet ; un callback est alors envoyé pour notifier le client de l’objet déjà créé à l’étape 3.

    6. Le client reçoit le callback concernant l’objet créé, envoie une réponse HTTP OK au serveur pour conclure le processus.

    7. Le serveur reçoit la réponse OK du client, le processus est terminé.


    # Absence de réponse du client côté Serveur

    Un serveur utilisant l’API n’est pas responsable de s’assurer qu’un callback a bien été livré au client. Toutefois, il est recommandé de réessayer en cas de non-réception d'une réponse OK du client.

    # Absence de callback côté client - Utilisation de GET

    Figure 72 est un diagramme de séquence UML illustrant la manière dont un client (Switch ou FSP Pair) peut gérer une absence de callback de la part d’un client (FSP ou Switch) dans un délai raisonnable.

    # Figure 72

    Figure 72 -- Gestion d’erreur côté client via requête GET

    # Étapes internes du traitement

    La liste suivante détaille les étapes de la séquence (voir Figure 71).

    1. Le client souhaite que le serveur crée un nouvel objet de service ; une requête de service est envoyée.

    2. Le serveur reçoit la requête de service, répond immédiatement accepted au client, puis crée l’objet conformément à la demande. La création est longue (ex : transfert groupé volumineux).

    3. Le serveur constate l’absence de callback côté client dans un délai raisonnable. Le client utilise alors une requête GET avec l’ID fourni initialement.

    4. Le serveur reçoit la requête GET, répond accepted pour signifier que la demande sera traitée.

    5. Le client reçoit la réponse accepted et attend le callback, qui arrive plus tard ; le client envoie alors OK en retour et le processus est terminé.

    6. Le serveur envoie le callback contenant l’information demandée, puis reçoit le OK qui termine le processus.


    # Exemple bout-en-bout

    Cette section contient un exemple complet où un titulaire de compte est provisionné, puis un transfert P2P depuis un Payeur sur un FSP vers un Bénéficiaire sur un autre FSP est effectué. L’exemple inclut les requêtes et réponses HTTP, les en-têtes HTTP, et les modèles de données JSON, mais exclut la sécurité JWS (Signature) et le chiffrement JWE (Encryption).

    # Configuration de l’exemple

    Description de l’environnement de l’exemple.

    # Nœuds

    # Figure 73

    Les nœuds de l’exemple bout-en-bout sont simplifiés à deux FSP : une banque (identifiant BankNrOne), un opérateur mobile money (MobileMoney), et un Switch (identifiant Switch). Le Switch joue aussi le rôle de ALS (Account Lookup System, ou Système de Recherche de Compte) (voir Figure 73).

    Figure 73

    Figure 73 -- Nœuds de l’exemple bout-en-bout

    # Titulaires de comptes

    Les titulaires de compte dans l’exemple sont :

    • Un titulaire de compte chez BankNrOne nommé Mats Hagman. Il dispose d’un compte IBAN SE4550000000058398257466 en USD.

    • Un titulaire de compte chez MobileMoney nommé Henrik Karlsson. Il dispose d’un compte mobile identifié par 123456789 (numéro), en USD.

    # Scénario

    Le scénario : Mats Hagman (BankNrOne) souhaite transférer 100 USD à Henrik Karlsson (MobileMoney). Avant que Henrik ne soit trouvable, son FSP MobileMoney doit fournir au Switch l’information d’affectation de FSP. Le déroulé complet se trouve en Autres Informations.

    # Autres Informations

    Les messages JSON sont formatés avec couleurs, indentation et retours à la ligne pour la lisibilité.

    Il est supposé que chaque FSP dispose d’un compte Switch pré-approvisionné dans son propre établissement.

    # Déroulé de l’exemple

    Figure 74 illustre l’ensemble du processus, du provisioning des informations FSP jusqu’à la transaction.

    # Figure 74

    Figure 74 -- Déroulé complet : de la fourniture d’information FSP compte au succès de la transaction

    # Provisionnement du Titulaire de Compte

    Avant que le bénéficiaire Henrik Karlsson ne soit trouvable via le FSP BankNrOne, il doit être provisionné dans l’ALS (le Switch) par son FSP (MobileMoney). Cela s’effectue via POST /participants (version bulk) ou POST /participants/{Type}/{ID} (version simple). Comme il n'y a ici qu'un bénéficiaire, la version simple est utilisée par MobileMoney. Le provisioning peut avoir lieu à tout moment, lors de la création du compte ou lors de la connexion initiale au Switch.

    # FSP MobileMoney provisionne Henrik Karlsson : Étape 1 du déroulé

    Listing 29 montre la demande HTTP où MobileMoney provisionne les infos FSP pour Henrik Karlsson, identifié par MSISDN et 123456789 (voir Adressage de Parties). L’élément JSON fspId est mis à l’identifiant du FSP et currency à la devise du compte (USD).

    Voir Tableau 1 pour les en-têtes HTTP requis, et POST /participants/{Type}/{ID} pour plus d’infos. Pour le routage avec FSPIOP-Destination et FSPIOP-Source, voir Routage du flux d’appel. Pour la négociation de version, voir Négociation de version entre client et serveur.

    # Listing 29
    POST /participants/MSISDN/123456789 HTTP/1.1
    Accept: application/vnd.interoperability.participants+json;version=1
    Content-Length: 50
    Content-Type:
    application/vnd.interoperability.participants+json;version=1.0
    Date: Tue, 14 Nov 2017 08:12:31 GMT
    FSPIOP-Source: MobileMoney
    FSPIOP-Destination: Switch
    {
        "fspId": "MobileMoney",
        "currency": "USD"
    }
    

    Listing 29 -- Provision d’informations FSP pour le titulaire Henrik Karlsson

    Listing 30 présente la réponse HTTP synchrone où le Switch accuse réception immédiate (après vérif de headers, etc.).

    Voir Tableau 3 pour les en-têtes de réponse requis.

    # Listing 30
    HTTP/1.1 202 Accepted
    Content-Type:
    application/vnd.interoperability.participants+json;version=1.0
    

    Listing 30 -- Réponse synchrone à la requête de provision


    # Traitement du provisionnement par le Switch : Étape 2

    Une fois la demande reçue (Listing 29) et la réponse envoyée (Listing 30), le Switch vérifie le corps de la demande. Par exemple, il s’assure que fspId correspond à FSPIOP-Source, que la devise est autorisée, etc.

    Après validation, l’information que le compte identifié par MSISDN et 123456789 est chez le FSP MobileMoney est enregistrée en base Switch.


    # Switch envoie le callback de succès : Étape 3

    Le Switch doit ensuite notifier le FSP MobileMoney du succès du provisioning, via PUT /participants/{Type}/{ID}. Listing 31 illustre cette requête HTTP.

    Voir Tableau 1 pour les en-têtes requis. Dans le callback, Accept ne doit pas être utilisé (appel de service précédent). Les headers FSPIOP-Destination et FSPIOP-Source sont inversés par rapport à la demande d’origine.

    # Listing 31
    PUT /participants/MSISDN/123456789 HTTP/1.1
    Content-Length: 50
    Content-Type:
    Date: Tue, 14 Nov 2017 08:12:32 GMT
    FSPIOP-Source: MobileMoney
    FSPIOP-Destination: Switch
    {
        "fspId": "MobileMoney",
        "currency": "USD"
    }
    

    Listing 31 -- Callback pour le provisioning demandé précédemment

    Listing 32 montre la réponse HTTP synchrone où le FSP MobileMoney accuse réception immédiate (après vérification des headers…) pour conclure le process après réception du callback.

    Voir Tableau 3 pour les en-têtes requis.

    # Listing 32
    HTTP/1.1 200 OK
    Content-Type:
    application/vnd.interoperability.participants+json;version=1.0
    

    Listing 32 -- Réponse synchrone au callback


    # Transfert P2P

    Comme le bénéficiaire visé, Henrik Karlsson, est désormais connu du Switch (qui fait aussi office d’ALS), comme détaillé dans la section Provision Account Holder, Mats Hagman peut maintenant initier et approuver le cas d'utilisation Transfert P2P de sa banque vers Henrik Karlsson.

    # Initiation du cas d’utilisation : Étape 4 du flux de bout en bout

    Mats Hagman sait que Henrik Karlsson possède le numéro de téléphone 123456789, il saisit donc ce numéro sur son appareil comme bénéficiaire et 100 USD comme montant. La communication réelle entre l’appareil de Mats et sa banque BankNrOne est hors du périmètre de cette API.


    # Demande d'information sur la partie auprès du Switch : Étape 5 du flux de bout en bout

    À l’étape 5 du flux de bout en bout, BankNrOne reçoit la demande de Mats Hagman visant à transférer 100 USD au numéro de téléphone 123456789. BankNrOne effectue une recherche interne pour savoir si le compte 123456789 existe dans la banque, mais ne le trouve pas. BankNrOne utilise alors le service GET /parties/{Type}/{ID} du Switch pour voir si ce dernier a des informations sur le compte.

    Exemple 33 illustre la requête HTTP où le PSP BankNrOne demande au Switch des informations sur la partie correspondant au compte identifié par MSISDN et 123456789.

    Voir Tableau 1 pour les en-têtes HTTP requis dans une requête, ainsi que GET /parties/{Type}/{ID} pour plus d'informations sur ce service. Plus d’informations sur le routage des requêtes via FSPIOP-Destination et FSPIOP-Source sont disponibles dans Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source. Dans cette requête, le FSP BankNrOne ne connaît pas le FSP du bénéficiaire. Par conséquent, l’en-tête FSPIOP-Destination n’est pas présent. Les informations sur la négociation de version de l’API se trouvent dans Négociation de version entre client et serveur.

    # Exemple 33
    GET /parties/MSISDN/123456789 HTTP/1.1
    Accept: application/vnd.interoperability.parties+json;version=1
    Content-Type: application/vnd.interoperability.parties+json;version=1.0
    Date: Tue, 15 Nov 2017 10:13:37 GMT
    FSPIOP-Source: BankNrOne
    

    Exemple 33 — Obtenir les informations d’une partie pour le compte identifié par MSISDN et 123456789 depuis BankNrOne

    Exemple 34 montre la réponse HTTP synchrone où le Switch accuse réception immédiatement (après vérification basique des en-têtes requis, par exemple) de la requête HTTP illustrée dans Exemple 33.

    Voir Tableau 3 pour les en-têtes HTTP requis dans une réponse HTTP.

    # Exemple 34
    HTTP/1.1 202 Accepted
    Content-Type: application/vnd.interoperability.parties+json;version=1.0
    

    Exemple 34 — Réponse synchrone à la demande d’information sur une partie

    # Demande d'information sur la partie auprès du FSP : Étape 6 du flux de bout en bout

    Quand le Switch a reçu la requête HTTP Exemple 33 et envoyé la réponse synchrone Exemple 34, il peut vérifier dans sa base de données s’il dispose d’informations sur le FSP auquel appartient le titulaire du compte identifié par MSISDN et 123456789. Comme cette information a été provisionnée selon la section Provision Account Holder, le Switch sait que le compte est chez le FSP MobileMoney. Le Switch envoie donc la requête HTTP illustrée dans Exemple 35.

    Voir Tableau 1 pour les en-têtes HTTP requis, et GET /parties/{Type}/{ID} pour plus d’informations sur ce service. Plus d’informations sur le routage via FSPIOP-Destination et FSPIOP-Source se trouvent dans Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source. Dans cette requête, le Switch ajoute l’entête FSPIOP-Destination car il connaît le FSP destination. Les informations sur la négociation de version API sont dans Négociation de version entre client et serveur.

    # Exemple 35
    GET /parties/MSISDN/123456789 HTTP/1.1
    Accept: application/vnd.interoperability.parties+json;version=1
    Content-Type: application/vnd.interoperability.parties+json;version=1.0
    Date: Tue, 15 Nov 2017 10:13:38 GMT
    FSPIOP-Source: BankNrOne
    FSPIOP-Destination: MobileMoney
    

    Exemple 35 — Demande d’information de partie pour le compte identifié par MSISDN et 123456789, envoyée par le Switch

    Exemple 36 montre la réponse HTTP synchrone dans laquelle le FSP MobileMoney accuse réception immédiatement (après vérification basique des en-têtes requis, par exemple) de la requête HTTP illustrée dans Exemple 35.

    Voir Tableau 3 pour les en-têtes HTTP requis dans une réponse HTTP.

    # Exemple 36
    HTTP/1.1 202 Accepted
    Content-Type: application/vnd.interoperability.parties+json;version=1.0
    

    Exemple 36 — Réponse synchrone à la demande d’information sur une partie


    # Recherche de l’information sur la partie dans le FSP MobileMoney : Étape 7 du flux de bout en bout

    Quand le FSP MobileMoney a reçu la requête HTTP Exemple 35 et envoyé la réponse synchrone Exemple 36, il peut chercher dans sa base de données des informations supplémentaires sur le compte identifié par MSISDN et 123456789. Comme le compte existe et appartient à Henrik Karlsson, le FSP MobileMoney envoie le callback illustré dans Exemple 37. MobileMoney ne souhaite pas partager certains détails, par exemple la date de naissance, avec l’autre FSP (BankNrOne), donc certains éléments facultatifs ne sont pas envoyés.

    Voir Tableau 1 pour les en-têtes HTTP requis dans une requête, et PUT /participants/{Type}/{ID} pour plus d’informations sur le callback. Dans le callback, l’entête Accept ne doit pas être envoyé. Les en-têtes HTTP FSPIOP-Destination et FSPIOP-Source sont inversés par rapport à la requête HTTP Exemple 35, comme expliqué dans Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source.

    # Exemple 37
    PUT /parties/MSISDN/123456789 HTTP/1.1
    Content-Type: application/vnd.interoperability.parties+json;version=1.0
    Content-Length: 347
    Date: Tue, 15 Nov 2017 10:13:39 GMT
    FSPIOP-Source: MobileMoney
    FSPIOP-Destination: BankNrOne
    {
        "party": {
            "partyIdInfo": {
                "partyIdType": "MSISDN",
                "partyIdentifier": "123456789",
                "fspId": "MobileMoney"
            },
            "personalInfo": {
                "complexName": {
                    "firstName": "Henrik",
                    "lastName": "Karlsson"
                }
            }
        }
    }
    

    Exemple 37 — Callback en réponse à la demande d’information sur la partie

    Exemple 38 présente la réponse HTTP synchrone du Switch qui confirme immédiatement (après vérification des en-têtes requis, par exemple) la fin du processus, après réception du callback Exemple 37.

    Voir Tableau 3 pour les en-têtes HTTP requis en réponse.

    # Exemple 38
    HTTP/1.1 200 OK
    Content-Type: application/vnd.interoperability.parties+json;version=1.0
    

    Exemple 38 — Réponse synchrone au callback d’information sur une partie


    # Relais du callback au FSP BankNrOne : Étape 8 du flux de bout en bout

    Quand le Switch a reçu le callback Exemple 37 et envoyé la réponse synchrone Exemple 38, il doit relayer exactement le même callback que dans Exemple 37 au FSP BankNrOne, qui doit alors répondre de façon synchrone avec la même réponse que dans Exemple 38.

    La requête et la réponse HTTP ne sont pas répétées ici, car identiques à la dernière section, mais envoyées cette fois du Switch vers BankNrOne (requête HTTP Exemple 37) et de BankNrOne vers le Switch (réponse HTTP Exemple 38).


    # Envoi d’une demande de devis par le FSP BankNrOne : Étape 9 du flux de bout en bout

    Après avoir reçu les informations de partie via le callback PUT /parties/{Type}/{ID}, le FSP BankNrOne sait désormais que le compte identifié par MSISDN et 123456789 existe et qu’il est chez le FSP MobileMoney. Il connaît aussi le nom du titulaire. Selon l’implémentation, le nom du bénéficiaire visé (Henrik Karlsson) pourrait être affiché à Mats Hagman dès cette étape, avant l’envoi du devis. Dans cet exemple, une demande de devis est envoyée avant d’afficher le nom ou d’éventuels frais.

    Le FSP BankNrOne envoie la requête HTTP présentée dans Exemple 39 pour demander un devis. BankNrOne ne souhaite pas divulguer ses frais (voir Quoting pour plus d’infos), il n’inclut donc pas l’élément fees dans la demande. L’élément amountType est positionné sur RECEIVE car Mats veut qu’Henrik reçoive 100 USD. Le transactionType est défini selon la Correspondance des cas d’usage avec les types de transaction. Les infos sur Mats sont envoyées dans l’élément payer. BankNrOne a aussi généré deux UUID pour l’ID du devis (7c23e80c-d078-4077-8263-2c047876fcf6) et l’ID de la transaction (85feac2f-39b2-491b-817e-4a03203d4f14). Ces identifiants doivent être uniques, voir Style architectural.

    Voir Tableau 1 pour les en-têtes HTTP requis dans une requête, et Section 6.5.3.2 concernant le service POST /quotes. Plus d’informations sur le routage via FSPIOP-Destination et FSPIOP-Source se trouvent dans Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source. Des informations sur la négociation de version API se trouvent dans Négociation de version entre client et serveur.

    # Exemple 39
    POST /quotes HTTP/1.1
    Accept: application/vnd.interoperability.quotes+json;version=1
    Content-Type: application/vnd.interoperability.quotes+json;version=1.0
    Content-Length: 975
    Date: Tue, 15 Nov 2017 10:13:40 GMT
    FSPIOP-Source: BankNrOne
    FSPIOP-Destination: MobileMoney
    {
        "quoteId": "7c23e80c-d078-4077-8263-2c047876fcf6",
        "transactionId": "85feac2f-39b2-491b-817e-4a03203d4f14",
        "payee": {
            "partyIdInfo": {
                "partyIdType": "MSISDN",
                "partyIdentifier": "123456789",
                "fspId": "MobileMoney"
            }
        },
        "payer": {
            "personalInfo": {
                "complexName": {
                    "firstName": "Mats",
                    "lastName": "Hagman"
                }
            },
            "partyIdInfo": {
                "partyIdType": "IBAN",
                "partyIdentifier": "SE4550000000058398257466",
                "fspId": "BankNrOne"
            }
        },
        "amountType": "RECEIVE",
        "amount": {
            "amount": "100",
            "currency": "USD"
        },
        "transactionType": {
            "scenario": "TRANSFER",
            "initiator": "PAYER",
            "initiatorType": "CONSUMER"
        },
        "note": "From Mats",
        "expiration": "2017-11-15T22:17:28.985-01:00"
    }
    

    Exemple 39 — Demande de devis pour une transaction de 100 USD

    Exemple 40 montre la réponse HTTP synchrone dans laquelle le Switch accuse réception immédiatement (après vérification des en-têtes, par exemple) de la requête HTTP illustrée dans Exemple 39.

    Voir Tableau 3 pour les en-têtes HTTP requis dans une réponse.

    # Exemple 40
    HTTP/1.1 202 Accepted
    Content-Type: application/vnd.interoperability.quotes+json;version=1.0
    

    Exemple 40 — Réponse synchrone à la demande de devis

    # Transmission de la demande de devis par le Switch : Étape 10 du flux de bout en bout

    Après réception de la demande de devis, Exemple 39, et l’envoi de la réponse synchrone Exemple 40, le Switch doit relayer la même demande que dans Exemple 39 au FSP MobileMoney, lequel doit alors répondre de manière synchrone avec la même réponse que dans Exemple 40.

    La requête et la réponse HTTP ne sont pas répétées ici, car identiques à la dernière section, mais cette fois du Switch vers MobileMoney (requête HTTP Exemple 39) puis de MobileMoney vers le Switch (réponse HTTP Exemple 40).


    # Détermination des frais et de la commission FSP dans MobileMoney : Étape 11 du flux de bout en bout

    Quand le FSP MobileMoney a reçu la requête HTTP Exemple 39 et envoyé la réponse synchrone Exemple 40, il doit valider la requête puis calculer les frais applicables et/ou la commission FSP pour effectuer la transaction demandée via le devis.

    Dans cet exemple, le FSP MobileMoney décide de prendre 1 USD de commission car il va recevoir de l’argent, ce qui peut engendrer de futurs revenus (frais ultérieurs). Comme le bénéficiaire (Henrik Karlsson) doit recevoir 100 USD et que la commission FSP est de 1 USD, le FSP BankNrOne n’aura à transférer que 99 USD au FSP MobileMoney (voir Non Disclosing Receive Amount pour l’équation). Les 99 USD sont renseignés dans l’élément transferAmount du callback, c’est donc le montant à transférer plus tard entre FSPs.

    Pour envoyer le callback, le FSP MobileMoney doit alors créer un paquet ILP (voir ILP Packet pour plus d’infos) encodé en base64url, car l'élément ilpPacket du callback PUT /quotes/{ID} est défini comme BinaryString. La manière de remplir ce paquet ILP est expliquée dans Interledger Payment Request. L’adresse ILP d’Henrik dans le FSP MobileMoney est fixée à g.se.mobilemoney.msisdn.123456789 (voir ILP Addressing). Comme le montant du transfert est de 99 USD et que l’exposant du devise USD est 2, le montant renseigné dans le paquet ILP est 9900 (99 * 10^2 = 9900). L’autre élément du paquet ILP est data. Comme expliqué dans Interledger Payment Request, cet élément doit contenir le modèle de données Transaction (voir Transaction). Avec les informations de la demande de devis, la Transaction dans cet exemple est illustrée dans Exemple 41. Après encodage base64url du paquet ILP complet avec amount, account et le data, cela donne l’élément ilpPacket du callback PUT /quotes/{ID}.

    Une fois le paquet ILP créé, la réalisation (fulfilment) et la condition sont générées selon l’algorithme défini dans Exemple 12. En utilisant un secret d’exemple généré (voir Exemple 42), la réalisation devient celle de Exemple 43 après execution de HMAC SHA-256 sur le paquet ILP avec ce secret comme clé (le tout en base64url). Le FSP MobileMoney doit stocker la réalisation en base de données pour ne pas avoir à la régénérer plus tard. La condition correspond au hash SHA-256 de la réalisation (voir Exemple 44, base64url).

    Le callback complet envoyé en réponse à la demande de devis est présenté dans Exemple 45.

    Voir Tableau 1 pour les en-têtes HTTP requis dans une requête, et PUT /quotes/{ID} pour plus d’infos sur le callback. L’ID dans l’URI doit être celui spécifié comme quote ID dans la demande de devis, ici 7c23e80c-d078-4077-8263-2c047876fcf6. Dans le callback, l’entête Accept ne doit pas être envoyé. Les en-têtes HTTP FSPIOP-Destination et FSPIOP-Source sont inversés par rapport à la demande Exemple 39, conformément à Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source.

    # Listing 41
    {
        "transactionId": "85feac2f-39b2-491b-817e-4a03203d4f14",
        "quoteId": "7c23e80c-d078-4077-8263-2c047876fcf6",
        "payee": {
            "partyIdInfo": {
                "partyIdType": "MSISDN",
                "partyIdentifier": "123456789",
                "fspId": "MobileMoney"
            },
            "personalInfo": {
                "complexName": {
                    "firstName": "Henrik",
                    "lastName": "Karlsson"
                }
            }
        },
        "payer": {
            "personalInfo": {
                "complexName": {
                    "firstName": "Mats",
                    "lastName": "Hagman"
                }
            },
            "partyIdInfo": {
                "partyIdType": "IBAN",
                "partyIdentifier": "SE4550000000058398257466",
                "fspId": "BankNrOne"
            }
        },
        "amount": {
            "amount": "99",
            "currency": "USD"
        },
        "transactionType": {
            "scenario": "TRANSFER",
            "initiator": "PAYER",
            "initiatorType": "CONSUMER"
        },
        "note": "From Mats"
    }
    

    Liste 41 -- Objet JSON Transaction

    # Listing 42
    JdtBrN2tskq9fuFr6Kg6kdy8RANoZv6BqR9nSk3rUbY
    

    Liste 42 -- Secret généré, encodé en base64url

    # Listing 43
    mhPUT9ZAwd-BXLfeSd7-YPh46rBWRNBiTCSWjpku90s
    

    Liste 43 -- Fulfilment calculé à partir du paquet ILP et du secret, encodé en base64url

    # Listing 44
    fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG\_fqGnR7Xs
    

    Liste 44 -- Condition calculée à partir du fulfilment, encodée en base64url

    # Listing 45
    PUT /quotes/7c23e80c-d078-4077-8263-2c047876fcf6 HTTP/1.1
    Content-Type: application/vnd.interoperability.quotes+json;version=1.0
    Content-Length: 1802
    Date: Tue, 15 Nov 2017 10:13:41 GMT
    FSPIOP-Source: MobileMoney
    FSPIOP-Destination: BankNrOne
    {
        "transferAmount": {
            "amount": "99",
            "currency": "USD"
        },
        "payeeReceiveAmount": {
            "amount": "100",
            "currency": "USD"
        },
        "expiration": "2017-11-15T14:17:09.663+01:00",
        "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OY-
    IEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlY-
    WMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlOD-
    BjLWQwNzgtNDA3Ny04MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgI-
    CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgI-
    CAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgI-
    CAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgI-
    CAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgI-
    CAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJpayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIk-
    thcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIi-
    OiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUi-
    OiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgI-
    CAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgI-
    CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgI-
    CAgICAgICAicGFydHlJZGVudGlmaWVyI-
    jogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25
    lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEw-
    MCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlI-
    jogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yI-
    jogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgI-
    CAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d",
        "condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs"
    }
    

    Liste 45 -- Callback du devis

    Remarque : L’élément ilpPacket dans la Liste 45 devrait être sur une seule ligne dans une vraie implémentation ; il est affiché ici avec des sauts de ligne pour montrer toute la valeur.

    La Liste 46 montre la réponse HTTP synchrone où le Switch accuse immédiatement réception (après vérification basique des en-têtes requis, par exemple) du callback de la Liste 45.

    Voir Tableau 3 pour les en-têtes HTTP requis dans une réponse HTTP.

    # Listing 46
    HTTP/1.1 200 OK
    Content-Type: application/vnd.interoperability.quotes+json;version=1.0
    

    Liste 46 -- Réponse synchrone au callback de devis

    # Transmission du callback au FSP BankNrOne : Étape 12 du flux de bout en bout

    Lorsque le Switch a reçu le callback de devis dans la Liste 45 et a envoyé la réponse synchrone dans la Liste 46, il doit relayer exactement le même callback que dans la Liste 45 au FSP BankNrOne. Le FSP BankNrOne doit alors répondre de manière synchrone avec la même réponse que dans la Liste 46.

    La requête et la réponse HTTP ne sont pas répétées ici, car elles sont identiques à la section précédente, mais cette fois-ci envoyées du Switch vers BankNrOne (requête HTTP de la Liste 45) puis de BankNrOne vers le Switch (réponse HTTP de la Liste 46).


    # Détermination des frais dans le FSP BankNrOne : Étape 13 du flux de bout en bout

    Lorsque le FSP BankNrOne a reçu le callback du devis dans la Liste 45 et qu’il a envoyé la réponse synchrone de la Liste 46, il peut alors déterminer les frais pour le payeur Mats Hagman. Dans cet exemple, les frais pour le payeur sont fixés à 0 USD, mais la commission du FSP reçue du FSP MobileMoney reste un revenu pour le FSP BankNrOne. Cela signifie que pour que le bénéficiaire Henrik Karlsson reçoive 100 USD, le payeur Mats Hagman doit transférer 100 USD de son compte. 99 USD seront alors transférés entre les FSPs BankNrOne et MobileMoney.

    Le FSP BankNrOne notifie alors Mats Hagman que la transaction de transfert de 100 USD à Henrik Karlsson coûtera 0 USD de frais. La façon dont Mats Hagman est notifié est hors du champ de cette API.


    # Acceptation de la transaction par le payeur : Étape 14 du flux de bout en bout

    Dans cet exemple, Mats Hagman accepte d’effectuer la transaction. La manière dont l’acceptation est envoyée est hors du périmètre de cette API.

    # Envoi de la demande de transfert depuis FSP BankNrOne : Étape 15 du flux de bout en bout

    Une fois que Mats Hagman a accepté la transaction, le FSP BankNrOne réserve les mouvements internes nécessaires pour effectuer la transaction. Cela signifie que 100 USD seront réservés du compte de Mats Hagman, où 1 USD sera un revenu pour le FSP et 99 USD seront transférés au compte Switch préfinancé. Après le succès des réservations, le FSP BankNrOne envoie un POST /transfers au Switch comme dans la Liste 47. Les mêmes éléments ilpPacket et condition sont envoyés comme reçus dans le callback de devis et le champ amount correspond au transferAmount reçu, voir Liste 45.

    Voir Tableau 1 pour les en-têtes HTTP requis dans une requête et Post Transfers pour plus d’informations sur le service POST /transfers. Davantage d'informations concernant le routage des requêtes via FSPIOP-Destination et FSPIOP-Source peuvent être trouvées dans Routage des flux d'appels avec FSPIOP Destination et FSPIOP Source. L’information sur la négociation de version API se trouve dans Négociation de version entre client et serveur.

    # Listing 47
    POST /transfers HTTP/1.1
    Accept: application/vnd.interoperability.transfers+json;version=1
    Content-Type: application/vnd.interoperability.transfers+json;version=1.0
    Content-Length: 1820
    Date: Tue, 15 Nov 2017 10:14:01
    FSPIOP-Source: BankNrOne
    FSPIOP-Destination: MobileMoney
    {
        "transferId":"11436b17-c690-4a30-8505-42a2c4eafb9d",
        "payerFsp":"BankNrOne",
        "payeeFsp": "MobileMoney",
        "amount": {
            "amount": "99",
            "currency": "USD"
        },
        "expiration": "2017-11-15T11:17:01.663+01:00",
        "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OY- 
    IEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlY-
    WMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlOD-
    BjLWQwNzgtNDA3Ny04MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgI-
    CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgI-
    CAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgI-
    CAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgI-
    CAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgI-
    CAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJpayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIk-
    thcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIi-
    OiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUi-
    OiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgI-
    CAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgI-
    CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgI- CAgICAgICAicGFydHlJZGVudGlmaWVyI-
    jogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25 lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEw-
    MCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlI-
    jogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yI-
    jogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgI-
    CAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d",
    "condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs" 
    }
    

    Liste 47 -- Requête de transfert de BankNrOne à MobileMoney

    Remarque : L’élément ilpPacket dans la Liste 47 devrait être sur une seule ligne dans une vraie implémentation ; il est affiché ici avec des sauts de ligne pour montrer toute la valeur.

    La Liste 48 montre la réponse HTTP synchrone où le Switch accuse réception immédiatement (après une vérification élémentaire des en-têtes requis par exemple) de la requête HTTP dans la Liste 47.

    Voir Tableau 3 pour les en-têtes HTTP requis dans une réponse.

    # Listing 48
    HTTP/1.1 202 Accepted
    Content-Type: application/vnd.interoperability.transfers+json;version=1.0
    

    Liste 48 -- Réponse synchrone à la demande de transfert


    # Envoi de la demande de transfert depuis le Switch : Étape 16 du flux de bout en bout

    Lorsque le Switch a reçu la demande de transfert dans la Liste 47 et envoyé la réponse synchrone dans la Liste 48, il doit réserver le transfert du compte de BankNrOne vers le compte de MobileMoney au sein du Switch. Après succès de la réservation, le Switch relaie quasiment la même requête que dans la Liste 47 au FSP MobileMoney, à l’exception de l’élément expiration qui doit être réduit, comme expliqué dans Timeout and Expiry. La Liste 49 montre la requête HTTP avec l’expiration réduite de 30 secondes par rapport à la Liste 47. Le FSP MobileMoney doit alors répondre de façon synchrone avec la même réponse qu’en Liste 48.

    # Listing 49
    POST /transfers HTTP/1.1
    Accept: application/vnd.interoperability.transfers+json;version=1
    Content-Type: application/vnd.interoperability.transfers+json;version=1.0
    Content-Length: 1820
    Date: Tue, 15 Nov 2017 10:14:01 GMT
    FSPIOP-Source: BankNrOne
    FSPIOP-Destination: MobileMoney
    {
        "transferId":"11436b17-c690-4a30-8505-42a2c4eafb9d",
        "payerFsp":"BankNrOne",
        "payeeFsp": "MobileMoney",
        "amount": {
            "amount": "99",
            "currency": "USD"
        },
        "expiration": "2017-11-15T11:16:31.663+01:00",
        "ilpPacket": "AQAAAAAAACasIWcuc2UubW9iaWxlbW9uZXkubXNpc2RuLjEyMzQ1Njc4OY-
    IEIXsNCiAgICAidHJhbnNhY3Rpb25JZCI6ICI4NWZlY-
    WMyZi0zOWIyLTQ5MWItODE3ZS00YTAzMjAzZDRmMTQiLA0KICAgICJxdW90ZUlkIjogIjdjMjNlOD-
    BjLWQwNzgtNDA3Ny08MjYzLTJjMDQ3ODc2ZmNmNiIsDQogICAgInBheWVlIjogew0KICAgICAgI-
    CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiTVNJU0ROIiwNCiAgI-
    CAgICAgICAgICJwYXJ0eUlkZW50aWZpZXIiOiAiMTIzNDU2Nzg5IiwNCiAgICAgICAgI-
    CAgICJmc3BJZCI6ICJNb2JpbGVNb25leSINCiAgICAgICAgfSwNCiAgICAgI-
    CAgInBlcnNvbmFsSW5mbyI6IHsNCiAgICAgICAgICAgICJjb21wbGV4TmFtZSI6IHsNCiAgICAgICAgI-
    CAgICAgICAiZmlyc3ROYW1lIjogIkhlbnJlayIsDQogICAgICAgICAgICAgICAgImxhc3ROYW1lIjogIk-
    thcmxzc29uIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICAicGF5ZXIi-
    OiB7DQogICAgICAgICJwZXJzb25hbEluZm8iOiB7DQogICAgICAgICAgICAiY29tcGxleE5hbWUi-
    OiB7DQogICAgICAgICAgICAgICAgImZpcnN0TmFtZSI6ICJNYXRzIiwNCiAgICAgICAgICAgICAgI-
    CAibGFzdE5hbWUiOiAiSGFnbWFuIg0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgI-
    CAicGFydHlJZEluZm8iOiB7DQogICAgICAgICAgICAicGFydHlJZFR5cGUiOiAiSUJBTiIsDQogICAgI-
    CAgICAgICAicGFydHlJZGVudGlmaWVyI-
    jogIlNFNDU1MDAwMDAwMDA1ODM5ODI1NzQ2NiIsDQogICAgICAgICAgICAiZnNwSWQiOiAiQmFua05yT25
    lIg0KICAgICAgICB9DQogICAgfSwNCiAgICAiYW1vdW50Ijogew0KICAgICAgICAiYW1vdW50IjogIjEw-
    MCIsDQogICAgICAgICJjdXJyZW5jeSI6ICJVU0QiDQogICAgfSwNCiAgICAidHJhbnNhY3Rpb25UeXBlI-
    jogew0KICAgICAgICAic2NlbmFyaW8iOiAiVFJBTlNGRVIiLA0KICAgICAgICAiaW5pdGlhdG9yI-
    jogIlBBWUVSIiwNCiAgICAgICAgImluaXRpYXRvclR5cGUiOiAiQ09OU1VNRVIiDQogICAgfSwNCiAgI-
    CAibm90ZSI6ICJGcm9tIE1hdHMiDQp9DQo\u003d\u003d",
    "condition": "fH9pAYDQbmoZLPbvv3CSW2RfjU4jvM4ApG_fqGnR7Xs"
    }
    

    Liste 49 -- Requête de transfert de BankNrOne à MobileMoney avec expiration réduite

    Remarque : L’élément ilpPacket dans la Liste 49 devrait être sur une seule ligne dans une vraie implémentation ; il est affiché ici avec des sauts de ligne pour montrer toute la valeur.


    # Réalisation du transfert dans FSP MobileMoney : Étape 17 du flux de bout en bout

    Lorsque le FSP MobileMoney a reçu la requête de transfert dans la Liste 47, il doit effectuer le transfert comme décrit dans la précédente demande de devis, ce qui signifie que 100 USD doivent être transférés sur le compte de Henrik Karlsson, dont 99 USD depuis le compte Switch préfinancé et 1 USD depuis un compte commission FSP.

    Comme preuve de réalisation de la transaction, le FSP MobileMoney récupère alors le fulfilment stocké (Liste 43) depuis la base de données (enregistré lors de la Détermination des frais et de la commission FSP dans MobileMoney) et le place dans l’élément fulfilment du callback PUT /transfers/{ID}. Le champ transferState est positionné à COMMITTED et completedTimestamp à la date de réalisation de la transaction ; voir Liste 50 pour la requête complète.

    En même temps, une notification est envoyée au bénéficiaire Henrik Karlsson pour l’informer qu’il a reçu 100 USD de Mats Hagman.

    La manière dont est envoyée la notification est hors du périmètre de cette API.

    Voir Tableau 1 pour les en-têtes HTTP requis dans une requête, et PUT /transfers/{ID} pour plus d’infos sur le callback. L’ID dans l’URI doit être celui présent dans la demande de transfert, qui est dans l’exemple 11436b17-c690-4a30-8505-42a2c4eafb9d. Dans le callback, l’en-tête Accept ne doit pas être envoyé. Les en-têtes HTTP FSPIOP-Destination et FSPIOP-Source sont maintenant inversés par rapport à la requête HTTP en Liste 47, comme détaillé dans Routage des flux d’appels avec FSPIOP Destination et FSPIOP Source.

    # Listing 50
    PUT /transfers/11436b17-c690-4a30-8505-42a2c4eafb9d HTTP/1.1
    Content-Type: application/vnd.interoperability.transfers+json;version=1.0
    Content-Length: 166
    Date: Tue, 15 Nov 2017 10:14:02 GMT
    FSPIOP-Source: MobileMoney
    FSPIOP-Destination: BankNrOne
    {
        "fulfilment": "mhPUT9ZAwd-BXLfeSd7-YPh46rBWRNBiTCSWjpku90s",
        "completedTimestamp": "2017-11-16T04:15:35.513+01:00",
        "transferState": "COMMITTED"
    }
    

    Liste 50 -- Callback pour la demande de transfert

    La Liste 51 montre la réponse HTTP synchrone dans laquelle le Switch accuse immédiatement réception (après vérification basique des en-têtes requis par exemple) après avoir reçu le callback de la Liste 50.

    Voir Tableau 3 pour les en-têtes HTTP requis dans une réponse HTTP.

    # Listing 51
    HTTP/1.1 200 OK
    Content-Type: application/vnd.interoperability.transfers+json;version=1.0
    

    Liste 51 -- Réponse synchrone au callback de transfert


    # Réception de la notification de transaction par le bénéficiaire : Étape 18 du flux de bout en bout

    Le bénéficiaire Henrik Karlsson reçoit la notification de transaction et est ainsi informé du succès de la transaction.


    # Réalisation du transfert dans le Switch : Étape 19 du flux de bout en bout

    Lorsque le Switch a reçu le callback de la Liste 50 et envoyé la réponse synchrone de la Liste 51, il doit valider le fulfilment, effectuer le transfert réservé antérieurement et relayer exactement le même callback que dans la Liste 50 au FSP BankNrOne. BankNrOne doit alors répondre de façon synchrone avec la même réponse que dans la Liste 51.

    La validation du fulfilment se fait en calculant le hash SHA-256 du fulfilment et en s’assurant que le hash est égal à la condition reçue lors de la demande de transfert.

    La requête et la réponse HTTP ne sont pas répétées ici car elles sont identiques à la section précédente, mais cette fois envoyées du Switch vers BankNrOne (requête HTTP de la Liste 50) puis de BankNrOne vers le Switch (réponse HTTP de la Liste 51).


    # Réalisation du transfert dans FSP BankNrOne : Étape 20 du flux de bout en bout

    Quand le FSP BankNrOne a reçu le callback de la Liste 50 et envoyé la réponse synchrone de la Liste 51, il doit valider le fulfilment (voir Section 10.4.16), puis effectuer le transfert réservé précédemment.

    Une fois le transfert réservé effectué, le payeur Mats Hagman doit être notifié du succès de la transaction. La façon dont la notification est envoyée est hors du champ de cette API.

    # Réception de la notification de transaction par le payeur : Étape 21 du flux de bout en bout

    Le payeur Mats Hagman reçoit la notification de transaction et est ainsi informé du succès de la transaction.

    1 http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm (opens new window) -- Transfert de Représentation d’État (REST)

    2 https://tools.ietf.org/html/rfc4122 (opens new window) -- Espace de noms UUID (Identifiant Unique Universel)

    3 https://tools.ietf.org/html/rfc7230 (opens new window) -- Hypertext Transfer Protocol (HTTP/1.1): Syntaxe des messages et routage

    4 https://tools.ietf.org/html/rfc5246 (opens new window) -- Le protocole TLS (Transport Layer Security) – Version 1.2

    5 https://tools.ietf.org/html/rfc3986 (opens new window) -- Uniform Resource Identifier (URI) : Syntaxe générique

    6 https://tools.ietf.org/html/rfc7230#section-2.7.3 (opens new window) -- HTTP/1.1 : Normalisation et comparaison des URI http et https

    7 https://tools.ietf.org/html/rfc3629 (opens new window) -- UTF-8, un format de transformation d’ISO 10646

    8 https://tools.ietf.org/html/rfc7159 (opens new window) -- Format d’échange de données JSON

    9 https://tools.ietf.org/html/rfc7230#section-3.2 (opens new window) -- HTTP/1.1 : Champs d’en-tête

    10 https://tools.ietf.org/html/rfc7231#section-5.3.2 (opens new window) -- HTTP/1.1 : Accept

    11 https://tools.ietf.org/html/rfc7230#section-3.3.2 (opens new window) -- HTTP/1.1 : Content-Length

    12 https://tools.ietf.org/html/rfc7231#section-3.1.1.5 (opens new window) -- HTTP/1.1 : Content-Type

    13 https://tools.ietf.org/html/rfc7231#section-7.1.1.2 (opens new window) -- HTTP/1.1 : Date

    14 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For (opens new window) -- X-Forwarded-For

    15 https://tools.ietf.org/html/rfc7239 (opens new window) -- Extension HTTP Forwarded

    16 https://tools.ietf.org/html/rfc7230#section-3.3.2 (opens new window) -- HTTP/1.1 : Content-Length

    17 https://tools.ietf.org/html/rfc7231#section-3.1.1.5 (opens new window) -- HTTP/1.1 : Content-Type

    18 https://tools.ietf.org/html/rfc7231#section-4 (opens new window) -- HTTP/1.1 : Méthodes de requête

    19 https://tools.ietf.org/html/rfc7231#section-6 (opens new window) -- HTTP/1.1 : Codes d’état de réponse

    20 https://tools.ietf.org/html/rfc7231#section-6.4 (opens new window) -- HTTP/1.1 : Redirection 3xx

    21 https://tools.ietf.org/html/rfc7231#section-6.6 (opens new window) -- HTTP/1.1 : Erreur serveur 5xx

    22 https://tools.ietf.org/html/rfc7231#section-6.5.6 (opens new window) -- HTTP/1.1 : 406 Non Acceptable

    23 https://tools.ietf.org/html/rfc7231#section-5.3.2 (opens new window) -- HTTP/1.1 : Accept

    24 https://interledger.org/rfcs/0011-interledger-payment-request/ (opens new window) -- Demande de paiement Interledger (IPR)

    25 https://interledger.org/ (opens new window) -- Interledger

    26 https://interledger.org/interledger.pdf (opens new window) -- Un protocole pour les paiements Interledger

    27 https://interledger.org/rfcs/0001-interledger-architecture/ (opens new window) -- Architecture Interledger

    28 https://interledger.org/rfcs/0015-ilp-addresses/ (opens new window) -- Adresses ILP

    29 https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.696-201508-I!!PDF-E&type=items (opens new window) -- Règles d’encodage ASN.1 : Spécification des Octet Encoding Rules (OER)

    30 https://perldoc.perl.org/perlre.html#Regular-Expressions (opens new window) -- perlre - Expressions régulières Perl

    31 https://tools.ietf.org/html/rfc7159#section-7 (opens new window) -- JSON : Chaînes

    32 http://www.unicode.org/ (opens new window) -- Le consortium Unicode

    33 https://www.iso.org/iso-8601-date-and-time-format.html (opens new window) -- Format de date et d’heure - ISO 8601

    34 https://tools.ietf.org/html/rfc4122 (opens new window) -- Espace de noms UUID (Identifiant Unique Universel)

    35 https://tools.ietf.org/html/rfc4648#section-5 (opens new window) -- Encodages Base16, Base32 et Base64 - Base64 compatible URL et nom de fichier

    36 https://www.iso.org/iso-4217-currency-codes.html (opens new window) -- Codes de devises - ISO 4217

    37 https://www.itu.int/rec/T-REC-E.164/en (opens new window) -- E.164 : Plan international de numérotation téléphonique publique

    38 https://tools.ietf.org/html/rfc3696 (opens new window) -- Techniques d’application pour la vérification et la transformation des noms

    39 https://tools.ietf.org/html/rfc7231#section-6.5 (opens new window) -- HTTP/1.1 : Erreur client 4xx