【NumberValidators】工商营业执照号码和统一社会信用代码验证

原文:【NumberValidators】工商营业执照号码和统一社会信用代码验证

从本质上讲,工商营业执照号码和统一社会信用代码是两套完全不一样的编码规则,识别结果也仅有行政区划部分为两者共有,但因为这两种编码同时存在的原因,所以如果需要在系统中唯一标志一家企业时,还是可以通过工商营业执照号码或统一社会信用代码来进行识别。

工商营业执照号码长度按工商规定为15位,统一社会信用代码按国家规定是18位,你可以在此类库的验证基础上,通过其它网站(比如企查查)来进一步查验企业是否真实存在。

NumberValidators中,该部分验证相关的内容均在NumberValidators.BusinessRegistrationNos下,你可以在此处查看具体源代码。

IRegistrationNoValidator约定了要实现的验证的规范。

    /// <summary>
    /// 工商注册码/统一社会信用代码验证接口
    /// </summary>
    public interface IRegistrationNoValidator<out TResult> : IValidator<TResult>
        where TResult : RegistrationNoValidationResult, new()
    {
        /// <summary>
        /// 用于验证的行政区划字典数据
        /// </summary>
        IValidationDictionary<int, string> Dictionary { get; set; }
        /// <summary>
        /// 号码长度
        /// </summary>
        RegistrationNoLength RegistrationNoLength { get; }
        /// <summary>
        /// 验证号码是否正确
        /// </summary>
        /// <param name="code">待验证的工商注册码/统一社会信用代码</param>
        /// <param name="validLimit">行政区划验证限制,因为存在工商管理机构代码,所以默认为null</param>
        /// <returns></returns>
        TResult Validate(string code, AreaValidLimit? validLimit = null);
    }

验证结果定义如下:

  • RegistrationNoValidationResult 默认验证结果类
  • RegistrationNo15ValidationResult 工商营业执照特有的验证结果类
  • RegistrationNo18ValidationResult 统一社会信用代码特有的验证结果类

RegistrationNoValidationResult代码如下

    /// <summary>
    /// 注册码通用验证结果类
    /// </summary>
    public class RegistrationNoValidationResult : ValidationResult
    {
        /// <summary>
        /// 行政区划或工商行政管理机关编码
        /// </summary>
        public int AreaNumber { get; internal set; }
        /// <summary>
        /// 身份证颁发行政区域或工商行政管理机关(识别出Depth最深的区域),可通过FullName来获取完整的名称
        /// 注意此处有可能为null
        /// </summary>
        public Area RecognizableArea { get; internal set; }
        /// <summary>
        /// 号码长度
        /// </summary>
        public RegistrationNoLength RegistrationNoLength { get; internal set; }
        /// <summary>
        /// 校验码
        /// </summary>
        public char CheckBit { get; internal set; }
    }

RegistrationNo15ValidationResultRegistrationNoValidationResult的基础上额外包含了工商营业执照专有的识别信息,你可以通过该部分得知该企业是内资企业、外资企业还是个体户

   /// <summary>
    /// 工商行政管理市场主体注册号 专用验证结果类
    /// </summary>
    public class RegistrationNo15ValidationResult : RegistrationNoValidationResult
    {
        /// <summary>
        /// 顺序码
        /// </summary>
        public int SequenceNumber { get; internal set; }
        /// <summary>
        /// 企业类型
        /// </summary>
        public EnterpriseType EnterpriseType
        {
            get
            {
                var comp = this.SequenceNumber / 10000000;
                if (comp <= (int)EnterpriseType.Domestic)
                {
                    return EnterpriseType.Domestic;
                }
                else if (comp <= (int)EnterpriseType.Foreign)
                {
                    return EnterpriseType.Foreign;
                }
                else { return EnterpriseType.Individual; }
            }
        }
    }

RegistrationNo18ValidationResult则是在RegistrationNoValidationResult的基础上额外包含了社会统一信用代码的专有信息,你可以通过该部分信息得知其登记管理部门,以及其组织机构代码

    /// <summary>
    /// 法人和其他组织统一社会信用代码 专用验证结果类
    /// </summary>
    public class RegistrationNo18ValidationResult : RegistrationNoValidationResult
    {
        /// <summary>
        /// 登记管理部门代码标志
        /// </summary>
        public ManagementCode ManagementCode { get; internal set; }
        /// <summary>
        /// 登记管理部门下机构类别代码标志
        /// </summary>
        public ManagementKindCode ManagementKindCode { get; internal set; } = ManagementKindCode.NonSpecific;
        /// <summary>
        /// 组织机构代码,遵循GB/T 11714-1997
        /// </summary>
        public string OrganizationCode { get; internal set; }
    }

可根据IsValid来判断验证是否成功,如果验证失败,Errors 属性则包含了验证失败的原因,具体的错误原因列表如下

    /// <summary>
    /// 错误提示信息类
    /// </summary>
    internal class ErrorMessage
    {
        /// <summary>
        /// 字符串为空
        /// </summary>
        public const string Empty = "工商注册码/统一社会信用代码为空";
        /// <summary>
        /// 号码错误
        /// </summary>
        public const string Error = "错误的工商注册码/统一社会信用代码";
        /// <summary>
        /// 无效的登记管理部门代码
        /// </summary>
        public const string InvalidManagement = "无效的登记管理部门代码";
        /// <summary>
        /// 无效的登记管理部门机构类别代码
        /// </summary>
        public const string InvalidManagementKind = "无效的登记管理部门机构类别代码";
        /// <summary>
        /// 无效的组织机构代码
        /// </summary>
        public const string InvalidOrganizationCode = "无效的组织机构代码";
        /// <summary>
        /// 行政区划识别失败
        /// </summary>
        public const string InvalidArea = "工商管理机关或行政区划识别失败";
        /// <summary>
        /// 错误的校验码
        /// </summary>
        public const string InvalidCheckBit = "错误的校验码";
        /// <summary>
        /// 无效实现
        /// </summary>
        public const string InvalidImplement = "未能找到或无效的 {0} 位工商注册码/统一社会信用代码实现";
        /// <summary>
        /// 长度错误
        /// </summary>
        public const string LengthOutOfRange = "工商注册码/统一社会信用代码非 {0} 位";
    }

同其它验证类一致,RegistrationNoValidatorHelper可自动识别待识别号码究竟为工商营业执照号码还是社会统一信用代码,当然因为有可能待识别号码哪种号码都不是,所以最终识别结果可能为RegistrationNoValidationResultRegistrationNo15ValidationResultRegistrationNo18ValidationResult中的某一种。

最后是简单的使用示例

            Console.WriteLine("***工商注册码/统一社会信用代码***");
            string[] rnArr = { "110108000000016", "91320621MA1MRHG205" };
            foreach (var rn in rnArr)
            {
                var valid = RegistrationNoValidatorHelper.Validate(rn, validLimit: null);
                Console.WriteLine("{0}验证结果:{1} 长度{2} 行政区划名称({3}) 验证结果类型:{4}", rn, valid.IsValid, valid.RegistrationNoLength, valid.RecognizableArea.FullName, valid);
            }
            Console.WriteLine("随机的工商注册码:" + new RegistrationNo15Validator().GenerateRandomNumber());
            Console.WriteLine("随机的统一社会信用代码:" + new RegistrationNo18Validator().GenerateRandomNumber());

原文地址:https://www.cnblogs.com/lonelyxmas/p/10713613.html

时间: 2024-08-02 19:14:32

【NumberValidators】工商营业执照号码和统一社会信用代码验证的相关文章

精准准确的统一社会信用代码正则(js)

参照标准: <GB_32100-2015_法人和其他组织统一社会信用代码编码规则.> 按照编码规则: 统一代码为18位,统一代码由十八位的数字或大写英文字母(不适用I.O.Z.S.V)组成,由五个部分组成: 第一部分(第1位)为登记管理部门代码,9表示工商部门:(数字或大写英文字母) 第二部分(第2位)为机构类别代码;(数字或大写英文字母) 第三部分(第3-8位)为登记管理机关行政区划码:(数字) 第四部分(第9-17位)为全国组织机构代码:(数字或大写英文字母) 第五部分(第18位)为校验码

JS实现统一社会信用代码的效验(组织机构代码效验)

参考原文https://blog.csdn.net/hdhxby/article/details/56015370 部分错误,修改整合了下 想查询数据的,请点击:统一信用代码查询地址 查看效验规则点击: GB 32100-2015 法人和其他组织统一社会信用代码编码规则 代码实现如下,复制后可以直接使用验证. var v =new Tyshyxdm().verify('91331081307655191L');alert(v);//统一社会信用代码function Tyshyxdm() { th

使用js对社会信用代码进行正则验证

注:参考了该博客(https://blog.csdn.net/qq_37142340/article/details/80695187)进行了一些修改,本文验证使用在微信小程序上. 直接贴代码: var 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',

目标爬取社会信用码

目标爬取社会信用码 http://125.35.6.84:81/xk/# 1.首先界面是一个简单的分页查询 2.刷新一下,发现数据是ajax请求的 3.查相关参数 4.点击一条记录进去 5.发现数据也是ajax请求的 6.查看参数发现,是根据之前的ID查询的 7.开始work,首先爬取前面数据的ID,在根据ID爬取社会信用码 import json import requests import re all_count=0 page_count=[1] page_size=15 data_id=

个体工商营业执照PSD素材最新版下载

最新版全套个体营业执照PSD模板 作品简介:个体营业执照模板 位图, CMYK格式高清大图,使用软件为 Photoshop(.psd)营业执照模版 超清原版设计.更清晰.容易修改.采用防伪底纹,分层设计PSD模板. 执照规格为:宽:3389mm 高:5340mm 分辨率为:300 下载地址  http://2.liuy88.cn 模板任意修改:文字 底纹 水印 边框 印章 烫金文字等. 文件以压缩方式打包 包含:PSD模板 电子印章PSD模板 字体包等 作品简介:个体营业执照模板 位图, CMY

统一事件源epoll代码示例

可以将信号注册进pipe管道的写端,通过对读端的监听,来实现统一事件源. #include <sys/types.h> #include <sys/socket.h> #include <sys/epoll.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <signal.

统一的表单验证(jquery+正则)

表单验证一直很繁琐,特别是大点的表单,如果每个input都去单独写验证简直要写死人,最近写了一小段js统一的验证表单内容是否正确. 使用这段代码就不再需要对每个input写格式判断,只需要将正确格式的正则表达式写在datatype里就可以了,提交表单按钮也只需要绑定checkForm函数就可以了. 大家有什么建议可以评论一下 <input type="text" datatype=“正则”/> //作者www.cumt.top //表单验证 //点击下一步事件 functi

身份证号码是否合法,地区性别验证规则

<?php //生日就不用说了,号码前6位可判断地区 //前17位依次乘以此17位数字 总合除以11,余数为身份证最后一位数字(10=2,2=X)此两个数字除外 $arr = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; $result = [0, 1, 10, 3, 4, 5, 6, 7, 8, 9, 'X'=>2]; $code = trim($_GET['code']); $count = 0; foreach ($arr

php提取身份证号码中的生日日期以及验证是否为未成年人的函数

php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位和18位身份证 function getIDCardInfo($IDCard){ $result['error']=0;//0:未知错误,1:身份证格式错误,2:无错误 $result['flag']='';//0标示成年,1标示未成年 $result['tdate']='';//生日,格式如:2012-