政策依据
为深入贯彻落实党中央、国务院关于推进社会信用体系建设决策部署,进一步推动社会信用体系建设高质量发展。国务院印发《国务院关于批转发展改革委等部门法人和其他组织统一社会信用代码制度建设总体方案的通知》明确了法人和其他组织统一社会信用代码的顶层制度设计和具体工作要求,确立了统一社会信用代码的管理机制和地位。
标准支撑
国家标准委先后颁布了强制性国家标准《法人和其他组织统一社会信用代码编码规则》以及《法人和其他组织统一社会信用代码赋码操作规范》、《法人和其他组织统一社会信用代码数据交换接口》等一系列标准,明确了法人和其他组织统一社会信用代码的编码要求,规范赋码、数据交换等技术要求。
统一社会信用代码构成
统一社会信用代码设计为18位,由登记管理部门代码、机构类别代码、登记管理机关行政区划码、主体标识码(组织机构代码)、校验码五部分组成。

第一部分(第1位)
登记管理部门代码,使用阿拉伯数字或英文字母表示。例如:机构编制、民政、市场监管三个登记管理部门分别使用1、5、9表示。
| 登记管理部门 | 代码标识 |
|---|---|
| 机构编制 | 1 |
| 外交 | 2 |
| 司法行政 | 3 |
| 文化 | 4 |
| 民政 | 5 |
| 旅游 | 6 |
| 宗教 | 7 |
| 工会 | 8 |
| 工商 | 9 |
| 中央军委改革和编制办公室 | A |
| 农业 | N |
| 其他 | Y |
第二部分(第2位)
机构类别代码,使用阿拉伯数字或英文字母表示。登记管理部门根据管理职能,确定在本部门登记的机构类别编码。例如,市场监管部门使用1表示企业,2表示个体工商户,3表示农民专业合作社。
| 登记管理部门 | 机构类别 | 代码标识 |
|---|---|---|
| 机构编制 | 机关 | 1 |
| 事业单位 | 2 | |
| 编办直接管理机构编制的群众团体 | 3 | |
| 其他 | 9 | |
| 外交 | 外国常驻新闻机构 | 1 |
| 其他 | 9 | |
| 司法行政 | 律师执业机构 | 1 |
| 公证处 | 2 | |
| 基层法律服务所 | 3 | |
| 司法鉴定机构 | 4 | |
| 仲裁委员会 | 5 | |
| 其他 | 9 | |
| 文化 | 外国在华文化中心 | 1 |
| 其他 | 9 | |
| 民政 | 社会团体 | 1 |
| 民办非企业单位 | 2 | |
| 基金会 | 3 | |
| 其他 | 9 | |
| 旅游 | 外国旅游部门常驻代表机构 | 1 |
| 港澳台地区旅游部门常驻内地(大陆)代表机构 | 2 | |
| 其他 | 9 | |
| 宗教 | 宗教活动场所 | 1 |
| 宗教院校 | 2 | |
| 其他 | 9 | |
| 工会 | 基层工会 | 1 |
| 其他 | 9 | |
| 工商 | 企业 | 1 |
| 个体工商户 | 2 | |
| 农民专业合作社 | 3 | |
| 中央军委改革和编制办公室 | 军队事业单位 | 1 |
| 其他 | 9 | |
| 农业 | 组级集体经济组织 | 1 |
| 村级集体经济组织 | 2 | |
| 乡镇级集体经济组织 | 3 | |
| 其他 | 9 | |
| 其他 | 1 |
第三部分(第3-8位)
登记管理机关行政区划码,使用阿拉伯数字表示。例如:国家用100000,北京用110000。既满足登记管理部门按地区管理需求,也便于社会对注册登记主体所在区域进行识别。(参照《中华人民共和国行政区划代码〔GB/T 2260-2007〕》)
第四部分(第9-17位)
主体标识码(组织机构代码),使用阿拉伯数字或英文字母表示。(参照《全国组织机构代码编制规则〔GB 11714-1997〕》)
第五部分(第18位)
校验码。使用阿拉伯数字或英文字母表示。
统一社会信用代码特性
- 唯一性 统一社会信用代码及其9位主体标识码(组织机构代码)在全国范围内是唯一的
- 兼容性 无含义代码稳定可靠,有含义代码分类管理
- 稳定性 统一社会信用代码一经赋予,主体存续期间,始终保持不变
- 全覆盖 全国范围内依法设立登记的法人和其他组织,统一社会信用代码全覆盖
Java校验工具
package;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
/**
*
* 组织机构代码/统一社会信用代码校验工具类
*
* 1.isUniformSocialCreditCode方法用于判断统一社会信用代码是否有效
* 2.isOrganizationCertificate方法用于判断组织机构代码是否有效
*
*/
public class RegexUtil {
private static final String BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY";
private static final char[] BASE_CODE_ARRAY = BASE_CODE_STRING.toCharArray();
private static final List < Character > BASE_CODES = new ArrayList < Character > ();
private static final String BASE_CODE_REGEX = "[" + BASE_CODE_STRING + "]{18}";
private static final int[] WEIGHT = {
1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28
};
static {
for (char c: BASE_CODE_ARRAY) {
BASE_CODES.add(c);
}
}
/**
* 加权因子
*/
private static int power[] = {
3, 7, 9, 10, 5, 8, 4, 2
};
/**
* 判断统一社会信用代码是否有效
* @param a
* @param b
* @return
*/
public static boolean isUniformSocialCreditCode(String socialCreditCode) {
if (StringUtils.isBlank(socialCreditCode) || !Pattern.matches(BASE_CODE_REGEX, socialCreditCode)) {
return false;
}
char[] businessCodeArray = socialCreditCode.toCharArray();
char check = businessCodeArray[17];
int sum = 0;
for (int i = 0; i < 17; i++) {
char key = businessCodeArray[i];
sum += (BASE_CODES.indexOf(key) * WEIGHT[i]);
}
int value = 31 - sum % 31;
return check == BASE_CODE_ARRAY[value % 31];
}
/**
* 判断组织机构代码是否有效
* @param organizationCertificate
* @return
*/
public static boolean isOrganizationCertificate(String organizationCertificate) {
String temp = organizationCertificate.toUpperCase();
if (temp.contains("-")) {
temp = temp.replace("-", "");
}
if (temp.length() != 9) {
return false;
}
// 获取前面8位
String pre8 = temp.substring(0, 8);
char[] pre8chars = pre8.toCharArray(); // 0~z;
// 获取校验码
String code = temp.substring(8, 9);
boolean isCode = isCode(code, sum(pre8chars));
return isCode;
}
/**
* 求和
* @param bit
* @return
*/
private static int sum(char[] bit) {
int sum = 0;
for (int i = 0; i < bit.length; i++) {
int intTemp = bit[i] > '9' ? (bit[i] - 'A' + 10) : Integer.parseInt(bit[i] + "");
System.out.print(" " + intTemp);
sum += intTemp * power[i];
}
return sum;
}
/**
* 判断机构代码的校验码和计算出的校验码是否一致
* @param a
* @param b
* @return
*/
private static boolean isCode(String a, int b) {
String codeTEmp = (11 - b % 11) == 10 ? "X" : (11 - b % 11) == 11 ? 0 + "" : (11 - b % 11) + "";
return a.equals(codeTEmp);
}
}