Vous souhaitez encaissez un client à distance. Vous voulez lui envoyer un lien pour qu'il puisse vous envoyer de l'argent.
Vous souhaitez envoyer de l'argent à quelqu'un ET vous voulez le laisser remplir lui même les informations requises pour recupérer son argent. Vous lui envoyez donc un lien pour qu'il rentre son numéro de téléphone afin de récupérer son argent.
Pour recevoir de l'argent via un lien de paiement, vous devez créer un object FundRequest
qui matérialise une demande de fonds, un encaissement. Cet objet contient un lien d'encaissement ainsi qu'un Qr Code qu'il est possible de scanner juste en utilisant l'appareil photo d'un smartphone. Une fois que vous transmettrez ce lien à votre utilisateur, ou que vous lui présenterez le QRCode, celui ci arrivera sur une page l'invitant à payer comme illustré sur la figure suivante :
Pour envoyer de l'argent via un lien de paiement, vous devez créer un object QuasiTranfer
qui matérialise un envoi de fonds à completer d'où le nom "Quasi Transfert". En effet, vous exprimez la chose suivante à votre utilisateur: Je vous ai envoyé de l'argent, entrez le numéro mobile money de votre choix pour le recupérer afin de completer le transfert.
Cet objet QuasiTranfer
contient un lien de recupération ainsi qu'un Qr Code qu'il est possible de scanner juste en utilisant l'appareil photo d'un smartphone. Une fois que vous transmettrez ce lien à votre utilisateur, ou que vous lui présenterez le QRCode, celui ci arrivera sur une page l'invitant à recupérer son argent comme illustré sur la figure suivante :
Dans la section suivante, nous allons voir des exemples de code précisant concretement comment faire pour avoir accès de manière programmatique aux liens ainsi qu'aux QrCodes d'envoi et de recupération.
AuthAccess
comme expliqué sur la page d'Authentification.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.const fPay = sdk.FPayClient(sdk.Auth({token: '<token>', secretKey: '<secretKey>' }));
const fundRequestPromise =
fPay.fundRequest.create({
amount: "100_000 XOF",
h1: "Location 4X4 avec chauffeur"
});
// Access the payment link
const paymentLink = fundRequest.securePay.link;
// Access the QRCode image url
const qrCodeLink = fundRequest.securePay.qrCode.src;
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
amount: "10_000 XOF",
h1: "Remboursement Chauffeur"
});
// Access the payment link
const paymentLink = quasiTransfer.securePay.link;
// Access the QRCode image url
const qrCodeLink = quasiTransfer.securePay.qrCode.src;
Il est possible de spécifier lors de la création des objets QuasiTransfer
et FundRequest
une date à laquelle l'expiration aura lieu.
Concernant l'objet FundRequest
, Ceci peut être utile par exemple si vous faites des offres promotionelles et que le paiement que s'apprête à faire l'utilisateur correspond à une offre limitée.
Cela peut être également utile si vous demandez à l'utilisateur un paiement pour une réservation : Vous réservez l'objet à vendre le temps que l'utilisateur fasse son paiement. Passé le délai d'expiration, si l'utilisateur n'a pas éffectué de paiement, cet objet re-devient disponible pour un autre client potentiel.
Dans le cas de l'objet QuasiTransfer
, cela peut être utile car lors de sa création, l'argent à transférer est verrouillé et vous est désormais inaccessible. Après une longue période, si l'utilisateur n'a pas recupéré son argent, cet argent sera remis à votre disposition automatiquement.
<after><space><$number><$timeUnit>
<on><space><$iso8601Datetime>
never
FundRequest
, La valeur never
est la valeur par defaut si aucune valeur n'est précisée.QuasiTransfer
, La valeur 24h
est la valeur par defaut si aucune valeur n'est précisée."after 15m"
"after 90s"
"after 1h"
"after 2d"
"after 1w"
"on 2028-05-19T01:13Z"
"on 2028-05-19"
"on 15:30"
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
amount: {
currency: "XOF",
value: "10_000"
},
expire: "after 45m"
});
const fundRequestPromise =
fPay.fundRequest.create({
amount: {
currency: "XOF",
value: "10_000"
},
expire: "after 45m"
});
Lors de la création des objets QuasiTransfer
et FundRequest
, si vous spécifiez le champ h1
, la valeur saisie sera affichée à votre utilisateur comme motif de la transaction. Il est possible de spécifier une valeur en Français et une valeur en Anglais lors de la création des objets QuasiTransfer
et FundRequest
.Ainsi, L'utilisateur aura la possibilité de changer de langue et la langue par defaut affichée sera celle de son navigateur: Si vous vendez à un client anglophone, le texte saisi en Anglais s'affichera automatiquement.
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
h1: {
fr: "Paiement panier #12",
en: "Shopping cart payment #12"
},
amount: {
currency: "XOF",
value: "10_000"
}
});
const fundRequestPromise =
fPay.fundRequest.create({
h1: {
fr: "Paiement panier #12",
en: "Shopping cart payment #12"
},
amount: {
currency: "XOF",
value: "10_000"
}
});
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.
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 fundRequestPromise =
fPay.fundRequest.create({
destination: "CI FPay W09POT",
amount: {
currency: "XOF",
value: "10_000"
}
});
Lors de toute sortie d'argent depuis votre compte, les fonds envoyés seront prélevé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 source des fonds à envoyer.
Ainsi, vous pouvez posséder un Wallet
pour votre épargne ou bien un Wallet
par magasin si vous avez plusieurs magasins et choisir d'où seront prélevés les fonds à transmettre.
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 :
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
source: "CI FPay W09POT",
amount: {
currency: "XOF",
value: "10_000"
}
});
Par défaut, les frais liées aux transactions sont payés par votre client. Il vous est possible de spécifier qui les paye pour changer ce comportement par défaut suivant les situations que vous aurez à gérer.
Par exemple, supposons que vous voulez éffectuer une entrée d'argent sur votre compte FPay d'un montant de 10 000 ₣
. La question que vous devez vous poser est la suivante Combien doit sortir du compte de mon utilisateur ? si la réponse est 10 000 ₣
, alors c'est vous qui payez les frais.
Vous pouvez également vous poser la question dans l'autre sens : Combien doit arriver sur mon compte FPay ? si la réponse est 10 000 ₣
, alors c'est votre utilisateur qui payera les frais.
Pour spécifier qui paye les frais, 4 Valeurs sont possibles :
"Me"
"CounterPart"
"Sender"
"Receiver"
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
fees: {
payer: "CounterPart"
},
amount: {
currency: "XOF",
value: "10_000"
}
});
const fundRequestPromise =
fPay.fundRequest.create({
fees: {
payer: "CounterPart"
},
amount: {
currency: "XOF",
value: "10_000"
}
});
Lors de la création des objets QuasiTransfer
et FundRequest
, il vous est possible d'attacher votre propre ID interne à votre système. Ainsi, plus tard, lors de la recupération des objets QuasiTransfer
et FundRequest
, 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.
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
foreignId: "<my internal id>"
});
const fundRequestPromise =
fPay.fundRequest.create({
foreignId: "<my internal id>"
});
Avec le code précédent, vous avez désormais le droit de faire le code suivant lors de la recupérationdes objets QuasiTransfer
et FundRequest
.
const quasiTransferPromise = fPay.quasiTransfer.get("<my internal id>");
const fundRequestPromise = fPay.fundRequest.get("<my internal id>");
Lors de la création des objets QuasiTransfer
et FundRequest
, 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
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
foreignData: "<xml><myKey>myValue</myKey></xml>"
});
const fundRequestPromise =
fPay.fundRequest.create({
foreignData: "<xml><myKey>myValue</myKey></xml>"
});
const quasiTransferPromise = fPay.quasiTransfer.get("<quasiTransfer.id | foreignId>");
quasiTransferPromise.then(quasiTransfer => {
// Inspect the 'foreignData' field of the QuasiTransfer ...
const xmlData = quasiTransfer.foreignData;
// xmlData = "<xml><myKey>myValue</myKey></xml>"
});
const fundRequestPromise = fPay.fundRequest.get("<fundRequest.id | foreignId>");
fundRequestPromise.then(fundRequest => {
// Inspect the 'foreignData' field of the FundRequest ...
const xmlData = fundRequest.foreignData;
// xmlData = "<xml><myKey>myValue</myKey></xml>"
});