Le callback

Le callback

Le callback est une URL que vous pouvez définir pour recevoir les details de vos paiement dès qu'elle réussissent. Vous pouvez définir un callback pour les payins et les payouts.

L'url de callback doit être une URL valide et accessible publiquement. Elle doit être sécurisée pour éviter les attaques.

Si vous avez un backend utilisant le modèle MVC, vous pouvez définir un controller pour gérer les callbacks. Sinon, vous pouvez définir un fichier PHP ou Python qui recevra et gérera la requête de callback.

A chaque fois qu'un paiement est effectué, LigdiCash envoie systématiquement une requête POST à l'url de callback avec les détails de la transaction (token, transaction_id, status, montant, opérateur, etc).

Contenu de la requête

LigdiCash envoie deux requêtes POST à l'url de callback:

  1. Une première requête dont le Content-Type est application/x-www-form-urlencoded.
  2. Une deuxième requête dont le Content-Type est application/json.

Les deux requêtes contiennent les mêmes informations, mais sous des formats différents.

⚠️

Pour éviter de livrer le service deux fois, vous devez vérifier si la requête a déjà été traitée avant de la traiter.

POSThttps://backend.masuperboutique.com/votre-callback-endpoint
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
response_text
Obligatoire
string-
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
transaction_id
Obligatoire
stringIdentifiant unique généré par votre système pour la transaction
wiki
Obligatoire
stringURL documentant les codes d'erreur

Exemples

Voici des exemples de callback dans quelques langages et frameworks populaires:

PHP sans framework

<?php
 
$payload = file_get_contents('php://input');
$event = json_decode($payload);
 
$token = $event->token;
$transaction_id = $event->transaction_id;
$status = $event->status;
 
$transaction = find_transaction_from_bd_by_token($token); // Ou avec le transaction_id ou tout autre identifiant unique
 
if ($status === "completed") {
    // Mettre à jour le statut de la transaction dans la base de données
    $transaction->status = "completed";
    save_transaction_to_bd($transaction);
    // Livrer le produit ou valider la commande
    process_order($transaction);
}

PHP avec Laravel

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use App\Models\Transaction;
 
class CallbackController extends Controller
{
    public function handle(Request $request)
    {
        $payload = $request->getContent();
        $event = json_decode($payload);
 
        $token = $event->token;
        $transaction_id = $event->transaction_id;
        $status = $event->status;
 
        $transaction = Transaction::where('token', $token)->first(); // Ou avec le transaction_id ou tout autre identifiant unique
 
        if ($transaction->status === "pending" && $status === "completed") {
            // Mettre à jour le statut de la transaction dans la base de données
            $transaction->status = "completed";
            $transaction->save();
            // Livrer le produit ou valider la commande
            process_order($transaction);
        }
    }
}

Node.js avec Express

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
 
app.use(bodyParser.json());
 
app.post('/callback', (req, res) => {
    const event = req.body;
 
    const token = event.token;
    const transaction_id = event.transaction_id;
    const status = event.status;
 
    const transaction = findTransactionByToken(token); // Ou avec le transaction_id ou tout autre identifiant unique
 
    if (transaction.status === "pending" && status === "completed") {
        // Mettre à jour le statut de la transaction dans la base de données
        transaction.status = "completed";
        transaction.save();
        // Livrer le produit ou valider la commande
        processOrder(transaction);
    }
 
    res.json({ status: "success" });
});
 
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

Python avec Django

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Transaction
 
@csrf_exempt
def callback(request):
    payload = request.body
    event = json.loads(payload)
 
    token = event['token']
    transaction_id = event['transaction_id']
    status = event['status']
 
    transaction = Transaction.objects.get(token=token) # Ou avec le transaction_id ou tout autre identifiant unique
 
    if transaction.status === "pending" and status == "completed":
        # Mettre à jour le statut de la transaction dans la base de données
        transaction.status = "completed"
        transaction.save()
        # Livrer le produit ou valider la commande
        process_order(transaction)
 
    return JsonResponse({"status": "success"})

Java avec Spring Boot

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class CallbackController {
 
    @PostMapping("/callback")
    public String handleCallback(@RequestBody String payload) {
        JSONObject event = new JSONObject(payload);
 
        String token = event.getString("token");
        String transactionId = event.getString("transaction_id");
        String status = event.getString("status");
 
        Transaction transaction = findTransactionByToken(token); // Ou avec le transaction_id ou tout autre identifiant unique
 
        if (transaction.getStatus().equals("pending") && status.equals("completed")) {
            // Mettre à jour le statut de la transaction dans la base de données
            transaction.setStatus("completed");
            saveTransaction(transaction);
            // Livrer le produit ou valider la commande
            processOrder(transaction);
        }
 
        return "success";
    }
}
;