6. Confirmer la vente (billets créés)
POST
/api/v1/public/purchasesExplication
En langage simple : « le client a payé chez vous — confirmez ». On vérifie les places et que le montant = prix des sièges. On ne vérifie PAS le moyen de paiement. Chaque billet inclut qr_code (32 caractères hex) et place{} avec tribune.couleur — pas d’image QR.
Payload / requête
amount doit égaler le total des sièges (checkout). payment_method = info seulement (pas de rejet). hold_ids + order_id + customer.
{
"order_id": "550e8400-e29b-41d4-a716-446655440000",
"amount": 80000,
"currency": "GNF",
"payment_method": "CARD",
"payment_reference": "TXN-987654",
"hold_ids": [
"133c21f0-d704-46f4-8901-553056af6408",
"222c21f0-d704-46f4-8901-553056af6409"
],
"customer": {
"name": "Aïssatou Bah",
"phone": "+224620000000",
"email": "[email protected]"
}
}
Réponse
Vente confirmée. Chaque billet inclut qr_code (32 hex) + place{} (tribune.couleur). Pas d’image QR.
{
"success": true,
"message": "Purchase completed",
"data": {
"order_id": "550e8400-e29b-41d4-a716-446655440000",
"idempotency_key": "partner-order-550e8400-e29b-41d4-a716-446655440000",
"transaction_id": "901",
"transaction_code": "TXN-PUBLIC-DEMO",
"status": "completed",
"amount": 40000,
"currency": "GNF",
"tickets": [
{
"id": "1201",
"hold_id": "133c21f0-d704-46f4-8901-553056af6408",
"event_id": "8",
"seat_id": "75980",
"ticket_code": "GN28-A1B2C3D4",
"ticket_number": "TK-2026-ABC123-GN",
"ticket_reference": "REF-HOR-1A2B3C",
"status": "SOLD",
"price": 40000,
"currency": "GNF",
"zone_id": "39",
"section_id": "49",
"section_code": "To-03",
"seat_code": "W16",
"row": "W",
"seat_number": "16",
"gate_id": "12",
"qr_code": "A0CEDE99190E02EE06B2D744DE333E26",
"place": {
"place_id": 75980,
"place": "W16",
"numero_place": 16,
"rangee": "W",
"secteur": "To-03",
"porte": { "code": "T01", "nom": "Tribune Ouest 1", "libelle": "Ouest 1" },
"tribune": { "code": "TRIB-OUEST", "nom": "Tribune Ouest", "couleur": "#8B4513" },
"route": ["Tribune Ouest 1", "To-03", "W", "W16"],
"route_texte": "Tribune Ouest 1 → To-03 → W → W16",
"code_litige": "STD-8-S75980"
}
}
]
}
}
Exemple de code
const body = {
"order_id": "550e8400-e29b-41d4-a716-446655440000",
"amount": 80000,
"currency": "GNF",
"payment_method": "CARD",
"payment_reference": "TXN-987654",
"hold_ids": [
"133c21f0-d704-46f4-8901-553056af6408",
"222c21f0-d704-46f4-8901-553056af6409"
],
"customer": {
"name": "Aïssatou Bah",
"phone": "+224620000000",
"email": "[email protected]"
}
};
const raw = JSON.stringify(body);
const res = await fetch("https://book.stadepassgn.com/api/v1/public/purchases", {
method: "POST",
headers: {
"content-type": "application/json",
"x-partner-code": process.env.PARTNER_CODE || "YOUR_PARTNER_CODE",
},
body: raw,
});
const json = await res.json();import json, requests
body = { "order_id": "550e8400-e29b-41d4-a716-446655440000", "amount": 80000, "currency": "GNF", "payment_method": "CARD", "payment_reference": "TXN-987654", "hold_ids": [ "133c21f0-d704-46f4-8901-553056af6408", "222c21f0-d704-46f4-8901-553056af6409" ], "customer": { "name": "Aïssatou Bah", "phone": "+224620000000", "email": "[email protected]" } }
raw = json.dumps(body)
res = requests.post(
"https://book.stadepassgn.com/api/v1/public/purchases",
data=raw,
headers={
"content-type": "application/json",
"x-partner-code": PARTNER_CODE,
},
)
data = res.json()body := []byte(`{ "order_id": "550e8400-e29b-41d4-a716-446655440000", "amount": 80000, "currency": "GNF", "payment_method": "CARD", "payment_reference": "TXN-987654", "hold_ids": [ "133c21f0-d704-46f4-8901-553056af6408", "222c21f0-d704-46f4-8901-553056af6409" ], "customer": { "name": "Aïssatou Bah", "phone": "+224620000000", "email": "[email protected]" } }`)
req, _ := http.NewRequest("POST", "https://book.stadepassgn.com/api/v1/public/purchases", bytes.NewReader(body))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-partner-code", partnerCode)
res, _ := http.DefaultClient.Do(req)var raw = @"{ ""order_id"": ""550e8400-e29b-41d4-a716-446655440000"", ""amount"": 80000, ""currency"": ""GNF"", ""payment_method"": ""CARD"", ""payment_reference"": ""TXN-987654"", ""hold_ids"": [ ""133c21f0-d704-46f4-8901-553056af6408"", ""222c21f0-d704-46f4-8901-553056af6409"" ], ""customer"": { ""name"": ""Aïssatou Bah"", ""phone"": ""+224620000000"", ""email"": ""[email protected]"" } }";
using var client = new HttpClient();
var req = new HttpRequestMessage(HttpMethod.Post, "https://book.stadepassgn.com/api/v1/public/purchases");
req.Content = new StringContent(raw, Encoding.UTF8, "application/json");
req.Headers.Add("x-partner-code", partnerCode);
var res = await client.SendAsync(req);String raw = "{ \"order_id\": \"550e8400-e29b-41d4-a716-446655440000\", \"amount\": 80000, \"currency\": \"GNF\", \"payment_method\": \"CARD\", \"payment_reference\": \"TXN-987654\", \"hold_ids\": [ \"133c21f0-d704-46f4-8901-553056af6408\", \"222c21f0-d704-46f4-8901-553056af6409\" ], \"customer\": { \"name\": \"Aïssatou Bah\", \"phone\": \"+224620000000\", \"email\": \"[email protected]\" } }";
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://book.stadepassgn.com/api/v1/public/purchases"))
.header("Content-Type", "application/json")
.header("x-partner-code", partnerCode)
.POST(HttpRequest.BodyPublishers.ofString(raw))
.build();
HttpResponse<String> res = client.send(req, BodyHandlers.ofString());
Essayer cette API (démo)
Playground local — réponse d’exemple en GNF. Pas d’appel réseau réel.
Démo uniquement. En production, signez chaque requête (voir Auth sur l’accueil).
200 OK · demo