Field 05 of 07

Ticketing & access control

Sell online, check at the door, even with no network.

Proven on :Kultix

Since July 2024

  • HMAC-SHA256
  • anti-rejeu
  • liste de révocation locale
  • lien court par SMS
  • réseau de distributeurs
  • frais en points de base

The purchase funnel

Step 3 of 5

01 · Event

Visuel

Demonstration event

Real name, date and venue to be supplied · fictional ticketing

02 · Seats

Unit price : 10 000 F CFA

03 · Summary — service fee by method

MethodService feeTotal

The cheapest method is listed first, fees visible before payment.

04 · Payment

Gate check

Offline — local verification

No ticket presented. Buy one on the left, then scan it.

Technical panel

Verification latency

0 — local verification

Decoded payload

Signature

Issued at
Tickets used locally
0
4
Méthodes de paiement
0 appel réseau
Vérification hors ligne

The mechanism

How it works.

Achat

frais par méthode en points de base

Paiement

PSP

Émission

charge utile + signature HMAC

QR

le jeton signé lui-même

SMS

lien court

Contrôle

vérification locale · 0 appel réseau

Anti-rejeu

liste locale · synchronisation différée

Côté émission — le billet se porte lui-même.

La charge utile du billet — événement, place, catégorie, dates d'émission et d'expiration — est signée en HMAC-SHA256, et c'est ce jeton signé que porte le QR. Le contrôle n'a donc rien à interroger : il vérifie la signature avec la clé embarquée. Sous un chapiteau sans couverture, avec une file d'attente, c'est la seule approche qui tienne.

Côté contrôle — la liste locale tranche.

La vérification de signature est faite en temps constant : une comparaison naïve laisserait fuiter, par le temps de réponse, à quel caractère elle a divergé. Le second scan d'un même billet est refusé alors que sa signature reste parfaitement valide — c'est la liste locale des billets consommés qui tranche, et elle se synchronise dès que le réseau revient.

The trade-offs

What I ruled out, and why.

A technical choice without its cost is not a choice, it is a preference.

01

QR signé, ou identifiant vérifié en base ?

The problem

Un identifiant vérifié en base impose un aller-retour réseau à chaque entrée — inutilisable sous un chapiteau sans couverture, avec une file d'attente.

The options

Identifiant vérifié en base · charge utile signée vérifiable hors ligne.

What I chose

Charge utile signée en HMAC-SHA256, vérifiable sans appel réseau.

The cost

La clé de signature doit être embarquée dans l'application de scan et pouvoir être tournée ; un billet ne peut pas être révoqué instantanément partout.

02

Où mémoriser les billets consommés hors ligne ?

The problem

Hors ligne, il faut bien mémoriser quelque part les billets déjà consommés.

The options

Liste locale par appareil · synchronisation temps réel obligatoire.

What I chose

Liste locale par appareil, synchronisée dès que le réseau revient.

The cost

Deux portes qui scannent le même billet hors ligne, chacune sur son appareil, le laisseront toutes deux passer. Atténué en assignant les portes par catégorie de billet.

03

Les frais de service : absorbés ou répercutés ?

The problem

Les frais du prestataire de paiement doivent bien être portés par quelqu'un.

The options

Absorbés par l'organisateur · répercutés sur l'acheteur.

What I chose

Répercutés et affichés par méthode, en points de base, avant le paiement.

The cost

Le prix affiché n'est plus le prix final, ce qui crée de l'abandon — compensé par le fait que la méthode la moins chère est visible d'emblée.

Proof in the code

Two real extracts.

app/Services/Ticketing/TicketSigner.php

Extract to be supplied

lib/services/ticket_verifier.dart

Extract to be supplied

Code Mes Rêves

Alexis Kouakou