面向开发与 QA 的测试 IBAN

验证程序到底检查什么,哪些错误会让 IBAN 处理出问题,以及如何把测试 IBAN 接入您的流水线。

更新于

任何接收、存储或发送 IBAN 的代码都需要测试数据:表单验证、开户流程、数据库测试数据(fixtures)、支付集成、负载测试。真实客户的 IBAN 不该出现在测试环境中,而手工输入的 IBAN 校验位很少是正确的。测试 IBAN(有时也叫假 IBAN 或模拟 IBAN)可以同时解决这两个问题:它能通过结构验证,却没有任何银行发放过它。

验证程序检查什么

IBAN 验证是分层进行的。每一层发现不同的问题,测试 IBAN 只能通过其中一部分。

检查项 验证内容 生成的测试 IBAN
字符 去掉空格后只有字母和数字 通过
国家 前两个字母是使用 IBAN 的国家 通过
长度 长度与该国相符,例如德国为 22 通过
格式 BBAN 每个位置的字符类型(数字或字母)正确 通过
校验位 MOD-97 余数等于 1 通过
国内校验位 BBAN 内的本国规则,例如意大利的 CIN 或法国的 clé RIB 在我们按官方算法计算的 27 个国家中通过;其他国家为随机值,可能不通过
银行目录 银行代码存在 在默认开启的仿真模式下,有真实银行代码的 84 个国家可以通过;其他情况通常不通过
账户查询 账户存在且户名一致 不通过

最后两项检查需要银行的数据。在英国,收款人确认(Confirmation of Payee)会把账户持有人的姓名与付款人输入的姓名进行比对;在欧元区,收款人核验(Verification of Payee)会在转账前做同样的检查。随机 IBAN 无法通过这些检查,也不应该通过。IBAN 中的国内校验位一文逐国介绍了国内校验这一层。

前五项检查,加上规则已知的国内校验位,都不需要外部数据。我们的 IBAN 验证器在您的浏览器中执行这些检查,并显示哪一项未通过。我们的开源 JavaScript 库 iban-check 依据 SWIFT IBAN 注册表执行这五项检查,并返回错误代码,指明哪一项未通过。阿尔及利亚和摩洛哥不在注册表中,因此它会拒绝这两个国家的 IBAN。可在 npm 上以 iban-check 获取。

让 IBAN 处理出错的常见问题

以下是 IBAN 相关代码中反复出现的 bug:

  • 所有国家用同一个长度。 德国 IBAN有 22 个字符,但挪威的只有 15 个,马耳他的有 31 个。应按国家验证长度,不要用一个固定的数字。
  • 国家代码之后只允许数字。 荷兰、英国以及许多其他国家的 IBAN 在 BBAN 中含有字母(NL91ABNA0417164300)。只允许数字的正则表达式会拒绝这些 IBAN。
  • 按打印格式存储。 应以电子格式存储 IBAN,即不带空格并且大写,只在显示时才加空格。
  • 把 IBAN 当作数字。 IBAN 含有字母,BBAN 也可能以 0 开头。请把它存为字符串。
  • MOD-97 计算中的整数溢出。 除挪威和比利时外,转换后的数字都超出 64 位整数的范围(约 19 位),德国 IBAN 转换后有 24 位。请使用任意精度运算,或采用 IBAN 校验位的计算原理中介绍的逐段求余方法。
  • 复制粘贴带来的不可见字符。 用户粘贴的 IBAN 可能带有不换行空格、制表符或换行符。要去掉所有空白字符,不能只去掉普通空格。
  • 小写输入。 有人会输入 de89...。验证之前先转换为大写。

该用哪种测试 IBAN

随机测试 IBAN 适用于大多数测试:表单验证、测试数据(fixtures)、种子数据、负载测试和截图。请使用多个国家的 IBAN,不要只用本国的,这样才能检验对长度和格式的处理;马耳他(31 个字符)这样的长格式和挪威(15 个字符)这样的短格式都是很好的边界测试用例。生成器默认使用仿真模式:只使用数字,并在有数据时使用真实银行的银行代码,账号则是随机的,因此查询银行的代码能找到这家银行。这样的 IBAN 同样没有任何银行发放过,但可能碰巧与某个真实账户一致。关闭“仿真”即可生成完全随机的 IBAN:银行代码也是随机的,适合测试未知银行,格式允许的位置还可能出现字母。

支付服务商通常会发布自己的测试 IBAN,用于在其沙箱环境中触发特定结果,例如扣款成功或扣款失败。如果要对某个服务商的流程做端到端测试,请使用该服务商文档中提供的 IBAN。

切勿在测试、演示或文档中使用真实个人的 IBAN,也切勿向生成的 IBAN 汇款。随机 IBAN 碰巧与真实账户相同的概率非常小,但并不为零。

把测试 IBAN 接入流水线

生成器显示一个 IBAN,并解释其中的各个部分。它的“批量生成”功能可以一次生成同一国家的 5 到 100 个 IBAN,可以直接复制,也可以下载为 CSV、JSON、SQL 或纯文本文件,每个组成部分各占一列。用于自动化测试时:

  • REST API 每次请求可为任意受支持的国家返回最多 100 个有效 IBAN,也可以验证 IBAN。使用 REST API 需要 API 密钥,详见 API 文档。
  • 公开的 MCP 服务器让 AI 智能体和编程助手无需密钥即可生成和验证测试 IBAN。
  • “批量生成”背后的下载是一个普通 URL,无需密钥,脚本可以直接获取测试数据文件(每分钟最多下载 30 次)。
  • 对于必须离线运行的测试,可以先生成一组 IBAN,再作为测试数据(fixtures)提交到代码库。
# 50 个荷兰 IBAN,CSV 格式,无需密钥
curl -o fixtures.csv "https://generaterandomiban.com/export/nl?format=csv&count=50"

# 通过 API 获取 5 个 IBAN,需要密钥
curl -H "X-API-Key: YOUR_KEY" \
  "https://generaterandomiban.com/api/v1/generate/NL?count=5"

资料来源

需要测试 IBAN?

为 91 个国家中的任意一个生成有效 IBAN,按需要的格式复制,并查看每一部分的含义。

打开生成器