干貨干貨了叽唱,之前網(wǎng)上搜社會(huì)信用代碼驗(yàn)證規(guī)則屈呕,一搜一堆java的,iOS版的特少棺亭,想想自己就寫了一個(gè)虎眨,不好大家見諒啊O庹K宰!
先介紹一下驗(yàn)證規(guī)則:
從2015年10月1日后凄敢,中國企業(yè)營業(yè)執(zhí)照上會(huì)印有“統(tǒng)一社會(huì)信用代碼”碌冶。這新版本的營業(yè)執(zhí)照將取代以前發(fā)的營業(yè)執(zhí)照、組織機(jī)構(gòu)代碼證涝缝、稅務(wù)登記證扑庞。統(tǒng)稱“三證合一“。這也意味著申請辦理新企業(yè)時(shí)拒逮,只需取得營業(yè)執(zhí)照即可罐氨。另外,提供企業(yè)證明時(shí)消恍,只需提交營業(yè)執(zhí)照即可岂昭,無須再提交組織機(jī)構(gòu)代碼證和稅務(wù)登記證。
而“統(tǒng)一社會(huì)信用代碼”實(shí)際上編碼規(guī)則采用GB 32100-2015 《法人和其他組織統(tǒng)一社會(huì)信用代碼編碼規(guī)則》而來狠怨,此規(guī)則從2015年10月1日起,正式實(shí)施邑遏。
下面是《法人和其他組織統(tǒng)一社會(huì)信用代碼編碼規(guī)則》的說明佣赖。
1 范圍
本標(biāo)準(zhǔn)規(guī)定了法人和其他組織統(tǒng)一社會(huì)信用代碼(以下簡稱統(tǒng)一代碼)的術(shù)語和定義、構(gòu)成记盒。本標(biāo)準(zhǔn)適用于對統(tǒng)一代碼的編碼憎蛤、信息處理和信息共享交換。
2 規(guī)范性引用文件
下列文件對于本文件的應(yīng)用是必不可少的。凡是注日期的引用文件俩檬,僅注日期的版本適用于本文件萎胰。凡是不注日期的引用文件,其最新版本(包括所有的修改單)適用于本文件棚辽。
GB/T 2260 中華人民共和國行政區(qū)劃代碼GB 11714 全國組織機(jī)構(gòu)代碼編制規(guī)則GB/T 17710 信息技術(shù) 安全技術(shù) 校驗(yàn)字符系統(tǒng)
3 術(shù)語和定義
下列術(shù)語和定義適用于本文件技竟。
3.1 組織機(jī)構(gòu) organization
企業(yè)、事業(yè)單位屈藐、機(jī)關(guān)榔组、社會(huì)團(tuán)體及其他依法成立的單位的通稱。[GB/T 20091-2006, 定義2.2]
3.2 法人 legal entities
具有民事權(quán)利能力和民事行為能力联逻,依法獨(dú)立享有民事權(quán)利和承擔(dān)民事義務(wù)的組織搓扯。
3.3 其他組織 other organizations
合法成立、有一定的組織機(jī)構(gòu)和財(cái)產(chǎn)包归,不具備法人資格的組織锨推。
3.4 組織機(jī)構(gòu)代碼 organization code
主體標(biāo)識碼 subject identification code按照GB 11714編制,賦予每一個(gè)組織機(jī)構(gòu)在全國范圍內(nèi)唯一的公壤,始終不變的識別標(biāo)識碼换可。
3.5 統(tǒng)一社會(huì)信用代碼 unified social credit identifier
每一個(gè)法人和其他組織在全國范圍內(nèi)唯一的,終身不變的法定身份識別碼境钟。
4 統(tǒng)一代碼的構(gòu)成
4.1 結(jié)構(gòu)
統(tǒng)一代碼由十八位的阿拉伯?dāng)?shù)字或大寫英文字母(不使用I锦担、O、Z慨削、S洞渔、V)組成。
第1位:登記管理部門代碼(共一位字符)第2位:機(jī)構(gòu)類別代碼(共一位字符)第3位第8位:登記管理機(jī)關(guān)行政區(qū)劃碼(共六位阿拉伯?dāng)?shù)字)第9位第17位:主體標(biāo)識碼(組織機(jī)構(gòu)代碼)(共九位字符)第18位:校驗(yàn)碼(共一位字符)
4.2 代碼及說明
登記管理部門代碼:使用阿拉伯?dāng)?shù)字或大寫英文字母表示缚态。
機(jī)構(gòu)編制:1 磁椒、民政:5、工商:9玫芦、其他:Y
機(jī)構(gòu)類別代碼:使用阿拉伯?dāng)?shù)字或大寫英文字母表示浆熔。
機(jī)構(gòu)編制機(jī)關(guān):11打頭機(jī)構(gòu)編制事業(yè)單位,12打頭機(jī)構(gòu)編制中央編辦直接管理機(jī)構(gòu)編制的群眾團(tuán)體桥帆,13打頭機(jī)構(gòu)編制其他医增,19打頭民政社會(huì)團(tuán)體,51打頭民政民辦非企業(yè)單位老虫,52打頭民政基金會(huì)叶骨,53打頭民政其他,59打頭工商企業(yè)祈匙,91打頭工商個(gè)體工商戶忽刽,92打頭工商農(nóng)民專業(yè)合作社天揖,93打頭其他,Y1打頭
登記管理機(jī)關(guān)行政區(qū)劃碼:只能使用阿拉伯?dāng)?shù)字表示跪帝。按照GB/T 2260編碼今膊。
主體標(biāo)識碼(組織機(jī)構(gòu)代碼):使用阿拉伯?dāng)?shù)字或英文大寫字母表示。按照GB 11714編碼伞剑。
在實(shí)行統(tǒng)一社會(huì)信用代碼之前斑唬,以前的組織機(jī)構(gòu)代碼證上的組織機(jī)構(gòu)代碼由九位字符組成。格式為XXXXXXXX-Y纸泄。前面八位被稱為“本體代碼”赖钞;最后一位被稱為“校驗(yàn)碼”。校驗(yàn)碼和本體代碼由一個(gè)連字號(-)連接起來聘裁。以便讓人很容易的看出校驗(yàn)碼雪营。但是三證合一后,組織機(jī)構(gòu)的九位字符全部被納入統(tǒng)一社會(huì)信用代碼的第9位至第17位衡便,其原有組織機(jī)構(gòu)代碼上的連字號不帶入統(tǒng)一社會(huì)信用代碼献起。
原有組織機(jī)構(gòu)代碼上的“校驗(yàn)碼”的計(jì)算規(guī)則是:
例如:某公司的組織機(jī)構(gòu)代碼是:59467239-9。那其最后一位的組織機(jī)構(gòu)代碼校驗(yàn)碼9是如何計(jì)算出來的呢镣陕?
第一步:取組織機(jī)構(gòu)代碼的前八位本體代碼為基數(shù)谴餐。5 9 4 6 7 2 3 9提示:如果本體代碼中含有英文大寫字母。則A的基數(shù)是10呆抑,B的基數(shù)是11岂嗓,C的基數(shù)是12,依此類推鹊碍,直到Z的基數(shù)是35厌殉。
第二步:取加權(quán)因子數(shù)值。因?yàn)榻M織機(jī)構(gòu)代碼的本體代碼一共是八位字符侈咕。則這八位的加權(quán)因子數(shù)值從左到右分別是:3公罕、7、9耀销、10楼眷、5、8熊尉、4罐柳、2。
第三步:本體代碼基數(shù)與對應(yīng)位數(shù)的因子數(shù)值相乘狰住。5×3=15硝清,9×7=63,4×9=36转晰,6×10=60,7×5=35,2×8=16查邢,3×4=12蔗崎,9×2=18第四步:將乘積求和相加。15+63+36+60+35+16+12+18=255第五步:將和數(shù)除以11扰藕,求余數(shù)缓苛。255÷11=33,余數(shù)是2邓深。第六步:用阿拉伯?dāng)?shù)字11減去余數(shù)未桥,得求校驗(yàn)碼的數(shù)值。當(dāng)校驗(yàn)碼的數(shù)值為10時(shí)芥备,校驗(yàn)碼用英文大寫字母X來表示冬耿;當(dāng)校驗(yàn)碼的數(shù)值為11時(shí),校驗(yàn)碼用0來表示萌壳;其余求出的校驗(yàn)碼數(shù)值就用其本身的阿拉伯?dāng)?shù)字來表示亦镶。11-2=9,因此此公司完整的組織機(jī)構(gòu)代碼為 59467239-9袱瓮。
新社會(huì)統(tǒng)一信用代碼的“校驗(yàn)位”計(jì)算規(guī)則是:
校驗(yàn)碼:使用阿拉伯?dāng)?shù)字或大寫英文字母來表示缤骨。校驗(yàn)碼的計(jì)算方法參照 GB/T 17710。
上代碼:
//判斷是否為社會(huì)信用代碼
+ (BOOL)isSocialCredit18Number:(NSString *)socialCreditNum
{
if(socialCreditNum.length != 18){
return NO;
}
NSString *scN = @"^([0-9ABCDEFGHJKLMNPQRTUWXY]{2})([0-9]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9Y])$";
NSPredicate *regextestSCNum = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", scN];
if (![regextestSCNum evaluateWithObject:socialCreditNum]) {
return NO;
}
NSArray *ws = @[@1,@3,@9,@27,@19,@26,@16,@17,@20,@29,@25,@13,@8,@24,@10,@30,@28];
NSDictionary *zmDic = @{@"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};
NSMutableArray *codeArr = [NSMutableArray array];
NSMutableArray *codeArr2 = [NSMutableArray array];
codeArr[0] = [socialCreditNum substringWithRange:NSMakeRange(0,socialCreditNum.length-1)];
codeArr[1] = [socialCreditNum substringWithRange:NSMakeRange(socialCreditNum.length-1,1)];
int sum = 0;
for (int i = 0; i < [codeArr[0] length]; i++) {
[codeArr2 addObject:[codeArr[0] substringWithRange:NSMakeRange(i, 1)]];
}
NSScanner* scan;
int val;
for (int j = 0; j < codeArr2.count; j++) {
scan = [NSScanner scannerWithString:codeArr2[j]];
if (![scan scanInt:&val] && ![scan isAtEnd]) {
codeArr2[j] = zmDic[codeArr2[j]];
}
}
for (int x = 0; x < codeArr2.count; x++) {
sum += [ws[x] intValue]*[codeArr2[x] intValue];
}
int c18 = 31 - (sum % 31);
for (NSString *key in zmDic.allKeys) {
if (zmDic[key]==[NSNumber numberWithInt:c18]) {
if (![codeArr[1] isEqualToString:key]) {
return NO;
}
}
}
return YES;
}