js校验统一社会信用代码

简介: js校验统一社会信用代码
// 验证 统一社会信用代码
function Tyshyxdm() {
    this.firstarray = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    this.firstkeys = [3, 7, 9, 10, 5, 8, 4, 2];
    this.secondarray = ['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'];
    this.secondkeys = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
    this.verify = function (str) {
        var code = str.toUpperCase();

        /*
        统一社会信用代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成。
         第1位:登记管理部门代码(共一位字符)
         第2位:机构类别代码(共一位字符)
         第3位~第8位:登记管理机关行政区划码(共六位阿拉伯数字)
         第9位~第17位:主体标识码(组织机构代码)(共九位字符)
         第18位:校验码​(共一位字符)
        */
        if (code.length != 18) {
            return false;
        }
        var reg = /^\w\w\d{6}\w{9}\w$/;
        if (!reg.test(code)) {
            return false;
        }
        /*
         登记管理部门代码:使用阿拉伯数字或大写英文字母表示。​
         机构编制:1​
         民政:5​
         工商:9​
         其他:Y
         */
        reg = /^[1,5,9,Y]\w\d{6}\w{9}\w$/;
        if (!reg.test(code)) {
            return false;
        }
        /*
         机构类别代码:使用阿拉伯数字或大写英文字母表示。​
         机构编制机关:11打头​​
         机构编制事业单位:12打头​
         机构编制中央编办直接管理机构编制的群众团体:13打头​​
         机构编制其他:19打头​
         民政社会团体:51打头​
         民政民办非企业单位:52打头​
         民政基金会:53打头​
         民政其他:59打头​
         工商企业:91打头​
         工商个体工商户:92打头​
         工商农民专业合作社:93打头​
         其他:Y1打头​
         */
        reg = /^(11|12|13|19|51|52|53|59|91|92|93|Y1)\d{6}\w{9}\w$/;
        if (!reg.test(code)) {
            return false;
        }
        /*
         登记管理机关行政区划码:只能使用阿拉伯数字表示。按照GB/T 2260编码。​
         例如:四川省成都市本级就是510100;四川省自贡市自流井区就是510302。​
        */
        reg = /^(11|12|13|19|51|52|53|59|91|92|93|Y1)\d{6}\w{9}\w$/;
        if (!reg.test(code)) {
            return false;
        }
        /*
             主体标识码(组织机构代码):使用阿拉伯数字或英文大写字母表示。按照GB 11714编码。
             在实行统一社会信用代码之前,以前的组织机构代码证上的组织机构代码由九位字符组成。格式为XXXXXXXX-Y。前面八位被称为“本体代码”;最后一位被称为“校验码”。校验码和本体代码由一个连字号(-)连接起来。以便让人很容易的看出校验码。但是三证合一后,组织机构的九位字符全部被纳入统一社会信用代码的第9位至第17位,其原有组织机构代码上的连字号不带入统一社会信用代码。
             原有组织机构代码上的“校验码”的计算规则是:​
             例如:某公司的组织机构代码是:59467239-9。那其最后一位的组织机构代码校验码9是如何计算出来的呢?
             第一步:取组织机构代码的前八位本体代码为基数。5 9 4 6 7 2 3 9
             提示:如果本体代码中含有英文大写字母。则A的基数是10,B的基数是11,C的基数是12,依此类推,直到Z的基数是35。
             第二步:​​取加权因子数值。因为组织机构代码的本体代码一共是八位字符。则这八位的加权因子数值从左到右分别是:3、7、9、10、5、8、4、2。​
             第三步:本体代码基数与对应位数的因子数值相乘。​
             5×3=15,9×7=63,4×9=36,6×10=60,
             7×5=35,2×8=16,3×4=12,9×2=18​​
             第四步:将乘积求和相加。​
             15+63+36+60+35+16+12+18=255
             第五步:​将和数除以11,求余数。​​
             255÷11=33,余数是2。​​
          */
        var firstkey = this.calc(code.substr(8), this.firstarray, this.firstkeys, 11);
        /*
         第六步:用阿拉伯数字11减去余数,得求校验码的数值。当校验码的数值为10时,校验码用英文大写字母X来表示;当校验码的数值为11时,校验码用0来表示;其余求出的校验码数值就用其本身的阿拉伯数字来表示。​
         11-2=9,因此此公司完整的组织机构代码为 59467239-9。​​
        */
        var firstword;
        if (firstkey < 10) {
            firstword = firstkey;
        }
        if (firstkey == 10) {
            firstword = 'X';
        } else if (firstkey == 11) {
            firstword = '0';
        }
        if (firstword != code.substr(16, 1)) {
            return false;
        }

        /*
             校验码:使用阿拉伯数字或大写英文字母来表示。校验码的计算方法参照 GB/T 17710。
             例如:某公司的统一社会信用代码为91512081MA62K0260E,那其最后一位的校验码E是如何计算出来的呢?
             第一步:取统一社会信用代码的前十七位为基数。9 1 5 1 2 0 8 1 21 10 6 2 19 0 2 6 0提示:如果前十七位统一社会信用代码含有英文大写字母(不使用I、O、Z、S、V这五个英文字母)。则英文字母对应的基数分别为:A=10、B=11、C=12、D=13、E=14、F=15、G=16、H=17、J=18、K=19、L=20、M=21、N=22、P=23、Q=24、R=25、T=26、U=27、W=28、X=29、Y=30​
             第二步:​​取加权因子数值。因为统一社会信用代码前面前面有十七位字符。则这十七位的加权因子数值从左到右分别是:1、3、9、27、19、26、16、17、20、29、25、13、8、24、10、30、2​8
             第三步:基数与对应位数的因子数值相乘。​
             9×1=9,1×3=3,5×9=45,1×27=27,2×19=38,0×26=0,8×16=128​
             1×17=17,21×20=420,10×29=290,6×25=150,2×13=26,19×8=152​
             0×23=0,2×10=20,6×30=180,0×28=0
             第四步:将乘积求和相加。​9+3+45+27+38+0+128+17+420+290+150+26+152+0+20+180+0=1495
             第五步:​将和数除以31,求余数。​​
             1495÷31=48,余数是17。​​
        */

        var secondkey = this.calc(code, this.secondarray, this.secondkeys, 31);
        /*
         第六步:用阿拉伯数字31减去余数,得求校验码的数值。当校验码的数值为0~9时,就直接用该校验码的数值作为最终的统一社会信用代码的校验码;如果校验码的数值是10~30,则校验码转换为对应的大写英文字母。对应关系为:A=10、B=11、C=12、D=13、E=14、F=15、G=16、H=17、J=18、K=19、L=20、M=21、N=22、P=23、Q=24、R=25、T=26、U=27、W=28、X=29、Y=30
         因为,31-17=14,所以该公司完整的统一社会信用代码为 91512081MA62K0260E。​​
        */
        var secondword = this.secondarray[secondkey];
        if (!secondword || secondword != code.substr(17, 1)) {
            return false;
        }
        var word = code.substr(0, 16) + firstword + secondword;
        if (code != word) {
            return false;
        }
        return true;
    }
    this.calc = function (code, array1, array2, b) {
        var count = 0;
        for (var i = 0; i < array2.length; i++) {
            var a = code[i];
            count += array2[i] * array1.indexOf(a);
        }
        var remainder = count % b;
        return remainder === 0 ? 0 : b - remainder;
    }
}
相关文章
|
2月前
|
安全 区块链
数字货币秒合约/交易所系统开发详细程序/案例项目/需求设计/方案逻辑/源码步骤
The development of a digital currency second contract/exchange system requires the following functions:
|
6月前
|
存储 安全 开发工具
App隐私合规评估实务和要点
随着移动互联网的高速发展及监管部门针对移动互联网应用程序(以下简称“App”)隐私合规监管趋严,特别是在个人信息保护法的实施下。本文将深入探讨App隐私合规评估的要点和难点,提供详细的信息,并提供一套轻量级和自动化的App隐私合规治理方案,降低App业务被通报和下架等合规风险,以保障企业App业务正常运营。
180 0
|
8月前
|
安全 搜索推荐 数据挖掘
区块链分红代理系统开发逻辑部署-附源码规则示例
区块链分红代理系统开发逻辑部署-附源码规则示例
|
6月前
|
存储 关系型数据库 MySQL
(demo)交易所App开发功能|交易所系统开发源码规则解析
(demo)交易所App开发功能|交易所系统开发源码规则解析
|
7月前
|
存储 安全 数据处理
Dapp区块链软件开发丨DAPP源码的逻辑规则解析
DApp 是一种去中心化、开放源码的分布式应用程序。DApp 可以提供多种功能和服务,如智能合约、数字钱包、交易服务、联网身份认证等。DApp 有许多与传统应用程序相似的功能,但其主要特征是去中心化、透明度、程序代码智能、自治性和数据不可篡改性。
|
7月前
|
vr&ar
DeFi流动性质押项目系统开发详细步骤/方案逻辑/案例开发/源码程序
DeFi (Decentralized Finance) pledge mining is a blockchain based financial activity that combines pledge and mining mechanisms. It provides a new way to provide benefits to participants and promote the development of a centralized financial ecosystem.
|
7月前
|
安全 区块链
基于OKExChain的去中心化交易平台KSwap开发规则功能/逻辑源码方案
// 购买数字资产 function buy(uint amount) public payable returns (uint remaining) {【更全面的开发源码搭建可看我昵称】
|
10月前
|
存储 测试技术 区块链
区块链投票系统开发源码规则解析
区块链投票系统开发源码规则解析
|
10月前
|
区块链
持币智能合约质押开发源码规则解析
持币智能合约质押开发源码规则解析
|
10月前
|
安全 区块链 vr&ar
数字货币量化交易/合约交易/合约跟单系统开发逻辑案例/方案项目/设计模板/源码搭建
 Multiple users on the blockchain can jointly participate in the development of smart contracts,and the rights and obligations of both parties are clearly defined in the contract agreement.After both parties agree on the content and objectives of the contract,By developers converting these protocols

热门文章

最新文章