JS校验统一社会信用代码的真实性

3,993 阅读3分钟

统一社会信用代码:每一个法人和其他组织在全国范围内唯一的、终身不变的法定身份识别码。

法人:具有民事权利能力和民事行为能力,依法独立享有民事权利和承担民事义务的组织

请点击:统一社会信用代码查询地址

请点击:法人和其他组织统一社会信用代码编码规则

统一代码的构成

结构

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

image.png

代码及说明

第1位:登记管理部门代码
登记管理部门代码使用阿拉伯数字或大写英文字母表示。

第2位:机构类别代码
机构类别代码使用阿拉伯数字或大写英文字母表示。

第3位~第8位:登记管理机关行政区划码
共六位阿拉伯数字。

第9位~第17位:主体标识码(组织机构代码)
主体标识码使用阿拉伯数字或大写英文字母表示。

第18位:校验码 image.png

当MOD函数值为1(即C18=30)时,校验码应用符号Y表示;当MOD函数值为0(即C18=31)时,校验码用0表示。

统一社会信用代码来源字符与数值对应关系表

image.png

统一社会信用代码相应顺序上对应的加权因子

image.png

计算示例

image.png

js代码实现

/**
 * 验证统一社会信用代码
 * @param { string } code 统一社会信用代码
 **/
function checkSocialCreditCode(code) {
    let isPass = true // 是否验证通过,默认通过,为true
    let errorMessage = '' // 错误信息

    // 空值直接返回false
    if(!code) {
        isPass = false
        errorMessage = '请输入统一社会信用代码!'
        return {
            isPass,
            errorMessage,
        }
    }

    //18位及正则校验
    const reg = /^\w\w\d{6}\w{9}\w$/
    if ((code.length !== 18) || !reg.test(code)) {
        isPass = false
        errorMessage = '不是有效的统一社会信用代码!'
        return {
            isPass,
            errorMessage,
        }
    }

    const codeOrigin = '0123456789ABCDEFGHJKLMNPQRTUWXY'; // 统一社会信用代码可用字符 不含I、O、S、V、Z
    const weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]; // 统一社会信用代码相对应顺序的加权因子 
    
    let ci; // 统一社会信用代码相应顺序的值
    let wi; // 统一社会信用代码相应顺序的加权因子
    let total = 0; // 计算结果

    // 数值与加权因子相乘之和
    for (let i = 0; i < code.length - 1; i++) {
      ci = codeOrigin.indexOf(code[i]);
      wi = weightedfactors[i];
      total += ci * wi; 
    }

    // 最后一位校验
    let logicCheckCode = 31 - total % 31;
    if (logicCheckCode === 31) logicCheckCode = 0;
    logicCheckCode = codeOrigin[logicCheckCode];
    if (logicCheckCode !== code.slice(17)) {
      isPass = false
      errorMessage = '不是有效的统一社会信用代码!'
    }
    return {
        isPass,
        errorMessage,
    }
}