巴西CNPJ生成器和验证工具
使用这个简单的工具生成有效的巴西CNPJ号码,并验证现有号码,专为处理巴西商业身份证的开发人员和测试人员设计。
巴西CNPJ生成器和验证器
CNPJ生成器
生成一个有效的巴西CNPJ号码用于测试。
CNPJ验证器
检查一个巴西CNPJ号码是否有效。
文档
巴西 CNPJ 生成器和验证工具
介绍
巴西 CNPJ(Cadastro Nacional da Pessoa Jurídica) 是分配给巴西企业和法律实体的唯一识别号码。这个巴西 CNPJ 生成器和验证工具提供了一种简单、高效的方式来生成有效的 CNPJ 号码以供测试使用,并根据官方巴西算法验证现有的 CNPJ 号码。无论您是开发人员在测试处理巴西商业数据的应用程序,还是 QA 专业人员在创建测试用例,或是任何与巴西公司信息打交道的人,这个工具都简化了处理 CNPJ 号码的过程。
与由巴西联邦税务局(Receita Federal)正式发放的真实 CNPJ 号码不同,本工具生成的 CNPJ 在数学上是有效的,但并未注册到实际公司。这使得它们非常适合用于测试场景、样本数据和开发环境,在这些环境中,您需要格式正确且有效的 CNPJ 号码,而无需使用真实的商业标识符。
什么是 CNPJ?
CNPJ(Cadastro Nacional da Pessoa Jurídica)是由巴西联邦税务局分配给企业和法律实体的 14 位识别号码。它是巴西公司注册号码或税号的等价物。每个在巴西合法经营的企业都必须拥有一个 CNPJ,用于:
- 税务报告和合规
- 在政府机构注册企业
- 开设银行账户
- 开具发票和收据
- 参与政府招标
- 进出口商品
CNPJ 是巴西商业生态系统中的重要标识符,出现在官方文件、合同和财务记录上。
CNPJ 结构和格式
巴西 CNPJ 由 14 位数字组成,通常格式为:XX.XXX.XXX/YYYY-ZZ
结构分解如下:
- 前 8 位数字(XX.XXX.XXX):分配给公司的基本号码
- 斜杠后的 4 位数字(YYYY):分支标识符(总部为 0001,其他数字为分支)
- 最后 2 位数字(ZZ):用于验证的校验位
例如,一个格式正确的 CNPJ 可能看起来是:12.345.678/0001-95
校验位(最后两个数字)是使用特定的数学算法计算的,该算法验证 CNPJ 的真实性。该算法确保随机生成的数字在不遵循正确的计算方法的情况下无法通过验证。
CNPJ 验证的工作原理
CNPJ 验证算法使用加权计算来确定校验位。其工作原理如下:
第一个校验位计算
- 将前 12 位数字分别乘以权重序列:5、4、3、2、9、8、7、6、5、4、3、2
- 将这些乘法的结果相加
- 计算此总和除以 11 的余数
- 如果余数小于 2,第一个校验位为 0;否则为 11 减去余数
第二个校验位计算
- 将前 13 位数字(包括第一个校验位)分别乘以权重序列:6、5、4、3、2、9、8、7、6、5、4、3、2
- 将这些乘法的结果相加
- 计算此总和除以 11 的余数
- 如果余数小于 2,第二个校验位为 0;否则为 11 减去余数
要使 CNPJ 有效,两个校验位都必须与计算值匹配。
如何使用此工具
我们的巴西 CNPJ 生成器和验证工具提供两个主要功能:生成有效的 CNPJ 和验证现有的 CNPJ 号码。
生成 CNPJ
要生成一个有效的 CNPJ 以供测试:
- 导航到工具的“CNPJ 生成器”部分
- 点击“生成 CNPJ”按钮
- 一个数学上有效的 CNPJ 将出现在格式化显示中
- 使用“复制”按钮将生成的 CNPJ 复制到剪贴板
生成的 CNPJ 将遵循真实 CNPJ 的所有数学验证规则,但未在巴西联邦税务局注册。
验证 CNPJ
要检查 CNPJ 是否在数学上有效:
- 导航到工具的“CNPJ 验证器”部分
- 在输入框中输入您要验证的 CNPJ
- 该工具接受带有或不带格式(点、斜杠和连字符)的 CNPJ
- 点击“验证”按钮
- 工具将显示该 CNPJ 是否有效或无效,基于校验位算法
验证器检查 CNPJ 是否遵循正确的格式,以及校验位是否与验证算法的预期值匹配。
用例
这个巴西 CNPJ 生成器和验证工具在以下场景中特别有用:
软件开发和测试
- 创建测试数据:生成有效的 CNPJ 用于填充测试数据库,而不使用真实的公司标识符
- 单元测试:使用已知的有效和无效示例验证 CNPJ 处理函数
- QA 测试:为需要 CNPJ 输入的表单和界面创建测试用例
- 集成测试:测试与巴西政府服务或金融机构交换数据的系统
教育和培训
- 学习 CNPJ 格式:了解巴西商业标识符的结构
- 算法学习:检查校验位验证的实际工作原理
- 数据验证技术:研究数据验证要求的真实示例
数据处理
- 数据清理:验证现有数据集中 CNPJ 的有效性,以识别潜在错误
- 表单验证:为 CNPJ 输入实现客户端或服务器端验证
- 数据匿名化:在准备数据集以供分析时,用有效生成的 CNPJ 替换真实 CNPJ
国际业务
- 市场准入准备:了解巴西商业识别要求
- 文件准备:在准备巴西商业文件时确保格式正确
- 合规检查:验证收集的 CNPJ 号码至少在数学上是有效的
替代方案
虽然我们的工具提供了一种简单的基于浏览器的解决方案来生成和验证 CNPJ,但根据您的具体需求,还有几种替代方案:
编程库
对于将 CNPJ 验证直接集成到应用程序中的开发人员,有几个特定语言的库可用:
- JavaScript:
cpf_cnpj.js
,validator.js
- Python:
python-cnpj
,validate-docbr
- PHP:
brazilianutils
,respect/validation
- Java:
caelum-stella
,commons-validator
- Ruby:
cpf_cnpj
,brazilian-rails
这些库通常提供额外的功能,如格式化、解析和验证其他巴西文档。
API 服务
对于需要验证而不实现算法的应用程序:
- 巴西政府 API(需要注册)
- 包含 CNPJ 检查的商业验证 API
- 验证与官方数据库的商业信息服务
手动计算
出于教育目的或一次性验证,您可以手动应用算法:
- 提取 CNPJ 的前 12 位数字
- 按照前面描述的方式进行加权计算
- 将计算出的校验位与实际校验位进行比较
然而,手动计算容易出错且效率低下,不适合常规使用。
技术实现
本工具中的 CNPJ 生成器和验证器是使用 JavaScript 实现的,使其快速且能够完全在您的浏览器中运行,而无需将您的数据发送到服务器。以下是核心功能的工作原理:
CNPJ 生成算法
1function generateCNPJ() {
2 // 随机生成前 12 位数字
3 const digits = Array.from({ length: 12 }, () => Math.floor(Math.random() * 10));
4
5 // 计算第一个校验位
6 const firstCheckDigit = calculateCheckDigit(digits);
7 digits.push(firstCheckDigit);
8
9 // 计算第二个校验位
10 const secondCheckDigit = calculateCheckDigit(digits);
11 digits.push(secondCheckDigit);
12
13 // 格式化 CNPJ
14 return formatCNPJ(digits.join(''));
15}
16
17function calculateCheckDigit(digits) {
18 const weights = digits.length < 13
19 ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
20 : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
21
22 const sum = digits.reduce((acc, digit, index) => {
23 return acc + digit * weights[index];
24 }, 0);
25
26 const remainder = sum % 11;
27 return remainder < 2 ? 0 : 11 - remainder;
28}
29
CNPJ 验证算法
1function validateCNPJ(cnpj) {
2 // 移除非数字字符
3 const cleanCNPJ = cnpj.replace(/\D/g, '');
4
5 // 检查是否具有正确的长度
6 if (cleanCNPJ.length !== 14) return false;
7
8 // 检查已知的无效模式(所有相同数字)
9 if (/^(\d)\1+$/.test(cleanCNPJ)) return false;
10
11 // 转换为数字数组
12 const digits = cleanCNPJ.split('').map(Number);
13
14 // 检查第一个验证位
15 const expectedFirstDigit = calculateCheckDigit(digits.slice(0, 12));
16 if (digits[12] !== expectedFirstDigit) return false;
17
18 // 检查第二个验证位
19 const expectedSecondDigit = calculateCheckDigit(digits.slice(0, 13));
20 if (digits[13] !== expectedSecondDigit) return false;
21
22 return true;
23}
24
CNPJ 格式化函数
1function formatCNPJ(cnpj) {
2 // 移除非数字字符
3 const cleanCNPJ = cnpj.replace(/\D/g, '');
4
5 // 根据长度格式化
6 if (cleanCNPJ.length <= 2) {
7 return cleanCNPJ;
8 } else if (cleanCNPJ.length <= 5) {
9 return `${cleanCNPJ.slice(0, 2)}.${cleanCNPJ.slice(2)}`;
10 } else if (cleanCNPJ.length <= 8) {
11 return `${cleanCNPJ.slice(0, 2)}.${cleanCNPJ.slice(2, 5)}.${cleanCNPJ.slice(5)}`;
12 } else if (cleanCNPJ.length <= 12) {
13 return `${cleanCNPJ.slice(0, 2)}.${cleanCNPJ.slice(2, 5)}.${cleanCNPJ.slice(5, 8)}/${cleanCNPJ.slice(8)}`;
14 } else {
15 return `${cleanCNPJ.slice(0, 2)}.${cleanCNPJ.slice(2, 5)}.${cleanCNPJ.slice(5, 8)}/${cleanCNPJ.slice(8, 12)}-${cleanCNPJ.slice(12, 14)}`;
16 }
17}
18
这些核心功能可以在其他编程语言中实现,遵循相同的逻辑。以下是 Python 和 Java 的示例:
Python 实现
1import random
2
3def calculate_check_digit(digits):
4 weights = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] if len(digits) < 13 else [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
5
6 total = 0
7 for i in range(len(digits)):
8 total += digits[i] * weights[i]
9
10 remainder = total % 11
11 return 0 if remainder < 2 else 11 - remainder
12
13def generate_cnpj():
14 # 随机生成前 12 位数字
15 digits = [random.randint(0, 9) for _ in range(12)]
16
17 # 计算第一个校验位
18 first_check = calculate_check_digit(digits)
19 digits.append(first_check)
20
21 # 计算第二个校验位
22 second_check = calculate_check_digit(digits)
23 digits.append(second_check)
24
25 # 格式化 CNPJ
26 cnpj = ''.join(map(str, digits))
27 return f"{cnpj[:2]}.{cnpj[2:5]}.{cnpj[5:8]}/{cnpj[8:12]}-{cnpj[12:]}"
28
29def validate_cnpj(cnpj):
30 # 移除非数字字符
31 cnpj = ''.join(filter(str.isdigit, cnpj))
32
33 # 检查长度
34 if len(cnpj) != 14:
35 return False
36
37 # 检查所有数字是否相同
38 if len(set(cnpj)) == 1:
39 return False
40
41 # 转换为整数列表
42 digits = [int(d) for d in cnpj]
43
44 # 验证第一个校验位
45 first_check = calculate_check_digit(digits[:12])
46 if digits[12] != first_check:
47 return False
48
49 # 验证第二个校验位
50 second_check = calculate_check_digit(digits[:13])
51 if digits[13] != second_check:
52 return False
53
54 return True
55
Java 实现
1import java.util.Random;
2
3public class CNPJUtils {
4
5 public static String generateCNPJ() {
6 Random random = new Random();
7 int[] digits = new int[14];
8
9 // 随机生成前 12 位数字
10 for (int i = 0; i < 12; i++) {
11 digits[i] = random.nextInt(10);
12 }
13
14 // 计算第一个校验位
15 digits[12] = calculateCheckDigit(digits, 12);
16
17 // 计算第二个校验位
18 digits[13] = calculateCheckDigit(digits, 13);
19
20 // 格式化 CNPJ
21 return String.format("%02d.%03d.%03d/%04d-%02d",
22 digits[0] * 10 + digits[1],
23 digits[2] * 100 + digits[3] * 10 + digits[4],
24 digits[5] * 100 + digits[6] * 10 + digits[7],
25 digits[8] * 1000 + digits[9] * 100 + digits[10] * 10 + digits[11],
26 digits[12] * 10 + digits[13]);
27 }
28
29 private static int calculateCheckDigit(int[] digits, int length) {
30 int[] weights = length < 13
31 ? new int[]{5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2}
32 : new int[]{6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
33
34 int sum = 0;
35 for (int i = 0; i < length; i++) {
36 sum += digits[i] * weights[i];
37 }
38
39 int remainder = sum % 11;
40 return remainder < 2 ? 0 : 11 - remainder;
41 }
42
43 public static boolean validateCNPJ(String cnpj) {
44 // 移除非数字字符
45 cnpj = cnpj.replaceAll("\\D", "");
46
47 // 检查长度
48 if (cnpj.length() != 14) {
49 return false;
50 }
51
52 // 检查所有数字是否相同
53 boolean allDigitsSame = true;
54 for (int i = 1; i < cnpj.length(); i++) {
55 if (cnpj.charAt(i) != cnpj.charAt(0)) {
56 allDigitsSame = false;
57 break;
58 }
59 }
60 if (allDigitsSame) {
61 return false;
62 }
63
64 // 转换为整数数组
65 int[] digits = new int[14];
66 for (int i = 0; i < 14; i++) {
67 digits[i] = Character.getNumericValue(cnpj.charAt(i));
68 }
69
70 // 验证第一个校验位
71 int firstCheck = calculateCheckDigit(digits, 12);
72 if (digits[12] != firstCheck) {
73 return false;
74 }
75
76 // 验证第二个校验位
77 int secondCheck = calculateCheckDigit(digits, 13);
78 if (digits[13] != secondCheck) {
79 return false;
80 }
81
82 return true;
83 }
84}
85
重要注意事项
使用此 CNPJ 生成器和验证工具时,请记住以下注意事项:
法律和道德考虑
- 不得用于欺诈:生成的 CNPJ 不应被用于欺诈目的或虚假陈述
- 仅供测试:这些 CNPJ 仅用于测试和开发目的
- 未注册:生成的 CNPJ 在巴西联邦税务局未注册
- 无真实有效性:它们不能用于实际的商业注册或税务目的
技术限制
- 无商业信息:生成的 CNPJ 不包含真实的商业部门代码或位置信息
- 无数据库验证:验证器仅检查数学有效性,而不检查注册状态
- 格式变体:虽然工具处理常见的格式变体,但某些系统可能需要特定格式
安全考虑
- 客户端处理:所有处理在您的浏览器中进行;没有数据发送到服务器
- 无数据存储:生成的 CNPJ 不会被存储或记录
- 无个人数据:该工具不处理或处理任何个人信息
常见问题
CNPJ 在巴西用于什么?
CNPJ 是巴西企业和法律实体的国家注册号码。它用于税务、商业注册、开设银行账户和在官方交易中识别公司。
本工具生成的 CNPJ 真实吗?
不。该工具生成的 CNPJ 在数学上根据校验位算法是有效的,但未在巴西联邦税务局注册,并不属于真实公司。
我可以使用生成的 CNPJ 来做我的生意吗?
不。要获得合法的 CNPJ,您必须按照官方流程在巴西联邦税务局注册。生成的 CNPJ 仅用于测试目的。
我如何判断一个 CNPJ 是否属于真实公司?
要验证一个 CNPJ 是否注册到实际公司,您需要查询巴西联邦税务局数据库。我们的工具仅检查 CNPJ 是否在数学上有效,而不检查其是否正式注册。
为什么验证器拒绝所有数字相同的 CNPJ?
所有数字相同的 CNPJ(如 11.111.111/1111-11)会被自动认为无效,即使它们数学上通过了校验位算法。这是巴西联邦税务局设定的规则。
工具是否存储我生成或验证的 CNPJ?
不。所有处理在您的浏览器中进行,我们不会存储或传输您生成或验证的任何 CNPJ。
我可以一次生成多个 CNPJ 吗?
当前版本的工具一次生成一个 CNPJ。对于批量生成,您可能需要考虑使用替代方案中提到的编程库。
为什么格式 XX.XXX.XXX/XXXX-XX 重要?
这是巴西当局要求的官方格式。特定的分组有助于识别 CNPJ 的不同组成部分,例如基本号码和分支标识符。
我如何以编程方式验证 CNPJ?
您可以使用技术实现部分提供的代码示例在您选择的编程语言中实现验证算法,或使用替代方案部分提到的库。
政府实体是否有特殊的 CNPJ?
是的。巴西的政府实体有特定的 CNPJ 模式。例如,联邦政府实体通常以特定数字开头。我们的生成器生成随机 CNPJ,并不特别生成政府实体的 CNPJ。
参考文献
- 巴西联邦税务局(Receita Federal do Brasil) - 官方网站
- “CNPJ - Cadastro Nacional da Pessoa Jurídica” - 维基百科
- 巴西民法典(法律第 10.406/2002 号) - 巴西企业实体的法律框架
- 巴西商业注册规范指令(IN RFB 第 1863/2018 号) - CNPJ 注册的规定
立即尝试
我们的巴西 CNPJ 生成器和验证工具使得处理这些识别号码变得简单高效。无论您是在测试应用程序、准备样本数据,还是验证现有 CNPJ,这个工具都提供了一个简单的解决方案,而无需复杂的 API 集成或高级配置。
现在生成您的第一个有效 CNPJ,或使用我们的简单界面验证现有的 CNPJ!
反馈
点击反馈提示开始给这个工具反馈