前端校验统一社会信用代码

统一社会信用代码规则

  1. 由18位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成;
    第1位~第2位、第9位~第18位
     
    [0-9A-HJ-NP-RT-UW-Y]
  2. 第3位~第8位,由阿拉伯数字表示;
     
    [0-9]{6}
  3. 第18位校验码,按照公式计算得出;

代码

function isUnifiedSocialCreditCode(code, loose=false){
  if(!code || code.length !== 18) return false;

  // 正则:1-2位=>数字或者字母;3-8位=>数字;9-18位=>数字或者字母
  const pattern = /^([0-9A-HJ-NP-RT-UW-Y]){2}([0-9]){6}([0-9A-HJ-NP-RT-UW-Y]{10})$/;
  if(!pattern.test(code)){
    return false;
  }
  // 如果是宽松校验,此时返回true
  if(loose){
    return true;
  }
  // 严格校验,开始校验第18位的校验码
  let code17 = code.substr(0,17); // 截取前17位
  let code18 = code.substr(17,1); // 第18位校验码
  
  // 加权因子
  const WEIGHT_FACTORS = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
  // 字符集,数组下标表示数值
  const CHARACTER_SET = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y'];
  // 求和
  let codeList = code17.split('');
  let sum = 0;
  codeList.forEach((ele, i)=>{
    let index = CHARACTER_SET.findIndex(row=>row==ele);
    sum += (index * WEIGHT_FACTORS[i])
  })
  // 求余数
  let MOD = sum%31;
  // 求校验码
  let checkCode = CHARACTER_SET[31 - MOD];
  return checkCode == code18
}

let codeQuJuDe = '91110000101623741K'; // 测试全聚德信用码
let changFengHospital = '911101066976941872'; // 测试北京长峰医院信用码
let xiaMen = '91350211M0000XUF46'; // 厦门云上晴空航空科技有限公司,这个虽然是正常存在的,但是校验不通过


console.log(isUnifiedSocialCreditCode(codeQuJuDe)); // true
console.log(isUnifiedSocialCreditCode(changFengHospital)); // true

console.log(isUnifiedSocialCreditCode(xiaMen)); // false
console.log(isUnifiedSocialCreditCode(xiaMen, true)); // true

异常

按照国标,校验《厦门云上晴空航空科技有限公司》公司的信用码91350211M0000XUF46,但是校验不通过。因此引入宽松校验,宽松校验不校验第18位的校验码。

国标摘要

统一代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成,包括第一位等级管理部门代码、第2位机构类别代码、第3位~第8位登记管理机关行政区划码、第9位-第17位主体标志码、第18位校验码五个部分。

代码序号

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

代码

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

说明

登记管理部门代码1位

机构类别代码1位

登记管理机关行政区划码6位

主体标识码(组织机构代码)9位

校验码1位

规则

数字或者大写英文字母

数字

数字或者大写英文字母

代码字符集:

0~9

A

B

C

D

E

F

G

H

J

K

L

M

N

P

Q

R

T

U

W

X

Y

0~9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

参考资料

国标在线https://www.samr.gov.cn/djzcj/zyfb/zjfb/201612/t20161208_282195.html

📎GB 32100-2015 法人和其他组织统一社会信用代码编码规则.pdfhttps://www.yuque.com/attachments/yuque/0/2023/pdf/2394966/1681973967896-78c62bcd-d95b-4108-9924-7bb626bb5950.pdf

企查查https://www.qcc.com/

全国组织机构统一社会信用代码查询平台https://www.cods.org.cn/

### 支持统一社会信用代码校验的开源库和工具 统一社会信用代码校验在企业开发中是一个常见需求,尤其是在企业注册、资质验证等业务场景中。为简化开发流程,提高代码复用性和开发效率,许多开源项目已经集成了统一社会信用代码校验功能。 例如,在一个基于 Java 的开源项目 youlai-mall 中,通过 `Validator.isCreditCode("91440300701234567A")` 可以直接对统一社会信用代码进行校验[^1]。这种封装方式使得开发者无需手动实现完整的校验逻辑,即可快速完成校验任务。 此外,GitHub 上的许多 Java 工具类库也提供了统一社会信用代码校验功能。例如常见的工具类库包括 Apache Commons Validator、Hutool、Lombok 等,它们通常通过静态方法提供校验支持。以下是一个基于 Hutool 的示例代码: ```java import cn.hutool.core.util.IdcardUtil; public class CreditCodeValidator { public static boolean validate(String code) { // Hutool 提供的统一社会信用代码校验方法 return IdcardUtil.isValidCredit(code); } public static void main(String[] args) { String code = "91310115MA1K3YJ123"; if (validate(code)) { System.out.println("校验通过"); } else { System.out.println("校验失败"); } } } ``` 在 Python 领域,开发者可以通过自定义函数实现统一社会信用代码校验逻辑,如以下代码所示: ```python def validate_social_credit_code(code): if len(code) != 18: return False check_table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" weight = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28] total = 0 for i in range(17): total += (check_table.index(code[i]) * weight[i]) % 31 check_value = (31 - total % 31) % 31 return code[17] == check_table[check_value] code = "91310115MA1K3YJ123" if validate_social_credit_code(code): print("校验通过") else: print("校验失败") ``` 对于前端开发JavaScript 同样可以通过正则表达式和自定义函数实现校验逻辑。以下是一个简单的实现示例: ```javascript function validateSocialCreditCode(code) { const pattern = /^[0-9A-Z]{18}$/; if (!pattern.test(code)) return false; const checkTable = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const weight = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]; let total = 0; for (let i = 0; i < 17; i++) { total += (checkTable.indexOf(code[i]) * weight[i]) % 31; } const checkValue = (31 - total % 31) % 31; return code[17] === checkTable[checkValue]; } const code = "91310115MA1K3YJ123"; console.log(validateSocialCreditCode(code) ? "校验通过" : "校验失败"); ``` 这些开源库和工具极大地简化了统一社会信用代码校验流程,开发者可以根据项目的技术栈选择合适的工具或库进行集成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值