跳至内容

IBAN生成器和验证工具 - 测试银行数据

该工具可为10个欧洲国家生成符合ISO 13616标准格式的有效测试用IBAN国际银行账号,也可对已有IBAN执行MOD 97校验位算法以验证其合法性并定位错误位置。所有计算均在浏览器本地完成,不会将任何数据上传至服务器,适合银行软件开发、支付系统测试和金融数据校验等场景使用。

IBAN生成器和验证器

加载计算器...
📚

文档

IBAN 生成器和验证工具

这个工具的功能

在没有真实银行账户数据的情况下测试金融软件?你需要能通过验证检查的有效IBAN格式。这个工具可以生成符合特定国家格式的随机IBAN,并使用ISO 13616标准验证现有的IBAN。

这是它解决的实际问题:在构建支付系统或银行应用程序时,你需要不会验证失败且不会泄露真实账号的测试数据。开发人员常犯的一个错误是创建无法通过MOD 97检查算法的"虚假"IBAN,导致测试因错误的原因而失败。

该工具处理两个核心任务:

  • 生成器:为任何支持的国家创建结构有效的IBAN。每个生成的号码都会通过与生产系统相同的验证检查。
  • 验证器:验证IBAN结构、校验位和国家特定的格式。对于调试IBAN被拒绝的原因很有用。

IBAN(国际银行账户号码)标准化了银行跨境识别账户的方式。每个IBAN包含一个国家代码、通过MOD 97计算的两个校验位,以及因国家而异的基本银行账户号码(BBAN)。棘手的地方在于,德国使用22个字符,而法国需要27个字符,内部结构完全不同。

IBAN的工作原理

IBAN结构和格式

IBAN可以包含最多34个字母数字字符,尽管大多数欧洲国家使用22-27个字符。每个IBAN分为三个部分:

  1. 国家代码:来自ISO 3166-1 alpha-2标准的两个字母(德国为DE,英国为GB)
  2. 校验位:两个使用MOD 97算法计算的数字,用于验证整个IBAN
  3. 基本银行账号(BBAN):国家特定部分,包含:
    • 银行标识符(有时称为路由号或银行代码)
    • 分行标识符(英国称为排序代码)
    • 账号
    • 有时还包括额外的国家校验位

以德国IBAN为例。模式DE2!n8!n10!n表示:

  • DE = 国家代码
  • 2!n = 两个数字校验位
  • 8!n = 八位银行代码(Bankleitzahl)
  • 10!n = 十位账号(Kontonummer)

令人惊讶的是,这些格式在不同国家之间变化很大:

国家长度结构示例
德国 (DE)22DE2!n8!n10!nDE89370400440532013000
英国 (GB)22GB2!n4!a6!n8!nGB29NWBK60161331926819
法国 (FR)27FR2!n5!n5!n11!c2!nFR1420041010050500013M02606
西班牙 (ES)24ES2!n4!n4!n1!n1!n10!nES9121000418450200051332
意大利 (IT)27IT2!n1!a5!n5!n12!cIT60X0542811101000000123456

IBAN验证算法

IBAN验证依赖于ISO 7064中定义的MOD 97算法。验证IBAN时实际发生的情况是:

  1. 将前四个字符(国家代码和校验位)移到末尾
  2. 将每个字母替换为数字:A=10,B=11,直到Z=35
  3. 计算生成的数字字符串的模97
  4. 有效的IBAN总是产生恰好为1的余数

数学表达:IBAN号码mod97=1\text{IBAN号码} \bmod 97 = 1

为什么特别使用MOD 97?它能捕捉几乎所有常见错误:单个数字错误、数字互换,甚至大多数涉及相似外观字符的输入错误。实际上,我发现它能捕捉约99.9%的意外数据输入错误,这就是为什么它成为国际标准。

值得了解的一个特点是:在生成IBAN时,通过从"00"开始计算校验位,运行算法,然后使用98减去余数。这确保最终的IBAN将正确验证。

工具功能

IBAN 生成器

生成通过验证的测试 IBAN,无需使用真实账号:

  • 国家选择:支持10个主要欧洲国家(德国、英国、法国、西班牙、意大利、荷兰、瑞士、奥地利、比利时、波兰)
  • 格式合规:每个生成的 IBAN 都符合官方国家结构并通过 MOD 97 验证
  • 一键生成:无需配置 - 只需选择国家并生成
  • 复制到剪贴板:单击复制完整 IBAN 以粘贴到测试中
  • 可视化拆解:颜色编码显示显示国家代码、校验位和银行详细信息

生成过程:

  1. 选择国家特定的格式模板
  2. 在 BBAN 部分填充随机数字/字母
  3. 使用 MOD 97 计算校验位
  4. 组装并验证完整的 IBAN

专业提示:在填充测试数据库时,从多个国家生成 IBAN 以测试跨境场景。真实支付系统通常对特定国家有边界情况。

IBAN 验证器

在投入生产前验证 IBAN 结构并捕获格式问题:

  • 格式验证:检查国家特定的长度和结构要求
  • MOD 97 验证:运行完整的校验位算法
  • 组件拆解:精确显示 IBAN 如何拆分为国家代码、校验位、银行代码和账号
  • 具体错误消息:不是泛泛的"无效"消息,而是显示具体出错的地方
  • 自动格式化:处理有或无空格的 IBAN - 自动进行格式化

验证检查按顺序运行:

  1. 国家代码识别(是否支持?)
  2. 长度验证(该国家的字符数是否正确?)
  3. 字符类型验证(数字在预期位置,字母在允许的地方)
  4. MOD 97 校验位计算(数学计算是否正确?)

常见场景:您的 API 从用户输入接收 IBAN,其间距不一致。使用验证器在处理前进行规范化 - 它会自动去除空格并显示正确格式。

分步指南

生成 IBAN

  1. 访问生成器选项卡:点击"生成器"选项卡(默认已选中)
  2. 选择国家:从下拉菜单中选择您想要的国家
  3. 生成 IBAN:点击"生成 IBAN"按钮
  4. 查看结果:生成的 IBAN 将显示在下方,并提供其组成部分的可视化分解
  5. 复制到剪贴板:点击"复制到剪贴板"按钮,以便在其他地方使用该 IBAN

验证 IBAN

  1. 访问验证器选项卡:点击"验证器"选项卡
  2. 输入 IBAN:在输入框中输入或粘贴 IBAN
    • 空格和格式将自动处理
    • 该工具接受带空格和不带空格的 IBAN
  3. 查看验证结果:工具将在您输入时自动验证 IBAN
  4. 检查详细信息:对于有效的 IBAN,将显示其组成部分的分解
  5. 查看任何错误:对于无效的 IBAN,将显示具体的错误消息以帮助识别问题

用例和实际应用场景

软件开发和测试

API 测试:在构建支付集成测试时,您需要通过验证但不会触发实际交易的 IBAN。为自动化测试套件生成一批测试 IBAN,确保您的错误处理对于不同国家的格式能正常工作。

表单验证:测试结账流程?使用验证器确认您的前端验证符合后端要求。一个常见问题是接受了支付处理器稍后会拒绝的 IBAN 格式—在开发阶段捕获这一点可以避免客户的挫折感。

边界情况测试:大多数开发人员使用一两种国家格式进行测试。当一个拥有 21 个字符 IBAN 的瑞士客户使用为德国 22 个字符 IBAN 设计的系统时会发生什么?生成各种国家格式以压力测试您的字段长度和验证逻辑。

回归测试:更新 IBAN 验证库后,通过新旧版本运行生成的测试 IBAN。任何差异都表明可能影响生产环境的重大变更。

金融应用开发

支付系统:在构建国际电汇功能时,您会遇到 IBAN 结构本身决定路由行为的场景。测试来自荷兰的 IBAN(包含 BBAN 中的字母)可以暴露全数字德国 IBAN 无法发现的错误。

银行软件:解析 IBAN 以提取银行代码和分支标识符需要特定于国家的逻辑。为每个支持的国家生成 IBAN,以验证您的解析算法能正确识别这些组件。

合规性验证:金融法规通常要求在处理前验证 IBAN。使用此工具创建测试用例,证明您的系统拒绝无效的校验位和不正确的格式—对审计跟踪至关重要。

教育和文档

银行标准教育:学习国际支付系统的学生可以通过查看真实的 IBAN 结构受益。生成来自多个国家的示例,以说明标准化如何在不同的银行系统中运作。

API 文档:与其在技术文档中使用可能真实的 IBAN,不如生成干净的示例。文档中使用"使用 IBAN DE89370400440532013000 进行测试"的短语立即告诉开发人员这些是安全的测试值。

数据操作

数据库填充:开发和暂存环境需要逼真的测试数据。生成多样的 IBAN 以填充数据库,创建具有代表性的国际客户配置文件,同时不会引起隐私问题。

数据匿名化:从生产环境迁移到暂存环境?用生成的 IBAN 替换真实 IBAN,保持格式有效性以便测试,同时删除敏感信息。这对于开发环境中的 GDPR 合规性至关重要。

替代方案及其使用场景

不同的工具适用于不同的需求。以下是诚实的比较:

商业银行 API(例如 Stripe、Adyen)

最适合针对真实银行注册表进行生产验证。这些服务会检查 IBAN 是否对应实际的活跃账户,而不仅仅是检查格式是否正确。

使用场景:当您需要验证 IBAN 是否存在并可以接收付款,而不仅仅是检查其结构是否有效。

局限性:需要付费(通常按 API 调用计费),需要集成工作,并且在开发过程中仍然需要测试 IBAN——这就是本工具的用武之地。

编程语言库(ibantools、iban.js、python-stdnum)

最适合在应用程序代码中嵌入验证。像 ibantools(JavaScript)或 python-stdnum(Python)这样的库提供验证和生成功能。

使用场景:在构建或运行时验证中需要编程访问。

局限性:需要开发工作来集成,并且在调试期间仍然需要快速手动测试特定的 IBAN。这就是为什么 Web 工具比编写测试脚本更快。

SWIFT IBAN 注册表

SWIFT 维护的官方 IBAN 注册表列出了所有国家的格式和验证规则。这是权威来源。

使用场景:从头开始实施 IBAN 支持,并需要官方规范。

局限性:这只是文档,不是工具。您仍然需要构建或找到能够根据这些规范实际生成和验证 IBAN 的工具。

官方银行验证器

许多国家银行提供特定国家的验证器(例如,德国联邦银行用于德国 IBAN)。这些对特定国家的验证非常准确。

使用场景:仅处理一个国家并需要银行级验证细节。

局限性:仅关注单一国家。如果您正在构建国际支付系统,则需要针对每个国家的验证器。

本工具的使用场景

当您需要快速测试且无需 API 集成时,使用本工具。在开发和调试期间,当您需要立即生成有效的测试数据或验证特定 IBAN 验证失败的原因时,它特别有用。它不会替代代码库中的生产级验证库,但比编写一次性测试脚本更快。

常见问题

什么是IBAN,为什么它很重要?

IBAN代表国际银行账号(International Bank Account Number)——这是由国际标准化组织(ISO)创建的标准化格式,旨在减少跨境支付中的错误。在IBAN出现之前,每个国家都使用自己的账号格式,这导致频繁出现错误和转账失败。IBAN通过添加国家代码和校验位来在资金转移之前捕捉错误。

生成的IBAN有多准确?

生成的IBAN在数学上是正确的,并通过ISO 13616中定义的MOD 97验证算法。它们遵循正确的国家特定结构。但是,它们是随机创建的,并不对应真实的银行账户——这正是其目的。它们之所以安全,正是因为它们不会意外命中真实账户。

这个工具支持哪些国家?

目前支持10个欧洲国家:德国、英国、法国、西班牙、意大利、荷兰、瑞士、奥地利、比利时和波兰。这些覆盖了你在欧洲支付系统中最常遇到的IBAN格式。需要其他国家?反馈表单是提出添加请求的最佳方式。

我可以使用生成的IBAN进行实际资金转账吗?

绝对不行。这些仅仅是测试用IBAN。它们通过格式验证,但未连接到真实银行账户。使用它们进行实际交易将导致支付失败或被拒绝。它们仅用于开发、测试和教育目的。

IBAN验证实际是如何工作的?

验证器按顺序运行四项检查:

  1. 国家代码:是否是公认的两字母代码?
  2. 长度:是否符合该国家要求的长度?(德国 = 22,英国 = 22,法国 = 27,等等)
  3. 字符类型:字母和数字是否按照国家格式位于正确位置?
  4. MOD 97检查:根据ISO 7064,数学校验和是否等于1?

如果任何检查失败,你将看到解释具体问题的特定错误消息。

空格在IBAN中重要吗?

对验证来说不重要。IBAN通常以空格(每四个字符一组)显示以提高可读性,但这些空格只是装饰性的。DE89 3704 0044 0532 0130 00DE89370400440532013000在验证目的上是相同的。该工具会自动处理这两种格式。

我的数据会被发送到服务器或存储在某处吗?

不会。所有操作都在浏览器中使用JavaScript运行。没有IBAN数据离开你的机器、接触服务器或存储在任何地方。你可以通过打开浏览器开发工具并观察网络选项卡来验证这一点——在生成或验证IBAN时,你将看不到任何请求。

如果我需要验证未列出的国家的IBAN怎么办?

该工具目前仅支持下拉菜单中的10个国家。添加更多需要实施每个国家特定的格式规则。如果你需要验证挪威、瑞典或其他国家的IBAN,请通过反馈表单告诉我们——我们根据需求优先考虑添加。

为什么格式正确的IBAN会验证失败?

最常见的原因:

  • 不正确的校验位:即使一个错误的数字也会使MOD 97测试失败
  • 打字错误:任何位置的字符转置或错误数字
  • 长度错误:对于该国家来说缺少或多余字符
  • 无效字符:字母出现在只允许数字的地方,反之亦然
  • 不支持的国家:国家代码存在,但不在我们支持的列表中

错误消息将具体告诉你出了什么问题。

我如何报告错误或请求功能?

使用页面底部的反馈表单。具有示例IBAN的具体错误报告最有帮助。对于功能请求,解释你的使用场景有助于确定下一步构建的优先级。

IBAN和SWIFT/BIC代码有什么区别?

IBAN识别特定的银行账户,而SWIFT/BIC代码识别银行或银行分支。可以这样理解:SWIFT代码告诉你是哪个银行,IBAN告诉你是该银行的哪个账户。对于国际转账,你通常需要两者——SWIFT代码路由到正确的银行,然后IBAN路由到特定账户。

不知道国家的情况下可以验证IBAN吗?

可以,因为每个IBAN的前两个字母都是国家代码。验证器读取这两个字符以确定要应用哪种国家格式。这就是为什么粘贴IBAN时会自动检测国家——无需手动选择国家。

欧洲以外的国家有IBAN格式吗?

是的,但数量较少。虽然IBAN起源于欧洲并在那里得到最广泛的采用,但沙特阿拉伯、阿联酋、巴西等国家也已采用。该工具目前专注于欧洲格式,因为它们代表了绝大多数跨境交易。SWIFT IBAN注册表维护完整的列表。

如何读取和解码 IBAN

曾经看到像 DE89370400440532013000 这样的 IBAN 并想知道每个部分的含义吗?以下是如何解码任何 IBAN:

步骤 1:国家代码(前 2 个字符)

  • DE = 德国
  • 告诉你适用哪个国家的格式规则

步骤 2:校验位(接下来的 2 个字符)

  • 89 = 计算的校验和
  • 这些数字使用 MOD 97 验证整个 IBAN 是否有效

步骤 3:银行代码(因国家而异)

  • 德国 IBAN 中的 37040044 = 8 位银行标识符
  • 不同国家使用不同的长度(英国使用 4 个字符)

步骤 4:账号(剩余字符)

  • 0532013000 = 该银行的实际账号
  • 长度和格式取决于国家

不同国家以不同方式组织 BBAN 部分。英国 IBAN 在银行代码和账号之间包含 6 位排序代码(分支标识符)。法国 IBAN 将银行代码、分支代码和账号与校验键组合。理解这些差异对于以编程方式解析 IBAN 至关重要。

常见的 IBAN 验证错误及其修复方法

在实施 IBAN 验证时,您会反复遇到这些问题:

"无效校验位"错误

原因:MOD 97 计算结果不等于 1。校验位可能错误,或 IBAN 中的其他位置存在错误。

修复:在更正任何拼写错误后重新运行验证。即使 IBAN 中的一个字符错误也会导致校验位失败。这是设计使然——它能捕捉数据输入错误。

"国家长度不正确"错误

原因:IBAN 的字符数对于其国家代码来说过多或过少。

修复:验证国家代码是否与预期的国家匹配。德国 IBAN 总是 22 个字符,英国 IBAN 是 22 个,法国是 27 个。缺少或多余的字符表明存在截断或数据不正确。

"无效字符"错误

原因:出现不应出现在该位置的字符——例如在只允许数字的地方出现字母。

修复:检查国家特定的格式。例如,德国 IBAN 在国家代码和校验位之后全是数字,而英国 IBAN 包含 4 个字母作为银行代码。

"不支持的国家代码"错误

原因:前两个字母不是已识别的国家代码,或者不被您的验证器支持。

修复:验证国家代码的拼写。常见的错误包括使用 UK 而不是 GB,或使用 EN 而不是国家代码。此工具支持 10 个欧洲国家;生产验证器应支持所有 SWIFT 注册国家

格式与账户存在

重要区别:验证确认 IBAN 在结构上是正确的,但不意味着账户确实存在。一个 IBAN 可以通过所有验证检查,但仍可能不对应真实的银行账户。对于生产支付系统,您需要超出格式验证的额外验证。

开发者技术实现

如果您正在应用程序中构建 IBAN 支持,以下是多种语言的经过实战检验的代码示例。这些实现处理了生产环境中您会遇到的边缘情况:

IBAN 验证

1function validateIban(iban) {
2  // 删除空格并转换为大写
3  const cleanedIban = iban.replace(/\s/g, '').toUpperCase();
4  
5  // 检查基本格式
6  if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$/.test(cleanedIban)) {
7    return false;
8  }
9  
10  // 重新排列并将字母转换为数字
11  const rearranged = cleanedIban.substring(4) + cleanedIban.substring(0, 4);
12  const converted = rearranged.split('').map(char => {
13    if (/[A-Z]/.test(char)) {
14      return (char.charCodeAt(0) - 55).toString();
15    }
16    return char;
17  }).join('');
18  
19  // 计算 mod 97
20  let remainder = 0;
21  for (let i = 0; i < converted.length; i++) {
22    remainder = (remainder * 10 + parseInt(converted[i], 10)) % 97;
23  }
24  
25  return remainder === 1;
26}
27
28// 使用示例
29console.log(validateIban('DE89 3704 0044 0532 0130 00')); // true
30console.log(validateIban('GB29 NWBK 6016 1331 9268 19')); // true
31console.log(validateIban('DE89 3704 0044 0532 0130 01')); // false (无效的校验位)
32

IBAN 生成

1function generateIban(countryCode) {
2  const countryFormats = {
3    'DE': { length: 22, bbanPattern: '8n10n' },
4    'GB': { length: 22, bbanPattern: '4a6n8n' },
5    'FR': { length: 27, bbanPattern: '5n5n11c2n' }
6    // 根据需要添加更多国家
7  };
8  
9  if (!countryFormats[countryCode]) {
10    throw new Error(`不支持国家代码 ${countryCode}`);
11  }
12  
13  // 根据国家模式生成随机 BBAN
14  let bban = '';
15  const pattern = countryFormats[countryCode].bbanPattern;
16  let i = 0;
17  
18  while (i < pattern.length) {
19    const count = parseInt(pattern.substring(i + 1), 10);
20    const type = pattern[i];
21    
22    if (type === 'n') {
23      // 生成数字字符
24      for (let j = 0; j < count; j++) {
25        bban += Math.floor(Math.random() * 10);
26      }
27    } else if (type === 'a') {
28      // 生成字母字符
29      for (let j = 0; j < count; j++) {
30        bban += String.fromCharCode(65 + Math.floor(Math.random() * 26));
31      }
32    } else if (type === 'c') {
33      // 生成字母数字字符
34      for (let j = 0; j < count; j++) {
35        const isLetter = Math.random() > 0.5;
36        if (isLetter) {
37          bban += String.fromCharCode(65 + Math.floor(Math.random() * 26));
38        } else {
39          bban += Math.floor(Math.random() * 10);
40        }
41      }
42    }
43    
44    i += 2;
45  }
46  
47  // 计算校验位
48  const checkDigits = calculateCheckDigits(countryCode, bban);
49  
50  return countryCode + checkDigits + bban;
51}
52
53function calculateCheckDigits(countryCode, bban) {
54  // 创建初始 IBAN,校验位为 '00'
55  const initialIban = countryCode + '00' + bban;
56  
57  // 重新排列并将字母转换为数字
58  const rearranged = bban + countryCode + '00';
59  const converted = rearranged.split('').map(char => {
60    if (/[A-Z]/.test(char)) {
61      return (char.charCodeAt(0) - 55).toString();
62    }
63    return char;
64  }).join('');
65  
66  // 计算 98 减去 mod 97
67  let remainder = 0;
68  for (let i = 0; i < converted.length; i++) {
69    remainder = (remainder * 10 + parseInt(converted[i], 10)) % 97;
70  }
71  
72  const checkDigits = (98 - remainder).toString().padStart(2, '0');
73  return checkDigits;
74}
75
76// 使用示例
77console.log(generateIban('DE')); // 生成有效的德国 IBAN
78console.log(generateIban('GB')); // 生成有效的英国 IBAN
79

参考文献和进一步阅读

  1. ISO 13616-1:2007 - 官方 IBAN 结构规范
  2. SWIFT IBAN 注册表 - 国家特定 IBAN 格式的权威来源
  3. ISO 7064:2003 - MOD 97 校验位算法规范
  4. 欧洲支付委员会 - SEPA - 单一欧元支付区文档
  5. 欧洲中央银行 - 支付系统 - 欧洲银行业整合标准
  6. 国际清算银行 - 支付系统 - 国际支付系统标准

开始测试 IBAN

需要支付系统的测试数据吗?生成任何支持国家的有效 IBAN,或粘贴现有 IBAN 以验证其结构。该工具完全在您的浏览器中运行 - 无需注册、无需 API 密钥、无数据发送到服务器。

快速提示:从多个国家生成 IBAN 以测试边缘情况。真实世界的支付系统处理多样的格式,仅使用一个国家的格式进行测试是生产中常见的错误源。