/**
 * 统一社会信用代码、纳税人识别号验证规则
 * unified social credit identifier check
 * 参考:
 *   GB 32100-2015
 *   GB 32100-2015《法人和其他组织统一社会信用代码编码规则》国家标准第1号修改单
 *   GB 11714-1997
 * 
 * 其他:如果需要的话,可以自行增加对地区编码的校验,位于第3-8位上
 */

function check(code){
    const regx = /^((1[1239])|(2[19])|(3[123459])|(4[19])|(5[1239])|(6[129])|(7[129])|(8[19])|(9[123])|(A[19])|(N[1239])|(Y1))\d{6}[0-9A-Z]{9}[0-9A-Y]$/
    if(!regx.test(code)){return false;}
    const map = ['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 checkCode = 11-code.substring(8,16).split('').map(x=>['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']
                .indexOf(x))
                .reduce((a,b,i)=>a+b*([3,7,9,10,5,8,4,2][i]),0) % 11;
    checkCode = checkCode===11?'X':checkCode.toString();
    if(checkCode != code[16]){return false;}
    checkCode = 31 -  code.substring(0,17).split('')
                          .map(x=>map.indexOf(x))
                          .reduce((a,b,i)=>a+b*((3**i)%31),0) % 31;
    checkCode = map[checkCode];
    return checkCode == code[17];
}

升级后的代码

/**
     * desc 社会统一信用代码、纳税人识别号验证
     * 统一社会信用代码算法解析: 其实整个算法只是为了对比最后一位数是否正确
      1.声明一个数组(加权因子)以下是数组的元素 1,3, 9,27,19,26,16,17,20,29,25,13,8,24,10,30,28
      2.声明一个0-9A-Z(权重) 没有I、O、S、V、Z的字符串变量str
      3.对传进来的统一社会信用代码进行遍历
      1).取传进来的统一社会信用代码第一位到第十七位循环取
      2)在变量str中检索上面取到的元素值在str的位置下标
      3)计算每一次权重与加权因子相乘之和
      4.权重与加权因子相乘之和除以31求余,31再减去这个余数获得一个值
      5.判断这个值是否等于31,如果相等将这个值重新赋值为0
      6.声明一个0-9A-Z(权重) 没有I、O、S、V、Z 中间已",“隔开的字符串
      7.以这个字符串按照”,"分割成数组 (其实可以直接声明成数组)
      8.再以上面计算获取的值作为下标获取该数组中的一个元素
      9.再获取传进来的统一社会信用代码的最后一位
      10.判断统一社会信用代码的最后一位和从数组中获取的值进行对比,相等就是正确的
     * @param str $code
     * @return boolean
     */
function isCompanyCode($code)
    {
        $patrn = "/^[0-9A-Z]+$/"; //18位校验及大写校验
        if (strlen($code) != 18 || preg_match($patrn, $code) == false) {
            return false;
        }
        $ancode; //统一社会信用代码的每一个值
        $ancodevalue; //统一社会信用代码每一个值的权重
        $total = 0;
        $weightedfactors = array(1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28); //加权因子
        $str = "0123456789ABCDEFGHJKLMNPQRTUWXY"; //不用I、O、S、V、Z
        for ($i = 0; $i < strlen($code) - 1; $i++) {
            $ancode = substr($code, $i, 1);
            if (in_array($ancode, ["I", "O", "S", "Z", "V"])) {
                return false;
            }
            $ancodeValue = strpos($str, $ancode);
            $total = $total + $ancodeValue * $weightedfactors[$i]; //权重与加权因子相乘之和
        }
        $logiccheckcode = 31 - ($total % 31);
        if ($logiccheckcode == 31) {
            $logiccheckcode = 0;
        }
        $weightStr = "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";
        $weightArray = explode(",", $weightStr);
        $logiccheckcode = $weightArray[$logiccheckcode];
        $checkcode = substr($code, 17, 18);
        if ($logiccheckcode != $checkcode) {
            return false;
        }
        return true;
    }

统一社会信用代码、纳税人识别号验证规则相关推荐

  1. 正则表达式验证手机号码、身份证号码、邮箱、统一社会信用代码/营业执照号

    1.  验证手机号码 /^1[3456789]\d{9}$/ 2.  验证身份证号码 /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[ ...

  2. JAVA、PHP身份证、统一社会信用代码算法解析验证

    JAVA.PHP身份证算法解析验证 JAVA身份证号算法解析验证(待更新) JAVA统一社会信用代码算法解析验证(待更新) PHP统一社会信用代码算法解析验证 JAVA.PHP身份证算法解析: 其实上 ...

  3. JAVA、PHP统一社会信用代码、身份证号算法解析验证

    JAVA.PHP统一社会信用代码.身份证号算法解析验证 这是给某机关单位写系统的时候要验证统一社会信用代码用的是PHP写的方法 java的话也是同理有时间我再把java代码贴出来,这就先贴PHP JA ...

  4. ASP.NET 中验证的自定义返回和统一社会信用代码的内置验证实现

    目录 项目演示 创建项目 创建用户注册信息接收类 创建测试 Controller 执行测试 统一错误返回 自定义验证规则 验证规则介绍 编码实现 最后 References 本文介绍 ASP.NET ...

  5. 统一社会信用代码 正则验证

    统一社会信用代码C#正则验证 [1-9A-GY]{1}[1239]{1}[1-5]{1}[0-9]{5}[0-9A-Z]{10} 转载于:https://www.cnblogs.com/Qos8/p/ ...

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

    统一代码的构成 结构 代码及说明 统一社会信用代码来源字符与数值对应关系表 统一社会信用代码相应顺序上对应的加权因子 计算示例 js代码实现 统一社会信用代码:每一个法人和其他组织在全国范围内唯一的. ...

  7. 使用Java校验【统一社会信用代码】真假

    统一社会信用代码校验规则: 定义一个方法判断统一社会信用代码真假: /*** 验证机构代码真假** @param orgCode 组织机构信用代码* @return 真返回true 假返回false* ...

  8. 使用Java校验【统一社会信用代码】的真假

    统一社会信用代码是营业执照注册号.这个是三证合一,一证一码的工商改革结果.  定义一个方法判断统一社会信用代码真假: /*** 验证机构代码真假** @param orgCode 组织机构信用代码* ...

  9. 小程序正则验证 身份证号、统一社会信用代码

    公共方法封装 // util.js页面,封装的公共方法/*** 去掉字符串头尾空格*/ function trim(str) {return str.replace(/(^\s*)|(\s*$)/g, ...

  10. 身份证号与统一社会信用代码的校验

    身份证号与统一社会信用代码的表单校验 一.校验身份证号 <el-form ref="form" :model="form" :rules="ru ...

最新文章

  1. python 将列和索引的值变换_【编辑小组成长日记】Python学习第二期
  2. 【C++】复制构造函数
  3. python和shell哪个快_有没有可能让这个shell脚本更快?
  4. 先有鸡还是先有蛋?--IT公司用人困惑
  5. 微信小程序的z-index在苹果ios无效
  6. 2021年全球知名开源项目大更新
  7. Lecture 20 Parallel Algorithms I
  8. 【转】2.3SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)
  9. c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...
  10. listview的item中嵌套多个EditText时的问题
  11. mysql-使用存储过程一次性批量创建多张表
  12. JSR-303 数据校验学习
  13. Unable to load print control in ReportingService
  14. 如何理解 if __name__ == “__main__“:
  15. 学游戏设计要什么学历_东莞模具设计培训学模具技术有什么好处为什么学模具技术...
  16. 数组指针和指针数组的区别(转)
  17. 遗传算法优化神经网络—MATLAB实现
  18. 渗透测试工具——Metasploit
  19. 2021年《职业防治法》宣传周活动资料海报挂图及职业病知识小手册等
  20. Linux转发性能评估与优化(转发瓶颈分析与解决方案)

热门文章

  1. Python统计字符串中的中英文字符、数字空格,特殊字符 , 空格的个数
  2. STM32 CAN编程详解
  3. 关于嵌入式工程师需要知道的网站
  4. 亚马逊成功的四个关键因素
  5. 深度学习 —— 偏差与方差
  6. windows10磁盘100%解决方法
  7. Java方法重写和重载的区别
  8. PS 图片背景变为透明
  9. 微信小程序-图片放大与缩小
  10. qt 取消按钮点击效果_Qt 对话框里添加确定取消按钮