0%

PHP实现18位社会统一信用码验证

什么是社会统一信用码

统一社会信用代码是中国的法人和其他组织,在全国范围内唯一的、终身不变的18位法定身份识别码,旨在统一过去各部门下发的不同机构代码,由全国组织机构统一社会信用代码数据服务中心(NACAO,隶属国家市场监督管理总局)负责管理。

2015年6月11日国务院下发《国务院关于批转发展改革委等部门法人和其他组织统一社会信用代码制度建设总体方案的通知》(国发〔2015〕33号)后开始实施。

信用码构成

中华人民共和国国家标准GB 32100-2015 法人和其他组织统一社会信用代码编码规则中规定:统一代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成。

18位数字字母组合的方式是:

  • 登记管理部门码表示登记管理部分,使用阿拉伯数字或大写英文字母表示,1代表机构编制、5代表民政、9代表工商、Y代表其他。
  • 机构类别码表示登记机构的类别。
  • 登记管理机关行政区划码指的是登记机构所地的行政区划代码,如350100是福建省福州市。
  • 主体标识码(组织机构代码)是旧的组织机构代码,按照GB 11714编码。
  • 最后一位是校验码,校验码计算方法参照GB/T 17710(采ISO 7064)。

编码规则

GB_32100-2015

PHP实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

// https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则
function validateUnifiedSocialCreditIdentifier($code)
{
if (!preg_match('~^[0-9ABCDEFGHJKLMNPQRTUWXY]{18}$~', $code)) {
return false;
}
$code = strtoupper($code);
// 18位统一社会信用代码不使用I、O、Z、S、V这五个英文字母
$alphaMap = [
'0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4,
'5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9,
'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,
];
$weight = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
$chrs = str_split($code);
$sum = 0;
foreach (array_slice($chrs, 0, 17) as $index => $chr) {
$sum += $alphaMap[$chr] * $weight[$index];
}
$checkNum = 31 - ($sum % 31);
$checkNum = $checkNum == 31 ? 0 : $checkNum;
$flipAlphaMap = array_flip($alphaMap);
return $chrs[17] === (string) $flipAlphaMap[$checkNum];
}

// var_dump(true === validateUnifiedSocialCreditIdentifier('91310000736228569K')); // true
// var_dump(true === validateUnifiedSocialCreditIdentifier('91310115MA1K3M5G6H')); // true
// var_dump(true === validateUnifiedSocialCreditIdentifier('91310112MA1GBEGY17')); // true
// var_dump(true === validateUnifiedSocialCreditIdentifier('91310000MA1FL5DR4T')); // true
// var_dump(false === validateUnifiedSocialCreditIdentifier('11310000MA1FL5DR4T')); // true

错码问题

实际情况中存在少量社会统一信用码错码问题,比如:

福建思企互联网信息服务有限公司 (91350103M0001JFDX6)

福州禾力顺电子商务有限公司 (91350102M0001PU72B)