Payin sans redirection

Payin sans redirection

Le payin sans redirection est une méthode de paiement de l'API LigdiCash qui permet à un marchand de collecter des paiements auprès de ses clients sans qu'ils ne quittent votre plateforme.

Cette méthode de paiement est particulièrement utile pour les marchands qui souhaitent offrir une expérience de paiement personnalisée à leurs clients, tout en bénéficiant de la sécurité et de la simplicité de l'API LigdiCash.

Cependant, le marchand doit gérer lui-même la logique de paiement et de confirmation de la transaction pour tous les opérateurs de paiement qu'il utilise.

Mise en place

⚠️

Pour éffectuer un paiement sans redirection, vous devez disposer d'un projet API activé. Suivez le guide pour créer un projet API.

Afin de collecter des paiements sans redirection, le marchand doit au préalable connaître le mode de fonctionnement de l'opérateur de paiement (OTP, Approbation, etc) que le client a choisi.

Dans ce guide, nous allons prendre en compte le système OTP (One Time Password) et le système d'approbation.

Fonctionnement du Payin sans redirection avec OTP

Le système OTP(One Time Password) consiste à envoyer un code unique par SMS au client pour valider une transaction.

Nous prendrons le cas de Orange Money Burkina pour illustrer le fonctionnement du payin sans redirection avec le système OTP.

Initier la transaction

Acteurs: Client

Le client exécute d'abord le code USSD *144*4*6*montant# suivi de son code secret pour obtenir un code OTP.
Le code est alors envoyé par SMS au client.

Valider la transaction

Acteurs: Marchand => LigdiCash => Opérateur

Une fois le code OTP obtenu, le client le communique, en plus du numéro utilisé, au marchand qui devra l’ajouter dans le corps de sa requête vers l’API de Ligdicash.

Cette requête permettra de valider la transaction en créditant le compte mobile money du client et en débitant le portefeuille LigdiCash du marchand.

POSThttps://app.ligdicash.com/pay/v01/straight/checkout-invoice/create
Headers
Apikey
Obligatoire
stringCorrespond au API Key de votre projet API
Authorization
Obligatoire
Bearer + API TOKENCorrespond au API TOKEN de votre projet API, précédé du mot Bearer
Accept
Obligatoire
application/jsonType de contenu accepté dans la réponse. Doit toujours être application/json
Content-Type
Obligatoire
application/jsonType de contenu de la requête. Doit toujours être application/json
Body
Commande
Obligatoire
objetDétails de la commande
invoice
Obligatoire
objetDéfinit les détails de la facture
customer
Obligatoire
stringNuméro de téléphone utilisé pour obtenir le code OTP Doit être préfixé par l'indicatif du pays. Exemple: 22670000000
otp
Obligatoire
stringLe code OTP obtenu par le client
items
Obligatoire
arrayListe des articles de la facture
name
Obligatoire
stringNom de l'article
description
Obligatoire
stringDescription de l'article
quantity
Obligatoire
integerQuantité de l'article
unit_price
Obligatoire
integerPrix unitaire de l'article
total_price
Obligatoire
integerPrix total de l'article
total_amount
Obligatoire
integerMontant total de la facture
devise
Obligatoire
XOFDevise de la facture. Doit toujours être XOF
description
Obligatoire
stringDescription de la facture
customer_firstname
Obligatoire
string (optional)Prénom du client
customer_lastname
Obligatoire
string (optional)Nom du client
customer_email
Obligatoire
string (optional)Email du client
external_id
Obligatoire
stringCe champ doit être vide
store
Obligatoire
objetDéfinit les détails du magasin
name
Obligatoire
stringNom du magasin
website_url
Obligatoire
stringURL du site web du magasin
actions
Obligatoire
application/jsonDéfinit les actions à effectuer après le paiement
cancel_url
Obligatoire
stringURL de redirection en cas d'annulation du paiement
return_url
Obligatoire
stringURL de redirection après le succès du paiement
callback_url
Obligatoire
stringURL d'un endpoint de votre backend qui recevra les détails de la transaction par requête POST
custom_data
Obligatoire
objectDéfinit les données personnalisées à associer à la transaction
transaction_id
stringcustom_data spécial correspondant à un identifiant unique généré par votre système pour la transaction
1curl --location 'https://app.ligdicash.com/pay/v01/straight/checkout-invoice/create' \
2--header 'Apikey: 81J...DH8C' \
3--header 'Authorization: Bearer eyJ0eXAiO...4LyaRolhw' \
4--header 'Accept: application/json' \
5--header 'Content-Type: application/json' \
6--data-raw '{
7    "commande": {
8        "invoice": {
9            "items": [
10                {
11                    "name": "Premier produit",
12                    "description": "__description_du_produit__",
13                    "quantity": 1,
14                    "unit_price": 1000,
15                    "total_price": 1000
16                },
17                {
18                    "name": "Deuxieme produit",
19                    "description": "__description_du_produit__",
20                    "quantity": 3,
21                    "unit_price": 5000,
22                    "total_price": 5000
23                }
24            ],
25            "total_amount": 16000,
26            "devise": "XOF",
27            "description": "Achat de produits sur https://masuperboutique.com",
28            "customer": "226XXXXXXXX", // <--- Numéro de téléphone utilisé pour obtenir le code OTP. Préfixé par l'indicatif du pays
29            "customer_firstname": "Cheik",
30            "customer_lastname": "Cissé",
31            "customer_email": "cheikcisse@gmail.com",
32            "external_id": "",
33            "otp": "XXXXXX" // <--- Code OTP obtenu par le client
34        },
35        "store": {
36            "name": "Ma boutique",
37            "website_url": "https://masuperboutique.com"
38        },
39        "actions": {
40            "cancel_url": "",
41            "return_url": "",
42            "callback_url": "https://backend.masuperboutique.com/callback"
43        },
44        "custom_data": {
45            "order_id": "ORD-1234567890",
46            "transaction_id": "ORD-1234567890"
47        }
48    }
49}'

Nous vous recommandons fortement d'implémenter le endpoint de callback pour recevoir les détails de la transaction après le paiement.
Cela vous permettra de mettre à jour le statut de la commande dans votre système et d'offrir le service ou le produit à votre client sans qu'il ne soit obligé de revenir sur votre site.

Réponse

Réponsehttps://app.ligdicash.com/pay/v01/redirect/checkout-invoice/create
response_code
Obligatoire
OO ou 01Code de réponse de la requête. 00 pour une requête réussie 01 pour une requête incorrecte (La valeur de "response_text" contient le code d'erreur)
response_text
Obligatoire
stringSi le code de réponse est 01, ce champ contient le message d'erreur
token
Obligatoire
stringIdentifiant unique de la transaction Ce token est à conserver pour vérifier le statut de la transaction
description
Obligatoire
stringDescription de la réponse
custom_data
Obligatoire
objetObjet contenant les données personnalisées que vous avez envoyées dans la requête
wiki
Obligatoire
stringURL documentant les codes d'erreur
1{
2    "response_code": "00",
3    "token": "eyJ0eXAiOiJKV1QiLCJh...GlyeV9kYXRlIjoxNzE2Mzc2NTE3fQ.7iwLZVmG_Hw_ncFUcF5Hzk8cB2BSUqroF9rGqym_qSw",
4    "response_text": "La requête est en cours de traitement",
5    "description": "",
6    "custom_data": {
7        "logfile": "20240521131517664c9e65689a3"
8    },
9    "wiki": "https://client.ligdicash.com/wiki/createInvoice"
10}
11

Vérifier le statut de la transaction

Une fois que la reponse obtenue, vous devrez alors vérifier le statut de la transaction pour confirmer réellement le statut du paiement.

Pour vérifier le statut de la transaction, vous devez utiliser le token retourné lors de la création de la facture, et effectuer la requête suivante:

POSThttps://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm/?invoiceToken={token_de_la_transaction}
Headers
Apikey
Obligatoire
stringCorrespond au API Key de votre projet API
Authorization
Obligatoire
Bearer + API TOKENCorrespond au API TOKEN de votre projet API, précédé du mot Bearer
Accept
Obligatoire
application/jsonType de contenu accepté dans la réponse. Doit toujours être application/json
Content-Type
Obligatoire
application/jsonType de contenu de la requête. Doit toujours être application/json
Paramètres Query
invoiceToken
Obligatoire
stringIl s'agit du token de la transaction que vous avez reçu lors de la création de la facture
1curl --location 'https://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm/?invoiceToken=eyJ0eXAiOiJK...nk159cWyokRv6wAlh3g' \
2--header 'Apikey: 81J...IDH8C' \
3--header 'Authorization: Bearer eyJ0eXAiOiJ...4LyaRolhw' \
4--data ''

Interpréter la réponse

Lorsque vous recevez la réponse de la requête de vérification du statut de la transaction, vous devez vous assurez que response_code == 00 et que status == completed avant de valider la transaction et de livrer le service ou le produit à votre client.

Réponsehttps://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm/?invoiceToken={token_de_la_transaction}
response_code
Obligatoire
OO ou 01Code de réponse de la requête. 00 pour une requête réussie 01 pour une requête incorrecte (La valeur de "response_text" contient le code d'erreur)
token
Obligatoire
stringIdentifiant unique de la transaction Sera vide dans la réponse, car il est déjà dans l'URL de la requête
response_text
Obligatoire
stringSi le code de réponse est 01, ce champ contient le message d'erreur Si le code de réponse est 00, ce champ contient l'URL de redirection vers la page de paiement
date
Obligatoire
stringDate de la transaction
description
Obligatoire
stringDescription de la réponse
status
Obligatoire
completed, pending, nocompletedStatut de la transaction
custom_data
Obligatoire
array d'objetTableau contenant les données personnalisées que vous avez envoyées dans la requête
item
objetReprésente un élément de données personnalisées
id_invoice
stringIdentifiant de la facture
keyof_customdata
stringClé de la donnée personnalisée
valueof_customdata
stringValeur de la donnée personnalisée
montant
Obligatoire
integerMontant de la transaction
amount
Obligatoire
integerMontant de la transaction
operator_id
Obligatoire
stringIdentifiant de l'opérateur
operator_name
Obligatoire
stringNom de l'opérateur
customer
Obligatoire
stringNuméro de téléphone utilisé pour la transaction
external_id
Obligatoire
stringIdentifiant externe de la transaction
request_id
Obligatoire
stringIdentifiant de la requête
wiki
Obligatoire
stringURL documentant les codes d'erreur
1{
2    "date": "2023-10-29 09:46:27+00",
3    "response_code": "00",
4    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUz...bdqRzL_aOJ1SYzY", 
5    "description": "”,
6    "amount": "100", 
7    "montant": "100", 
8    "response_text": null,
9    "status": "completed",
10    "custom_data": [ 
11        {
12            "id_invoice": 29505444, 
13            "keyof_customdata": "order_id", 
14            "valueof_customdata": "MonSiteOrder234"
15        }
16    ],
17    "operator_name": "ORANGE BURKINA",
18    "operator_id": "11",
19    "customer": “”,
20    "transaction_id": “TRNS.36887,
21    "external_id": null,
22}
23
;