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

工商营业执照号码长度按工商规定为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; }
}

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

   /// <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可自动识别待识别号码究竟为工商营业执照号码还是社会统一信用代码,当然因为有可能待识别号码哪种号码都不是,所以最终识别结果可能为RegistrationNoValidationResult、RegistrationNo15ValidationResult和RegistrationNo18ValidationResult中的某一种。

最后是简单的使用示例

            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());

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

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

    参照标准: <GB_32100-2015_法人和其他组织统一社会信用代码编码规则.> 按照编码规则: 统一代码为18位,统一代码由十八位的数字或大写英文字母(不适用I.O.Z.S.V)组成 ...

  2. 统一社会信用代码+组织机构代码 校验 python

    转自: https://blog.csdn.net/warrah/article/details/69338912 https://blog.csdn.net/qq_37142340/article/ ...

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

    参考原文https://blog.csdn.net/hdhxby/article/details/56015370 部分错误,修改整合了下 想查询数据的,请点击:统一信用代码查询地址 查看效验规则点击 ...

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

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

  5. js验证营业执照号码是否合规

    需求:最近要做实名验证的功能,但是验证我们要验证严谨一点,参考了网上关于营业执照号码规则和一些大侠的代码的代码,总结一下. 营业执照号码规则:规则 代码: //方法一:function checkLi ...

  6. 企业工商营业执照副本模板PSD源文件素材下载

    企业工商营业执照副本PSD模板下载地址: http://www.qijieworld.com/thread-1911181-1-1.html 模板为psd格式内容可编辑修改,需使用 Photoshop ...

  7. 用 Prettier 统一团队的代码风格~

    使用 prettier 自動調整 JavaScript 樣式 GFM 格式说明 为什么你不能缺少Linter(以及代码美化工具) 使用 prettier 自動調整 JavaScript 樣式 Reac ...

  8. C# 获取社会统一信用代码

    时间不多,废话少说: 网络请求代码如下: using System; using System.Collections.Generic; using System.Linq; using System ...

  9. 【转】身份证号码校验与信息提取 - Java 代码

    转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148 import java.util.regex.*;   /**   ...

随机推荐

  1. 全面了解HTTP请求方法说明

    超文本传输协议(HTTP, HyperText Transfer Protocol)是一种无状态的协议,它位于OSI七层模型的传输层.HTTP客户端会根据需要构建合适的HTTP请求方法,而HTTP服务 ...

  2. centos php 运行环境搭建

    一.安装apache httpd rpm -qa|grep httpd //检查是否安装apache rpm -e 包名 --nodeps //若有则删除 PS:我没有删除,直接用的服务器原来的. y ...

  3. JDK8集合类源码解析 - HashMap

    java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap.Hashtable.LinkedHashMap和TreeMap HashMap ...

  4. 【UI测试】--菜单位置

  5. https的名词解释

    原文 http://www.cnblogs.com/guogangj/p/4118605.html 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等) ...

  6. 一窥kbmmw中的 smart service

    在kbmmw 的新版中(还没有发布),将会有一个叫做smart service 的服务.这种服务的属性基于服务器端,并且可以自动注册服务名,下面就是一个简单例子代码.这个服务里面有有三个发布的函数:e ...

  7. kbmMW均衡负载与容灾(3)(转载红鱼儿)

    在kbmMW均衡负载与容灾(1)中,介绍了利用ClientTransport的OnReconnect事件,对联接的应用服务器的地址进行更换,做容灾处理.实际上,作者还给我们提供了另外一种机制,直接在C ...

  8. Linux服务器上新增开放端口号

    开放端口的方法: 方法一:命令行方式               1. 开放端口命令: /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT    ...

  9. Javascript php 异常捕获

    JavaScript try 语句允许我们定义在执行时进行错误测试的代码块. catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块. JavaScript 语句 try 和 cat ...

  10. 微信小程序设置全局字体

    微信小程序设置全局css,需要在app.wxss文件中设置page的样式 page { font-family:"PingFangSC-Thin"; font-size:32rpx ...