Logo Blue Finalse
Console 
  Français   English


C#


  • DÉMARRER
  • Authentification
  • Hello World
  • Tarification
  • Rate Limit
  • CAS D'UTILISATION
  • Intégration UI FPay
  • Intégration UI personalisé
  • Interopérabilité  New
  • Liens et QRCodes de Paiement
  • Argent des tiers  New
  • Audit & Tableau de bord  New
  • REFÉRENCES
  • Attempt
  • AuthAccess
  • Deposit
  • FundRequest
  • QuasiTransfer
  • Transaction
  • Transfer
  • Wallet
Logo Blue FinalseLogo Blue Finalse
Javascript
Console 
  Français   English
  • DÉMARRER
  • Authentification
  • Hello World
  • Tarification
  • Rate Limit
  • CAS D'UTILISATION
  • Intégration UI FPay
  • Intégration UI personalisé
  • Interopérabilité  New
  • Liens et QRCodes de Paiement
  • Argent des tiers  New
  • Audit & Tableau de bord  New
  • REFÉRENCES
  • Attempt
  • AuthAccess
  • Deposit
  • FundRequest
  • QuasiTransfer
  • Transaction
  • Transfer
  • Wallet

Gérez vous de l'argent pour le compte de tiers ?

Contexte  

Gérez vous de l'argent pour le compte d'autres personnes ? ou d'autres entreprises ? Vous souhaiteriez que chacun de vos clients possède son propre compte avec son propre historique de transactions ? Vous souhaiteriez également effectuer une séparation stricte entre votre argent d'une part et l'argent de vos clients d'autre part ? Vous voulez avoir la possibilité de fournir à chaque client un relevé des transactions survenues le concernant sur une période donnée ? 1 mois, 1 semaine ou 1 jour par exemple ?

En Détails  

Avec FPay, vous avez la possibilité de créer des Wallet. Signifiant littéralement "portefeuille" en anglais, chaque Wallet  est comme un compte que vous pouvez alimenter et utiliser. Les transferts d'argent entre  Wallet que vous possédez sont gratuits.
Si vous gérez de l'argent pour plusieurs clients, vous devez créer un Wallet pour chaque client, et lors de chaque opération vous devez préciser celui à utiliser pour la transaction en cours.
Ainsi, lorsque vous ajoutez de l'argent sur votre compte FPay avec un Deposit ou une FundRequest, vous avez la possibilité choisir quel sera le Wallet sur lequel sera déposé l'argent ainsi ajouté.
C'est la manière idéale pour exprimer la chose suivante: Le client numéro 12 vient d'ajouter de l'argent sur son Wallet . Si vous préférez, lors de l'entrée d'argent, vous pouvez déposer cet argent sur votre Wallet principal puis éffectuer un transfer depuis ce Wallet principal vers le Wallet du client pour qui l'entrée d'argent a lieu en prenant au passage une commission si nécessaire.
Par exemple, vous initiez un Deposit pour recevoir 10 000₣ pour un client. Vous décidez de déposer cet argent sur votre portefeuille principal. Puis vous transférez 9 950 ₣ sur le Wallet de votre client en question en gardant votre commission de 50₣ au passage.

De même, lors de toute sortie d'argent avec un Transfer ou un QuasiTransfer, vous avez la possibilité de préciser de quel Wallet l'argent sera prélevé.
C'est la manière idéale pour exprimer la chose suivante: Le client numéro 19 vient de retirer de l'argent de son Wallet . Si vous préférez, vous pouvez retirer de l'argent de votre Wallet principal puis éffectuer un transfer depuis le Walletde votre client vers le votre en prenant au passage une commission si nécessaire.
Par exemple, vous initiez un Transfer pour envoyer 10 000₣ à quelqu'un de la part de votre client. Vous pouvez décider de retirer cet argent de votre portefeuille principal pour le transférer puis vous retirez 10 050 ₣ du Wallet de votre client en question en gardant votre commission de 50₣ au passage.

À la fin du mois, il vous est possible de lister l'ensemble des Transaction survenues sur un Wallet donné pour présenter un récapitulatif.

Information
Si vous gérez de l'argent pour le compte de tiers, et si cette tierce personne souhaite avoir le contrôle sur son argent, vous pouvez demander à votre client de créer son compte FPay et de vous fournir des clés d'API avec des permissions réduites telles que money-in-only,  read/money-in,  ou read-write/no-money-out comme expliqué  sur la page d'Authentification.

Pré Requis  

Javascript
Ce SDK nécessite
Node >=9.5

Authentification
Nous supposons que vous avez bien évidemment ouvert votre compte FPay et que vous êtes en possession de votre  token et de votre secretKey  obtenus lors de la creation de l'objet AuthAccess comme expliqué  sur la page d'Authentification.

Initialisation  

Important
Le champ secretKey de l'objet AuthAccess doit voir sa valeur absolument tenue sécrète et utilisée sur vos serveurs uniquement. Il ne sera jamais transmis lors des échanges avec les server-urs de FPay.
Garder cette valeur secrète à votre niveau implique notamment de ne jamais utiliser la valeur de ce champ comme valeur de variable ou de constante dans le code source d'une application mobile, d'une application web ou dans le code source de toute application dont le binaire pourra être public et visible à tous. Il existe de nombreux outils permettent d'accéder aux chaines de caractères présentes dans le code source à partir d'un binaire. 
  • NPM
  • Yarn
npm install @finalse/sdk-node
yarn add @finalse/sdk-node
const fPay = sdk.FPayClient(sdk.Auth({token: '<token>', secretKey: '<secretKey>' }));

Implémentation  

Créer des Wallets  

const walletPromise = 
    fPay.wallet.create({
        name: "Magasin Yopougon"
    });
const walletPromise = 
    fPay.wallet.create({
        name: "Magasin Cocody"
    });
const walletPromise = 
    fPay.wallet.create({
        name: "Magasin San-Pedro"
    });
const walletPromise = 
    fPay.wallet.create({
        name: "Compte Entreprise #1"
    });
const walletPromise = 
    fPay.wallet.create({
        name: "Compte Entreprise #2"
    });
const walletPromise = 
    fPay.wallet.create({
        name: "Compte Entreprise #3"
    });

Entrée d'argent sur un Wallet  

Destination  

Lors de toute entrée d'argent sur votre compte, les fonds recupérés seront déposés sur votre  Wallet  principal par défaut. Parce qu'il vous est possible de créer plusieurs  Wallet  additionnels, il vous est également possible choisir la destination des fonds une fois que l'utilisateur aura payé.
Ainsi, vous pouvez posséder un  Wallet  pour votre épargne ou bien un  Wallet  par magasin si vous avez plusieurs magasins et choisir où iront les fonds reçus.

Comment ça marche ?

Pour spécifier la destination des fonds, il vous faut le MARS du  Wallet , accessible via le champ mars.alpha
Par exemple si le MARS du Wallet  est "CI FPay W09POT", alors vous devriez entrer le code suivant :

const depositPromise = 
    fPay.deposit.initiate({
        destination: "CI FPay W09POT",
        source: {
            _type: "Single",
            account: {
                country: "CI",
                identifier: "+2250100000000",
                providerKey: "MoovMoney"
            }
        },
        amount: {
            currency: "XOF",
            value: "10_000"
        }
    });

Transférer de l'argent entre Wallets  

Vous avez la possibilité d'éffectuer des mouvements entre tout Wallet que vous possédez. Ainsi, vous pouvez retirer de l'argent de votre Wallet pour le déposer sur celui de votre utilisateur et inversement. Ces mouvements de comptes peuvent même correspondre à des utilisateurs que vous avez qui se payent entre eux.
Aussi, si dans le cadre de votre activité, vous êtes amené à recevoir des cautions de la part de vos utilisateurs, vous pouvez stocker cette caution sur leurs Wallet respectifs. Plus tard, vous pouvez déduire de cette caution les montants correspondant à des infractions qu'ils ont eu à faire en effectuant un Transfer vers votre Wallet ou bien, si aucune infraction n'a été commise, vous pouvez initier un remboursement vers leurs portefeuille mobile money directement depuis leurs Wallet : Les possibilités sont infinies et votre choix dépendra de votre activité.

Comment ça marche ?

Imaginons que vous possédez un Wallet dont le MARS est "CI FPay MPO099R" et un autre Wallet  dont dont le MARS est  "CI FPay MOY67RT". Pour transférer de l'argent du premier Wallet vers le second, vous devez faire le code suivant:

const transferPromise = 
    fPay.transfer.initiate({
        amount: "10_000 XOF",
        source: "CI FPay MPO099R",
        destination: "CI FPay MOY67RT"
    });

Sortie d'argent depuis un Wallet  

Lors de toute sortie d'argent, les fonds envoyés seront prélevés sur votre  Wallet  principal par défaut. Si la sortie d'argent se fait pour un client spécifique, parce que vous avez la possibilité d'indiquer à FPay le  Wallet  à partir duquel l'argent doit être prelevé pour cette sortie d'argent, vous pouvez spécifier le Wallet du client concerné par cette sortie d'argent, peu importe si cette sortie d'argent est faite via un objet Transfer ou un objet QuasiTransfer.

Comment ça marche ?

Pour spécifier la source des fonds, il vous faut le MARS du  Wallet , accessible via le champ mars.alpha
Par exemple si le MARS du Wallet  est "CI FPay W09POT", alors vous devriez entrer le code suivant :

Transfer
const transferPromise = 
    fPay.transfer.initiate({
        amount: {
            currency: "XOF",
            value: "10_000"
        },
        source: "CI FPay W09POT",
        destination: {
            _type: "Single",
            account: {
                country: "CI",
                identifier: "+2250100000000",
                providerKey: "MoovMoney"
            }
        }
    });
QuasiTransfer
const quasiTransferPromise = 
    fPay.quasiTransfer.initiate({
        amount: {
            currency: "XOF",
            value: "10_000"
        },
        source: "CI FPay W09POT"
    });

Établir un relevé des Transactions  

Supposons que nous sommes le 27 Octobre (27/10) et que nous souhaiterions établir pour un client un relevé des Transaction survenues sur son Wallet depuis le 1er du mois jusqu'à ce jour.
Le résultat pourrait se presenter comme sur la figure suivante :

DATEDETAILSDEBITCREDITSOLDE AVANTSOLDE APRÈS
04/10Dépôt depuis le 07 00 00 00 00+ 13 000 ₣150 000 ₣163 000 ₣
05/10Dépôt depuis le 07 00 00 00 00+ 7 000 ₣163 000 ₣170 000 ₣
06/10Frais de gestion- 500 ₣170 000 ₣169 500 ₣
07/10Retrait vers le 05 00 00 00 00- 10 000 ₣169 500 ₣159 500 ₣
20/10Bonus Fidélité+ 1 000 ₣159 500 ₣160 500 ₣
Solde au 01/10
+ 150 000 ₣
Total Credit
+ 21 000 ₣
Total Debit
- 10 500 ₣

Solde au 27/10
+ 160 500 ₣

Nous allons voir comment construire ce tableau précédent pour chacun de vos clients

Un mot sur l'objet Transaction

Chaque fois qu'un changement intervient sur le solde d'un Wallet, un objet Transaction est créé pour matérialiser ce mouvement d'argent. Que ce changement de solde soit du à un Transfer, à un Deposit ou à tout autre objet, un objet Transaction sera créé.
Ainsi, pour réaliser le tableau précédent, voici les champs de l'objet Transaction qui vont nous être utile:

  •   amount
    Ayant une valeur toujours positive, ce champ représente le montant qui a été ajouté ou retiré du Wallet considéré.
  •   dc
    Abbréviation pour debit ou credit, ce champ indique si le montant précédent à été ajouté ou retiré du Wallet considéré.
    Les 2 valeurs possibles de ce champ sont "Debit" ou "Credit".
    Si la valeur est "Debit", alors le montant qui est toujours positif a été retiré du Wallet.
    Si la valeur est "Credit", alors le montant qui est toujours positif a été ajouté au Wallet.
  •   wallet
    Ce champ est un indicateur de l'état du Wallet cible sur lequel la Transaction à eu lieu. C'est notamment avec ce champ qu'il sera possible d'accéder au solde avant ainsi qu'au solde après la Transaction.
  •   status
    Ce champ indique si la transaction à réussie ou échouée. Les 2 valeurs possibles de ce champ sont Successful ou Failure.
    Veuillez noter qu'il ne s'agit pas de string, ce sont des objets. Par exemple l'objet Failure possède un champ isCancelled qui permet de savoir si la transaction a échoué parce qu'elle a été annulée.
  •   parent
    Ce champ indique l'objet parent dont l'exécution a entrainé la création de cette Transaction. Ce parent peut donc être un objet Transfer, Deposit, QuasiTransfer etc...
  •   details
    Ce champ, si il est disponible, permettra d'accéder à l'id de la transaction généré par l'opérateur si cette transaction concerne une opération entre FPay et l'extérieur (Mtn Money, Orange Money ou Moov Money).
Concernant les champs dc, status et parent
Les valeurs de ces champs ont été modélisées comme étant des  ADT (Type algébrique de données)  , concept issu de la théorie des types et de la  programmation fonctionnelle . Parce que nos SDKs ont été conçus pour vous en simplifier l'utilisation, chaque fois que vous aurez un type dont la valeur est définie par un "OU" (Par exemple, le champ  status a comme valeur Successful OU Failure), dites vous qu'il existera des fonctions pour vous permettre d'utiliser ces valeurs de manière optimale.
Ainsi, dans le cas du champ status, vous aurez par exemple une fonction  isSuccessful(), une fonction  isFailure(), d'autres fonctions ainsi que la fonction fold .

Implémentation

Maintenant que le décor est planté, nous allons :

  • Lister toutes les Transaction réussies durant le mois en cours pour le Wallet de l'utilisateur concerné. Supposons que le Wallet de l'utilisateur considéré possède comme id la valeur   123456789.
  • Extraire pour chaque Transaction les informations requises pour construire le tableau.

Lister toutes les Transaction réussies durant le mois en cours
const transactionsCollectionPromise = 
    fPay.transaction.list({
        filter: "status = 'Successful'"
                + " AND createdTime in CurrentMonth"
                + " AND wallet.id = '123456789'",
        sortBy: "createdTime:ASC"
    });
//  Access items in the returned collection, page per page
let transactionsCollection = await transactionsCollectionPromise;
let allTransactions = transactionsCollection.toArray();
while(transactionsCollection.hasNextPage()){
    transactionsCollection = 
        await fPay.transaction.fetchPage(transactionsCollection.pagination.nextPage);
    const transactions = transactionsCollection.toArray();
    allTransactions = allTransactions.concat(transactions);
}
Extraire pour chaque Transaction les informations requises pour construire le tableau
let debitTransactionsAmount = [];
let creditTransactionsAmount= [];
for (const transaction of allTransactions) {
    const date = new Date(transaction.createdTime.iso8601); 
    const dayOfMonth = date.getDate(); 
    const month = date.getMonth(); 
    const details = transaction.h1.fr; 
    const beforeBalance = transaction.wallet.before.balance.available; 
    const afterBalance = transaction.wallet.after.balance.available; 
    let debitAmount = null;
    if(transaction.dc.isDebit()){
        // amount is always positive so we have to negate the value for debit 
        debitAmount = -transaction.amount.value;
        debitTransactionsAmount.push(debitAmount); 
    }
    let creditAmount = null;
    if(transaction.dc.isCredit()){
        creditAmount = transaction.amount.value; 
        creditTransactionsAmount.push(creditAmount); 
    }
    
    // Here we have extracted the most of required values, you can
    // do the stuff with them inside the loop
}
const firstTransaction: Transaction = allTransactions[0];
const lastTransaction: Transaction  = allTransactions[allTransactions.length-1];

// Finally the values for summary 
const initialBalance = firstTransaction.wallet.before.balance.available
const endBalance = lastTransaction.wallet.after.balance.available
const totalDebits = debitTransactionsAmount.reduce((sum, el) => sum + el, 0);
const totalCredits = creditTransactionsAmount.reduce((sum, el) => sum + el, 0);

// Congratulation 🎉🥳👏
// At this point, you can create a beautiful PDF or HTML Table for your user 🥂👏🍾

Aller plus loin  

Foreign ID  

Lors de la création de l'objet Wallet , il vous est possible d'attacher votre propre ID interne à votre système. Ainsi, plus tard, lors de la recupération de l'objet Wallet , vous pourrez utiliser votre propre ID au lieu de l' id  qui sera généré par FPay. L'ID que vous soumettez doit être unique pour chaque type d'objet.
Un des avantages de soumette votre propre identifiant unique est de pouvoir éffectuer des requêtes idempotentes. En effet, si votre foreignId soumis est unique, alors vous êtes protegé contre les duplications dues au réseaux par exemple et vous contrôlerez les retry sans trembler ni risquer de répéter plusieurs fois la même opération.

Pour la création
const walletPromise = 
    fPay.wallet.create({
        foreignId: "<my internal id>"
    });
Pour la récupération

Avec le code précédent, vous avez désormais le droit de faire le code suivant lors de la recupérationde l'objet Wallet .

const walletPromise = fPay.wallet.get("<my internal id>");

Foreign Data  

Lors de la création de l'objet Wallet , il vous est possible d'ajouter des données qui vous sont propres et qui vous permettront de "tagguer" l'objet créé.
Vous pourrez par exemple ajouter les données suivantes :

  •   {"myKey": 19, "myOtherKey": "myOtherValue"}
  •   <xml><myKey>myValue</myKey></xml>
  •   myValue1, myValue2, myValue3
  •  Toute chaine de caractères que vous souhaitez à partir du moment celle ci n'excède pas 255 caractères.
Ces données seront presentes chaque fois que cet objet sera recupéré.

Lors de la création
const walletPromise = 
    fPay.wallet.create({
        foreignData: "<xml><myKey>myValue</myKey></xml>"
    });
Lors de toute récupération
const walletPromise = fPay.wallet.get("<wallet.id | foreignId>");
walletPromise.then(wallet => {
   // Inspect the 'foreignData' field of the Wallet ... 
   const xmlData = wallet.foreignData;
   // xmlData = "<xml><myKey>myValue</myKey></xml>" 
});
ARGENT DES TIERS
  • Contexte
  • En Détails
  • Pré Requis
  • Initialization
  • Implémentation
    • Initialisation
    • Créer des Wallets
    • Entrée d'argent sur Wallet
    • Transfert d'argent entre Wallets
    • Sortie d'argent depuis Wallet
    • Historique des Transactions
  • Allez plus loin
    • Foreign ID
    • Foreign Data