Skip to content
StableAudienceDevSécuritéQAAudit banqueComplianceOwner@product-teamDernière revue2026-05-21

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

ÉtapeCrossingContrôle
2App Business → Orchestrator (gen QR)JWT + scope qr:generate
4Génération tokenAES-256-GCM + device_key (ADR-0013)
10App consumer → Orchestrator (resolve)JWT consumer + QrResolveGuard
11Validation tokennonce anti-replay + TTL court
21Orch → Ledgerscope ledger:write + metadata.posId

Spécificités QR

  • AES-256-GCM chiffré par device_key propre à 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).
  • posId embarqué : 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 cashier rattaché à un posId (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
intentsstatus completed, metadata.posId = POS encaissant
qr_tokensnonce 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

Nex — Plateforme fintech CEMAC