Comment générer un IBAN valide en code (Python, JS, PHP)

Comment générer un IBAN valide en code (Python, JS, PHP)

Un guide pratique pour générer par programmation des IBAN valides et conformes au MOD-97 en Python, JavaScript et PHP, pour des jeux de test, des données de départ et des pipelines de QA.

Écrit par David S · Publié le 2026-05-26
#generate IBAN #IBAN in code #Python IBAN #JavaScript IBAN #PHP IBAN #test data #MOD-97 #fixtures

À un moment ou à un autre, la plupart des personnes qui développent des systèmes de paiement se heurtent au même mur : il leur faut des IBAN valides pour les tests, et il n’existe aucun bon moyen de les saisir à la main. Copier-coller la même poignée d’exemples produit des suites de tests fragiles, et utiliser un vrai IBAN est un problème de conformité en puissance. La solution propre consiste à les générer par programmation : structurellement corrects, aux chiffres de contrôle valides, et en aussi grand nombre que nécessaire.

Ce guide explique précisément comment procéder en Python, JavaScript et PHP. À la fin, vous disposerez d’une petite fonction à faibles dépendances que vous pourrez intégrer à une factory, à un script de données de départ ou à un module de fixtures. S’il vous faut seulement quelques numéros tout de suite sans écrire de code, le générateur Random IBAN les produit instantanément et les exporte au format CSV, JSON ou TXT.


Ce que « générer un IBAN » signifie réellement

Un IBAN n’est pas un unique nombre opaque : ce sont trois parties concaténées.

ES 76 21000418450200051332
│  │  └── BBAN (country-specific: bank + branch + account)
│  └───── Check digits (calculated, positions 3–4)
└──────── Country code (ISO 3166-1, positions 1–2)

Le générer revient donc à faire trois choses dans l’ordre :

  1. Choisir un pays et consulter la longueur de son IBAN et la disposition de son BBAN.
  2. Construire un BBAN aléatoire conforme à cette disposition (le bon nombre de chiffres, et des lettres là où la spécification les autorise).
  3. Calculer les deux chiffres de contrôle avec l’algorithme MOD-97 pour que l’ensemble soit valide.

La première étape nécessite une petite table de correspondance. La deuxième relève de la simple génération aléatoire. La troisième est la seule partie comportant une véritable logique, et c’est la même routine que celle utilisée pour valider un IBAN, exécutée à l’envers.


Le cœur du sujet : calculer les chiffres de contrôle

Tous les langages ci-dessous partagent la même routine de chiffres de contrôle. La règle issue des normes ISO 7064 / ISO 13616 est la suivante :

  1. Prenez le BBAN, ajoutez le code pays, puis ajoutez 00.
  2. Remplacez chaque lettre par deux chiffres (A=10, B=11, … Z=35).
  3. Lisez le résultat comme un seul grand entier et calculez 98 - (entier mod 97).
  4. Complétez ce résultat par des zéros sur deux chiffres.

Ce nombre complété est votre paire de chiffres de contrôle. Insérez-la entre le code pays et le BBAN, et l’IBAN ainsi obtenu passera la validation MOD-97. Passons à l’implémentation.


Générer un IBAN en Python

Les entiers à précision arbitraire de Python rendent l’exercice presque trivial : aucune bibliothèque de grands entiers n’est nécessaire.

import random

# Minimal layout table: country -> (total length, BBAN length)
IBAN_SPECS = {
    "DE": 22, "ES": 24, "FR": 27, "GB": 22,
    "NL": 18, "IT": 27, "PT": 25, "BE": 16,
}

def _check_digits(country: str, bban: str) -> str:
    rearranged = bban + country + "00"
    numeric = "".join(
        str(ord(c) - 55) if c.isalpha() else c
        for c in rearranged
    )
    check = 98 - (int(numeric) % 97)
    return f"{check:02d}"

def generate_iban(country: str = "ES") -> str:
    total_len = IBAN_SPECS[country]
    bban_len = total_len - 4            # minus country code + check digits
    bban = "".join(random.choices("0123456789", k=bban_len))
    return country + _check_digits(country, bban) + bban

# Usage
print(generate_iban("DE"))   # e.g. DE21 ... (valid checksum)
print([generate_iban("ES") for _ in range(5)])

Cela garde le BBAN numérique par souci de simplicité, ce qui est correct pour les pays ci-dessus. Quelques pays (le Royaume-Uni, par exemple) incluent des lettres dans le code banque ; pour ceux-là, il faudrait aussi tirer au sort les positions des lettres. Pour des jeux de test, un BBAN entièrement numérique convient généralement, car il passe quand même les contrôles de MOD-97 et de longueur.


Générer un IBAN en JavaScript

En JS, la seule difficulté est que le nombre réorganisé est trop grand pour un Number ordinaire. La solution standard est une boucle de reste courant, qui maintient la valeur en dessous de 97 en permanence.

const IBAN_SPECS = {
  DE: 22, ES: 24, FR: 27, GB: 22,
  NL: 18, IT: 27, PT: 25, BE: 16,
};

function mod97(numericString) {
  let remainder = 0;
  for (const ch of numericString) {
    remainder = (remainder * 10 + Number(ch)) % 97;
  }
  return remainder;
}

function checkDigits(country, bban) {
  const rearranged = bban + country + '00';
  const numeric = rearranged.replace(/[A-Z]/g, c =>
    (c.charCodeAt(0) - 55).toString()
  );
  const check = 98 - mod97(numeric);
  return String(check).padStart(2, '0');
}

function generateIban(country = 'ES') {
  const bbanLen = IBAN_SPECS[country] - 4;
  let bban = '';
  for (let i = 0; i < bbanLen; i++) {
    bban += Math.floor(Math.random() * 10);
  }
  return country + checkDigits(country, bban) + bban;
}

// Usage
console.log(generateIban('FR'));
console.log(Array.from({ length: 5 }, () => generateIban('NL')));

Si vous avez besoin d’un aléa cryptographiquement plus robuste (rarement nécessaire pour des jeux de test), remplacez Math.random() par crypto.getRandomValues(). Pour des fixtures et des démonstrations, la version simple est parfaitement adéquate.


Générer un IBAN en PHP

PHP a besoin de l’extension bcmath pour le modulo du grand nombre, laquelle est livrée avec la plupart des installations.

<?php
const IBAN_SPECS = [
    'DE' => 22, 'ES' => 24, 'FR' => 27, 'GB' => 22,
    'NL' => 18, 'IT' => 27, 'PT' => 25, 'BE' => 16,
];

function checkDigits(string $country, string $bban): string {
    $rearranged = $bban . $country . '00';
    $numeric = '';
    foreach (str_split($rearranged) as $ch) {
        $numeric .= ctype_alpha($ch) ? (string)(ord($ch) - 55) : $ch;
    }
    $check = 98 - (int) bcmod($numeric, '97');
    return str_pad((string) $check, 2, '0', STR_PAD_LEFT);
}

function generateIban(string $country = 'ES'): string {
    $bbanLen = IBAN_SPECS[$country] - 4;
    $bban = '';
    for ($i = 0; $i < $bbanLen; $i++) {
        $bban .= random_int(0, 9);
    }
    return $country . checkDigits($country, $bban) . $bban;
}

// Usage
echo generateIban('IT'), PHP_EOL;

Notez l’usage de random_int() plutôt que rand() : c’est le choix moderne et non biaisé, et il ne coûte rien de plus ici.


Utiliser des IBAN générés dans une suite de tests

Une fois que vous disposez d’un générateur, intégrez-le à vos tests au lieu de disséminer des littéraux. Quelques approches qui fonctionnent bien :

  • Factories et fixtures. Appelez generateIban() à l’intérieur de votre factory (FactoryBoy, un fournisseur Faker, une factory Laravel) pour que chaque exécution de tests obtienne des données neuves et valides.
  • Données de départ pour la préproduction. Remplissez les bases de démonstration avec quelques centaines d’IBAN de plusieurs pays afin d’éprouver le formatage propre à chacun.
  • Cas limites. Conservez un ensemble séparé de chaînes délibérément erronées (mauvaise longueur, chiffre de contrôle incorrect, pays non pris en charge) pour vérifier que votre validation les rejette.
  • Déterminisme au besoin. Initialisez le germe de votre générateur aléatoire au début d’un test si vous voulez des IBAN reproductibles ; laissez-le non initialisé pour une couverture de type fuzzing.

Quoi que vous génériez, étiquetez-le clairement comme synthétique. Ces numéros sont structurellement valides et passent le MOD-97, mais ce ne sont pas de vrais comptes et ils ne doivent jamais atteindre un circuit de paiement en production. Consultez notre guide sur comment stocker les IBAN en toute sécurité dans les systèmes de paiement pour empêcher le mélange des données de test et de production.


Quand ne pas écrire son propre générateur

Développer le vôtre est excellent pour une intégration étroite, mais cela n’en vaut pas toujours la peine. Faites l’impasse sur le code lorsque :

  • Il vous faut un lot rapide tout de suite : collez-les en quelques secondes depuis le générateur Random IBAN et exportez-les en CSV/JSON.
  • Il vous faut une large couverture de pays avec des sous-structures de BBAN correctes (chiffres de contrôle nationaux, positions des lettres) qu’une table minimale ne capture pas.
  • Vous travaillez en dehors d’une base de code : préparation d’un tableur, d’une collection Postman ou de documentation.

Et quelle que soit la voie choisie, validez le résultat. Faites passer un échantillon par le validateur d’IBAN pour confirmer que votre logique de chiffres de contrôle correspond à l’implémentation de référence. Si quelque chose échoue au MOD-97, le bug se trouve presque toujours dans la conversion des lettres en chiffres ou dans une erreur d’indice (off-by-one) sur la longueur du BBAN.


FAQ

Les IBAN générés par programmation sont-ils sûrs à utiliser ?

Oui, pour les tests, la QA, les démonstrations et la documentation. Ils sont structurellement valides et passent la validation de la somme de contrôle, mais ne sont liés à aucun compte bancaire réel. N’utilisez jamais d’IBAN générés pour des transactions réelles ni dans un système de paiement en production.

Ai-je besoin d’une bibliothèque externe pour générer un IBAN ?

Non. Les exemples ci-dessus n’utilisent que la bibliothèque standard de chaque langage : les grands entiers intégrés de Python, une boucle de reste courant en JavaScript et le bcmath livré avec PHP. Les bibliothèques peuvent aider pour une couverture complète des pays, mais l’algorithme central tient en quelques lignes.

Pourquoi mon IBAN généré échoue-t-il à la validation ?

Les causes les plus fréquentes sont une conversion incorrecte des lettres en chiffres (elle doit aller de A=10 à Z=35), l’oubli d’ajouter le code pays et 00 avant l’étape du modulo, ou l’utilisation d’une mauvaise longueur de BBAN pour le pays. Comparez un seul cas en échec au validateur pour l’isoler.

Comment générer des IBAN pour les pays comportant des lettres dans le BBAN ?

Étendez l’étape de BBAN aléatoire pour placer des lettres là où la spécification du pays les autorise — par exemple, le code banque du Royaume-Uni compte quatre lettres. Conservez un motif par pays (quelles positions sont des lettres plutôt que des chiffres) au lieu d’une simple longueur, puis remplissez chaque position en conséquence avant de calculer les chiffres de contrôle.

Puis-je générer des milliers d’IBAN à la fois ?

Oui. Les fonctions de génération sont peu coûteuses à appeler dans une boucle, si bien qu’en produire des milliers est instantané. Si vous préférez ne pas exécuter de code, le générateur Random IBAN prend en charge la génération en masse et l’export en un clic vers CSV, JSON et TXT.

Quelle est la différence entre générer et valider un IBAN ?

La validation vérifie un numéro existant en confirmant que mod 97 == 1. La génération exécute la même arithmétique à l’envers : vous construisez d’abord le BBAN, puis vous calculez 98 - (mod 97) pour trouver les chiffres de contrôle qui rendent le numéro valide. Elles partagent la même routine centrale.

Essayez Nos Outils IBAN

Mettez vos connaissances en pratique avec nos outils gratuits.