6. Confirmer la vente (billets créés)

POST/api/v1/public/purchases
Explication

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();

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).