“我正在参加「启航方案」”

引言

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

iOS小技能:【营业执照编号校验】18位社会信用代码验证 unified social credit identifier

非小微商户,证件信息需要录入营业执照号

I、商户进件新增营业执照编号校验

从2015年10月1日后,中国企业营业执照上会印有“一致社会信誉代码”。这新版本的营业执照将取代以前发的营业执照、安排安排代码证、税务挂号证。总称“三证合一“。

1、申请办理新企业时,只需获得营业执照即可。 2、供给企业证明时,只需提交营业执照即可,无须再提交安排安排代码证和税务挂号证。

而“一致社会信誉代码”实际上编码规矩选用 GB 32100-2015 《法人和其他安排一致社会信誉代码编码规矩》而来,此规矩从2015年10月1日起,正式施行。

www.sac.gov.cn/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。 第三步:本体代码基数与对应位数的因子数值相乘。53=15,97=63,49=36,610=60,75=35,28=16,34=12,92=18 第四步:将乘积求和相加。15+63+36+60+35+16+12+18=255 第五步:将和数除以11,求余数。25511=33,余数是2。 第六步:用阿拉伯数字11减去余数,得求校验码的数值。当校验码的数值为10时,校验码用英文大写字母X来表明;当校验码的数值为11时,校验码用0来表明;其他求出的校验码数值就用其本身的阿拉伯数字来表明。11-2=9,因此此公司完好的安排安排代码为 59467239-9。

2、新社会一致信誉代码的“校验位”核算规矩是:   校验码:运用阿拉伯数字或大写英文字母来表明。校验码的核算方法参照 GB/T 17710。

II、iOS代码完成

iOS小技能:【营业执照编号校验】18位社会信用代码验证 unified social credit identifier

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.
//  Copyright  2021 https://kunnan.blog.csdn.net/  . All rights reserved.
//
#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个数( 号段用‘-’衔接;每批号段请用‘,’|‘离隔或分行)
 //————————————————
 //版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵从CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 //原文链接:https://blog.csdn.net/z929118967/article/details/116303608
 */
+ (BOOL)isTrueRule4SNWithRuleStrArr:(NSArray*)RuleStr target:(NSString*)event {
    for (NSString* line in RuleStr) {
        if( [event containsString:line]){
            NSLog(@"line:%@",line);
            return  YES;
        }
    }
        return NO;
}
@end

2.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算法 (银行卡号码校验算法) & 身份证校验:【校验年龄、校验是否符合身份证号生成规矩】 | 蓄力方案

kunnan.blog.csdn.net/article/det…

案例:iOS分配终端界面功能完成

1、拆分SN 2、核算SN个数( 号段用‘-’衔接;每批号段请用‘,’|‘离隔或分行)

RuleStr:@ "||,,\r\n" ———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵从CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…