La spécification de code QR EMVCo est le format encodé en TLV qui sous-tend la plupart des systèmes de paiement mobile nationaux, PIX (Brésil), PromptPay (Thaïlande), UPI (Inde), SGQR (Singapour), DuitNow (Malaisie), BPS PayNow (Singapour), et bien d'autres. Comprendre le format de base EMVCo, c'est comprendre une douzaine de variantes régionales à la fois.
MPM (Mode Présenté par le Marchand). QR statique ou dynamique affiché par le marchand. Le consommateur le scanne depuis son application bancaire/portefeuille et autorise le paiement. 99% des paiements QR réels utilisent MPM.
CPM (Mode Présenté par le Consommateur). L'application du consommateur génère un QR de courte durée (typiquement 30–60 secondes) ; le marchand le scanne. Moins courant ; utilisé là où la connectivité du consommateur est peu fiable (Inde rurale avant l'ubiquité d'UPI, certains systèmes de transit/métro).
Structure MPM
Le payload MPM est une séquence plate d'enregistrements TLV terminée par un CRC :
Balise
Nom
Longueur
Notes
00
Indicateur de format de payload
2
Toujours 01.
01
Méthode de point d'initiation
2
11 statique / 12 dynamique.
02–51
Informations sur le compte marchand
variable
Spécifique au schéma. Chaque schéma réserve sa propre balise : PIX utilise 26, UPI utilise aussi 26, SGQR utilise 51.
52
Code de catégorie marchand (MCC)
4
Code ISO 18245 à 4 chiffres. Voir tableau ci-dessous.
53
Devise de transaction
3
ISO 4217 numérique. 840=USD, 978=EUR, 356=INR, 986=BRL, 764=THB.
54
Montant de la transaction
variable
Décimal en chaîne. Omettre pour les QR statiques avec montant au scan.
58
Code pays
2
ISO 3166 alpha-2.
59
Nom du marchand
variable
Max 25 caractères selon la spec ; beaucoup de schémas assouplissent cela.
60
Ville du marchand
variable
Max 15 caractères.
62
Modèle de champ de données supplémentaires
variable
Référence de facture, fidélité, ID de terminal.
63
CRC
4
CRC16-CCITT sur tout ce qui précède cette balise (y compris la balise elle-même, longueur 04, moins la valeur à 4 chiffres).
Schémas régionaux dérivés d'EMVCo
Schéma
Pays
Balise de compte marchand
Notes
PIX
Brésil
26
Schéma de paiement instantané de la Banque centrale du Brésil. Ajoute des clés PIX CPF/CNPJ/email/téléphone comme sous-TLVs sous la balise 26.
PromptPay
Thaïlande
29 / 30
Utilise 29 pour l'ID national/fiscal et 30 pour le numéro mobile.
UPI
Inde
26
Même base EMVCo avec sous-TLVs spécifiques à UPI (VPA, nom du bénéficiaire).
SGQR
Singapour
51
QR unifié qui encode plusieurs rails de paiement (PayNow, NETS, UOB Pay) simultanément.
Commence par 000201010212 (méthode POI 12 = dynamique), inclut 540525.00.
Addition restaurant, INR 250, MCC 5812
merchant=Spice House city=MUMBAI country=IN currency=356 mcc=5812 amount=250
Champ MCC : 52045812. Devise : 5303356.
Pièges courants
CRC calculé incorrectement. Le CRC16-CCITT couvre le payload ENTIER y compris la balise 63 et la longueur 04, tout jusqu'à mais n'incluant pas la valeur CRC à 4 chiffres. La plupart des bugs viennent du calcul sur le payload seulement ou en incluant la valeur CRC elle-même.
Le champ longueur est à 2 chiffres. Même une valeur d'1 caractère prend la longueur 01. Une valeur de 100 caractères prendrait la longueur ??, mais attendez, EMVCo plafonne les valeurs à 99 caractères car la longueur est à 2 chiffres. Les valeurs plus longues doivent être réparties sur plusieurs sous-TLVs.
Le code devise est numérique, pas alphabétique. USD est 840, pas USD. EUR est 978. BRL est 986. ISO 4217 a à la fois alpha-3 et numérique ; EMVCo requiert le numérique.
Le code pays est alpha-2. US, IN, BR, TH. ISO 3166-1 alpha-2. Curieusement à l'opposé de la règle du code devise.
Statique vs dynamique. Si vous omettez le montant (balise 54), utilisez la méthode POI 11 (statique). QR statique + champ montant est valide selon la spec mais certaines apps le rejettent. QR dynamique sans montant est une violation de la spec.
Limite de caractères du nom marchand. Selon la spec, max 25 caractères. Certains schémas régionaux assouplissent cela (PIX permet 25, SGQR permet 40). Ajustez par schéma si vous ciblez un pays spécifique.
MCC 0000. La spec permet 0000 comme inconnu, mais de nombreux acquéreurs le rejettent en règlement. Préférez toujours un vrai MCC quand vous en avez un.
Compatibilité avec les scanners
App / appareil
Support
Notes
App bancaire / portefeuille
Natif
Les apps régionales dans chaque pays (Nubank / apps UPI / TrueMoney / GrabPay) traitent le payload EMVCo nativement.
Caméra iOS
Chaîne brute
Non reconnu comme paiement. L'utilisateur doit ouvrir son app bancaire et scanner depuis là.
Caméra Android
Chaîne brute
Idem, non traité.
Google Lens
Chaîne brute
Affiche le texte décodé.
Terminaux de paiement industriels
Natif
Les scanners POS modernes incluent le traitement EMVCo dans le firmware pour les schémas régionaux qu'ils supportent.