Flow — Paiement marchand par QR code
Un consumer paie un marchand en scannant un QR code généré par l’app Nex Business du marchand (ou affiché en caisse).
Sequence diagram
Trust boundaries traversées
| Étape | Crossing | Contrôle |
|---|---|---|
| 2 | App Business → Orchestrator (gen QR) | JWT + scope qr:generate |
| 4 | Génération token | AES-256-GCM + device_key (ADR-0013) |
| 10 | App consumer → Orchestrator (resolve) | JWT consumer + QrResolveGuard |
| 11 | Validation token | nonce anti-replay + TTL court |
| 21 | Orch → Ledger | scope ledger:write + metadata.posId |
Spécificités QR
- AES-256-GCM chiffré par
device_keypropre à l’appareil cashier (cf. /security/qr-code). - Nonce + TTL court : un QR ne peut être consommé qu’une fois et dans un délai limité (anti-replay).
posIdembarqué : l’écriture ledger persiste le POS qui encaisse (pour réconciliation et commissions).- Rate limit sur
POST /qr/resolveà renforcer (cf. known-gaps).
Pré-conditions
- Cashier authentifié dans Nex Business avec rôle
cashierrattaché à unposId(cf. ADR-0004). - Merchant KYB validé.
- Consumer KYC validé, solde suffisant.
Post-conditions
| Entity | État |
|---|---|
| Wallet consumer | - (montant + frais) |
| Wallet merchant | + montant |
| Wallet commissions Nex | + frais |
intents | status completed, metadata.posId = POS encaissant |
qr_tokens | nonce marqué consommé |
Acceptance criteria (Gherkin)
gherkin
Scenario: Paiement marchand par QR valide
Given un cashier rattaché au POS-A avec un QR généré pour 5 000 XAF
And un consumer avec un solde de 50 000 XAF
When le consumer scanne le QR
Then l'intent est créé avec metadata.posId = POS-A
And le risk preflight renvoie "approved"
When le consumer confirme avec son PIN
Then l'écriture ledger passe avec posId = POS-A
And le merchant reçoit "Encaissement de 5 000 XAF"
Scenario: QR rejoué (replay attack)
Given un QR consommé par un consumer A
When un consumer B tente de scanner le même QR
Then la résolution échoue avec motif "QR déjà utilisé"
And aucun intent n'est créé
Scenario: QR expiré
Given un QR généré il y a plus que son TTL
When un consumer le scanne
Then la résolution échoue avec motif "QR expiré"Liens
- ADR-0004 : Modèle multi-utilisateurs marchand
- ADR-0013 : QR code AES-GCM
- Page sécurité : /security/qr-code