# 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.y oĂč x 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} oĂč {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