引言
需求:商户进件的子模块证件信息页面新增营业执照编号校验

非小微商户,证件信息需要录入营业执照号
I、商户进件新增营业执照编号校验
从2015年10月1日后,中国企业营业执照上会印有“统一社会信用代码”。这新版本的营业执照将取代以前发的营业执照、组织机构代码证、税务登记证。统称“三证合一“。
1、申请办理新企业时,只需取得营业执照即可。 2、提供企业证明时,只需提交营业执照即可,无须再提交组织机构代码证和税务登记证。
而“统一社会信用代码”实际上编码规则采用 GB 32100-2015 《法人和其他组织统一社会信用代码编码规则》而来,此规则从2015年10月1日起,正式实施。
/gzfw/ggcx/g…
1.1 【需求背景】
18位编码的校验依据GB 32100-2015 《法人和其他组织统一社会信用代码编码规则》, 统一代码由十八位阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成,包括以下5个部分
第1位登记管理部门代码 第2位机构类别代码
第3位~第8位登记管理机关行政区划码第9位~第17位主体标识码(组织机构代码)第18位校验码
1.2 【需求描述】
商户进件(新增、审核通过前编辑),如营业执照号必填则对营业执照编号进行校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”
1.3 术语和定义
组织机构 organization
企业、事业单位、机关、社会团体及其他依法成立的单位的通称。[GB/T 20091-2006, 定义2.2]
法人 legal entities
具有民事权利能力和民事行为能力,依法独立享有民事权利和承担民事义务的组织。
其他组织 other organizations
合法成立、有一定的组织机构和财产,不具备法人资格的组织。
组织机构代码 organization code
主体标识码 subject identification code按照GB 11714编制,赋予每一个组织机构在全国范围内唯一的,始终不变的识别标识码。
统一社会信用代码 unified social credit identifier
每一个法人和其他组织在全国范围内唯一的,终身不变的法定身份识别码。
1.4 统一代码的构成(unified identifier)
统一代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成。
第1位:登记管理部门代码(共一位字符) 第2位:机构类别代码(共一位字符)
第3位~第8位:登记管理机关行政区划码(共六位阿拉伯数字)第9位~第17位:主体标识码(组织机构代码)(共九位字符) 第18位:校验码(共一位字符)
1.5 代码及说明
- 登记管理部门代码:使用阿拉伯数字或大写英文字母表示。
登记管理部门 | 代码标识 |
机构编制 | 1 |
外交 | 2 |
司法行政 | 3 |
文化 | 4 |
民政 | 5 |
旅游 | 6 |
宗教 | 7 |
工会 | 8 |
工商 | 9 |
中央军委改革和编制办公室 | A |
农业 | N |
其他 | Y |
- 机构类别代码:使用阿拉伯数字或大写英文字母表示。
登记管理部门 | 机构类别 | 代码标识 |
机构编制 | 机关 | 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位:
登记管理机关行政区划码只能使用阿拉伯数字表示。按照GB/T 2260编码。 - 第9位~17位:
主体标识码(组织机构代码)使用阿拉伯数字或英文大写字母表示。按照GB 11714编码。 - 校验码
在实行统一社会信用代码之前,以前的组织机构代码证上的组织机构代码由九位字符组成。格式为XXXXXXXX-Y。前面八位被称为“本体代码”;最后一位被称为“校验码”。校验码和本体代码由一个连字号(-)连接起来。以便让人很容易的看出校验码。
但是三证合一后,组织机构的九位字符全部被纳入统一社会信用代码的第9位至第17位,其原有组织机构代码上的连字号不带入统一社会信用代码。 1、原有组织机构代码上的“校验码”的计算规则:例如:某公司的组织机构代码是:59467239-9。那其最后一位的组织机构代码校验码9是如何计算出来的? 第一步:取组织机构代码的前八位本体代码为基数。5 9 4 6 7 2 3 9提示:如果本体代码中含有英文大写字母。则A的基数是10,B的基数是11,C的基数是12,依此类推,直到Z的基数是35。即采用16进制编码 进行计算第二步:取加权因子数值。因为组织机构代码的本体代码一共是八位字符。则这八位的加权因子数值从左到右分别是:3、7、9、10、5、8、4、2。 第三步:本体代码基数与对应位数的因子数值相乘。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 第五步:将和数除以11,求余数。255÷11=33,余数是2。 第六步:用阿拉伯数字11减去余数,得求校验码的数值。当校验码的数值为10时,校验码用英文大写字母X来表示;当校验码的数值为11时,校验码用0来表示;其余求出的校验码数值就用其本身的阿拉伯数字来表示。11-2=9,因此此公司完整的组织机构代码为 59467239-9。2、
新社会统一信用代码的“校验位”计算规则是:校验码:使用阿拉伯数字或大写英文字母来表示。校验码的计算方法参照 GB/T 17710。
II、iOS代码实现

2.1 简单校验字母
- 用法
if (!self.isMicro_Merchants && _zzbhTextF.text.length < 1) {
return [SVProgressHUD showInfoWithStatus:@"请输入营业执照编号"];
}
if (!self.isMicro_Merchants && _zzbhTextF.text.length >= 1) {
// // 判断营业执照号,校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”
//
if([idNumberTool isInvalidbusiness_license_idNumber:_zzbhTextF.text]){
return [SVProgressHUD showInfoWithStatus:@"营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!"];
}
}- 代码实现
@interface idNumberTool : NSObject
/**
商户进件(新增、审核通过前编辑),如营业执照号必填则对营业执照编号进行校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”
*/
+(BOOL)isInvalidbusiness_license_idNumber:(NSString*)idNumber;
@end
//
// idNumberTool.m
// Housekeeper
//
// Created by mac on 2021/5/8.
//
#import "idNumberTool.h"
@implementation idNumberTool
/**
商户进件(新增、审核通过前编辑),如营业执照号必填则对营业执照编号进行校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”
*/
+(BOOL)isInvalidbusiness_license_idNumber:(NSString*)idNumber{
if(idNumber.length<1){
return NO;
}
return [self isTrueRule4SNWithRuleStrArr:@[@"I",@"i",@"O",@"o",@"Z",@"z",@"S",@"s",@"V",@"v"] target:idNumber];
}
/**
RuleStr:@ "||,,\r\n"
案例:iOS分配终端界面功能实现:1、拆分SN 2、计算SN个数( 号段用‘-’连接;每批号段请用‘,’|‘隔开或分行)
*/
+ (BOOL)isTrueRule4SNWithRuleStrArr:(NSArray*)RuleStr target:(NSString*)event {
for (NSString* line in RuleStr) {
if( [event containsString:line]){
NSLog(@"line:%@",line);
return YES;
}
}
return NO;
}
@end2.2 严格按照18位社会信用代码生成规则验证(GB/T 17710)
判断是否为社会信用代码
+ (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;
}see also
公号:iOS逆向
iOS 银行卡号有效性校验Luhn算法 (银行卡号码校验算法) & 身份证校验:【校验年龄、校验是否符合身份证号生成规则】 | 蓄力计划
案例:iOS分配终端界面功能实现
1、拆分SN 2、计算SN个数( 号段用‘-’连接;每批号段请用‘,’|‘隔开或分行)
















