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:
- Une première requête dont le
Content-Type
estapplication/x-www-form-urlencoded
. - Une deuxième requête dont le
Content-Type
estapplication/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.
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";
}
}