Créez un paiement, redirigez l’acheteur vers le lien renvoyé, recevez la confirmation par webhook. C’est lahsab qui héberge la page de paiement, vous n’avez rien à construire. Commencez en sandbox : même API qu’en production, sans argent réel.
1. Créer un intent
POST /payments/intents avec un montant en dinars entiers (DZD, sans centimes). La réponse porte un checkoutUrl (le lien de paiement hébergé par lahsab), valable 48 heures.
curl -X POST https://api.lahsab.com/payments/intents \
-H "x-api-key: lsk_sandbox_CLE" \
-H "content-type: application/json" \
-d '{ "amount": 2500, "description": "Abonnement Premium", "customerRef": "user_abc123" }' const res = await fetch("https://api.lahsab.com/payments/intents", {
method: "POST",
headers: {
"x-api-key": process.env.LAHSAB_API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
amount: 2500,
description: "Abonnement Premium",
customerRef: "user_abc123",
}),
});
const intent = await res.json();
window.location.href = intent.checkoutUrl; <?php
$ch = curl_init("https://api.lahsab.com/payments/intents");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("LAHSAB_API_KEY"),
"content-type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"amount" => 2500,
"description" => "Abonnement Premium",
"customerRef" => "user_abc123",
]),
]);
$intent = json_decode(curl_exec($ch), true);
header("Location: " . $intent["checkoutUrl"]); import os, requests
res = requests.post(
"https://api.lahsab.com/payments/intents",
headers={"x-api-key": os.environ["LAHSAB_API_KEY"]},
json={
"amount": 2500,
"description": "Abonnement Premium",
"customerRef": "user_abc123",
},
)
intent = res.json()
redirect(intent["checkoutUrl"]) Réponse 201 :
{
"id": "a7f3c2e1-9b4d-4e6a-8c1f-2d3e4f5a6b7c",
"environment": "sandbox",
"amount": 2500,
"status": "pending",
"checkoutUrl": "https://dashboard.lahsab.com/pay/a7f3c2e1-9b4d-4e6a-8c1f-2d3e4f5a6b7c",
"expiresAt": "2026-07-13T10:00:00.000Z",
"proofs": [],
"createdAt": "2026-07-11T10:00:00.000Z"
}
2. Rediriger vers la page de paiement
Envoyez l’acheteur sur le checkoutUrl. La page hébergée par lahsab lui fait choisir son moyen de paiement (versement CCP ou BaridiMob), affiche les instructions et les coordonnées de ce moyen, et récolte la preuve de paiement (reçu ou capture). L’acheteur paie, téléverse sa preuve, et l’intent passe en proof_submitted, sans une ligne de code de votre côté.
3. Confirmer, puis recevoir le webhook
La confirmation « argent reçu » est manuelle, c’est le cœur du modèle : vérifiez sur votre compte que le virement est bien arrivé, puis cliquez Confirmer dans le tableau de bord. L’intent passe en confirmed et lahsab émet payment.confirmed vers votre endpoint. C’est votre signal pour accorder l’accès ou expédier.
confirmed et rejected sont terminaux. expired est un
terminal réservé.
Encaisser plus d’une fois
Un intent encaisse une somme, une fois. Pour vendre un abonnement, ne bouclez pas là-dessus : lahsab émet les factures, suit les impayés, et vous dit jusqu’à quand c’est payé, en un seul appel à POST /subscriptions. Là, l’événement d’accès n’est plus payment.confirmed mais invoice.paid.
Et ensuite ?
- Recevoir et vérifier les événements : Webhooks.
- Vendre un abonnement : Abonnements.
- Tout jouer sans argent réel : Tester en sandbox.
- Tous les endpoints, champs et erreurs : Référence API.