使用这个简单的工具生成有效的巴西CNPJ号码,并验证现有号码,专为处理巴西商业身份证的开发人员和测试人员设计。
生成一个有效的巴西CNPJ号码用于测试。
检查一个巴西CNPJ号码是否有效。
巴西 CNPJ(Cadastro Nacional da Pessoa Jurídica) 是分配给巴西企业和法律实体的唯一识别号码。这个巴西 CNPJ 生成器和验证工具提供了一种简单、高效的方式来生成有效的 CNPJ 号码以供测试使用,并根据官方巴西算法验证现有的 CNPJ 号码。无论您是开发人员在测试处理巴西商业数据的应用程序,还是 QA 专业人员在创建测试用例,或是任何与巴西公司信息打交道的人,这个工具都简化了处理 CNPJ 号码的过程。
与由巴西联邦税务局(Receita Federal)正式发放的真实 CNPJ 号码不同,本工具生成的 CNPJ 在数学上是有效的,但并未注册到实际公司。这使得它们非常适合用于测试场景、样本数据和开发环境,在这些环境中,您需要格式正确且有效的 CNPJ 号码,而无需使用真实的商业标识符。
CNPJ(Cadastro Nacional da Pessoa Jurídica)是由巴西联邦税务局分配给企业和法律实体的 14 位识别号码。它是巴西公司注册号码或税号的等价物。每个在巴西合法经营的企业都必须拥有一个 CNPJ,用于:
CNPJ 是巴西商业生态系统中的重要标识符,出现在官方文件、合同和财务记录上。
巴西 CNPJ 由 14 位数字组成,通常格式为:XX.XXX.XXX/YYYY-ZZ
结构分解如下:
例如,一个格式正确的 CNPJ 可能看起来是:12.345.678/0001-95
校验位(最后两个数字)是使用特定的数学算法计算的,该算法验证 CNPJ 的真实性。该算法确保随机生成的数字在不遵循正确的计算方法的情况下无法通过验证。
CNPJ 验证算法使用加权计算来确定校验位。其工作原理如下:
要使 CNPJ 有效,两个校验位都必须与计算值匹配。
我们的巴西 CNPJ 生成器和验证工具提供两个主要功能:生成有效的 CNPJ 和验证现有的 CNPJ 号码。
要生成一个有效的 CNPJ 以供测试:
生成的 CNPJ 将遵循真实 CNPJ 的所有数学验证规则,但未在巴西联邦税务局注册。
要检查 CNPJ 是否在数学上有效:
验证器检查 CNPJ 是否遵循正确的格式,以及校验位是否与验证算法的预期值匹配。
这个巴西 CNPJ 生成器和验证工具在以下场景中特别有用:
虽然我们的工具提供了一种简单的基于浏览器的解决方案来生成和验证 CNPJ,但根据您的具体需求,还有几种替代方案:
对于将 CNPJ 验证直接集成到应用程序中的开发人员,有几个特定语言的库可用:
cpf_cnpj.js
,validator.js
python-cnpj
,validate-docbr
brazilianutils
,respect/validation
caelum-stella
,commons-validator
cpf_cnpj
,brazilian-rails
这些库通常提供额外的功能,如格式化、解析和验证其他巴西文档。
对于需要验证而不实现算法的应用程序:
出于教育目的或一次性验证,您可以手动应用算法:
然而,手动计算容易出错且效率低下,不适合常规使用。
本工具中的 CNPJ 生成器和验证器是使用 JavaScript 实现的,使其快速且能够完全在您的浏览器中运行,而无需将您的数据发送到服务器。以下是核心功能的工作原理:
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
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
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 的示例:
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
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(如 11.111.111/1111-11)会被自动认为无效,即使它们数学上通过了校验位算法。这是巴西联邦税务局设定的规则。
不。所有处理在您的浏览器中进行,我们不会存储或传输您生成或验证的任何 CNPJ。
当前版本的工具一次生成一个 CNPJ。对于批量生成,您可能需要考虑使用替代方案中提到的编程库。
这是巴西当局要求的官方格式。特定的分组有助于识别 CNPJ 的不同组成部分,例如基本号码和分支标识符。
您可以使用技术实现部分提供的代码示例在您选择的编程语言中实现验证算法,或使用替代方案部分提到的库。
是的。巴西的政府实体有特定的 CNPJ 模式。例如,联邦政府实体通常以特定数字开头。我们的生成器生成随机 CNPJ,并不特别生成政府实体的 CNPJ。
我们的巴西 CNPJ 生成器和验证工具使得处理这些识别号码变得简单高效。无论您是在测试应用程序、准备样本数据,还是验证现有 CNPJ,这个工具都提供了一个简单的解决方案,而无需复杂的 API 集成或高级配置。
现在生成您的第一个有效 CNPJ,或使用我们的简单界面验证现有的 CNPJ!