iOS小技能:商户进件风险控制强化

简介: 需求背景: 进件风险控制强化(IOS) 通过身份证号码提取法人出生年月日,与当前日进行比较,如<18周岁, 则提示“法人未满18周岁,禁止进件!”

引言

  • 需求背景: 进件风险控制强化(IOS)
通过身份证号码提取法人出生年月日,与当前日进行比较,如<18周岁, 则提示“法人未满18周岁,禁止进件!”
  • 处理流程:
如果符合身份证规则,再进一步判断是否大于等于18岁,如<18周岁, 则提示“法人未满18周岁,禁止进件!”

I 定义工具类 IdentityCardTool进行身份证校验

【校验年龄、校验是否符合身份证号生成规则】

1.1 身份证号判断

  • 中国大陆个人身份证号验证 Chinese Mainland Personal ID Card Validation
+ (BOOL)CRM_validate_Personal_Identity_Card:(NSString *)identityCard
{
    
    if (identityCard.length != 18) return NO;
    // 正则表达式判断基本 身份证号是否满足格式
    NSString *regex2 = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";
    NSPredicate *identityStringPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
    //如果通过该验证,说明身份证格式正确,但准确性还需计算
    if(![identityStringPredicate evaluateWithObject:identityCard]) return NO;
    
    //** 开始进行校验 *//
    
    //将前17位加权因子保存在数组里
    NSArray *idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
    
    //这是除以11后,可能产生的11位余数、验证码,也保存成数组
    NSArray *idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
    
    //用来保存前17位各自乖以加权因子后的总和
    NSInteger idCardWiSum = 0;
    for(int i = 0;i < 17;i++) {
        NSInteger subStrIndex = [[identityCard substringWithRange:NSMakeRange(i, 1)] integerValue];
        NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];
        idCardWiSum+= subStrIndex * idCardWiIndex;
    }
    
    //计算出校验码所在数组的位置
    NSInteger idCardMod=idCardWiSum%11;
    //得到最后一位身份证号码
    NSString *idCardLast= [identityCard substringWithRange:NSMakeRange(17, 1)];
    //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
    if(idCardMod==2) {
        if(![idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]) {
            return NO;
        }
    }
    else{
        //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
        if(![idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]]) {
            return NO;
        }
    }
    return YES;
    
//    BOOL flag;
//    if (identityCard.length <= 0) {
//        flag = NO;
//        return flag;
//    }
//    NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
//    NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
//    return [identityCardPredicate evaluateWithObject:identityCard];
}


1.2 根据身份证获取生日

// 根据身份证获取生日
+ (NSString *)birthdayStrFromIdentityCard:(NSString *)numberStr{
  NSMutableString *result = [NSMutableString stringWithCapacity:0];
  NSString *year = nil;
  NSString *month = nil;
  BOOL isAllNumber = YES;
  NSString *day = nil;
  if([numberStr length]<14)
    return result;
  
  if ([numberStr length]==18) {
    //**从第6位开始 截取8个数
    NSString *fontNumer = [numberStr substringWithRange:NSMakeRange(6, 8)];
    //**检测前12位否全都是数字;
    const char *str = [fontNumer UTF8String];
    const char *p = str;
    while (*p!='\0') {
      if(!(*p>='0'&&*p<='9'))
        isAllNumber = NO;
      p++;
    }
    if(!isAllNumber)
      return result;
//    year = [NSString stringWithFormat:@"19%@",[numberStr substringWithRange:NSMakeRange(8, 2)]];
      
      year = [numberStr substringWithRange:NSMakeRange(6, 4)];

      
        NSLog(@"year ==%@",year);
    month = [numberStr substringWithRange:NSMakeRange(10, 2)];
    //    NSLog(@"month ==%@",month);
    day = [numberStr substringWithRange:NSMakeRange(12,2)];
    //    NSLog(@"day==%@",day);
    [result appendString:year];
    [result appendString:@"-"];
    [result appendString:month];
    [result appendString:@"-"];
    [result appendString:day];
    //    NSLog(@"result===%@",result);
    return result;
  }else{
    NSString *fontNumer = [numberStr substringWithRange:NSMakeRange(0, 11)];
    //**检测前14位否全都是数字;
    const char *str = [fontNumer UTF8String];
    const char *p = str;
    while (*p!='\0') {
      if(!(*p>='0'&&*p<='9'))
        isAllNumber = NO;
      p++;
    }
    if(!isAllNumber)
      return result;
    
    year = [numberStr substringWithRange:NSMakeRange(6, 2)];
    month = [numberStr substringWithRange:NSMakeRange(8, 2)];
    day = [numberStr substringWithRange:NSMakeRange(10,2)];
    NSString* resultAll = [NSString stringWithFormat:@"19%@-%@-%@",year,month,day];
    return resultAll;
  }
  
}





//根据身份证号获取生日
+(NSString *)birthdayStrFromIdentityCard18:(NSString *)numberStr
{
    NSMutableString *result = [NSMutableString stringWithCapacity:0];
    NSString *year = nil;
    NSString *month = nil;
    
    BOOL isAllNumber = YES;
    NSString *day = nil;
    if([numberStr length]<14)
        return result;
    
    //**截取前14位
    NSString *fontNumer = [numberStr substringWithRange:NSMakeRange(0, 13)];
    
    //**检测前14位否全都是数字;
    const char *str = [fontNumer UTF8String];
    const char *p = str;
    while (*p!='\0') {
        if(!(*p>='0'&&*p<='9'))
            isAllNumber = NO;
        p++;
    }
    if(!isAllNumber)
        return result;
    
    year = [numberStr substringWithRange:NSMakeRange(6, 4)];
    month = [numberStr substringWithRange:NSMakeRange(10, 2)];
    day = [numberStr substringWithRange:NSMakeRange(12,2)];
    
    [result appendString:year];
    [result appendString:@"-"];
    [result appendString:month];
    [result appendString:@"-"];
    [result appendString:day];
    return result;
}

1.3 从生日上获取年龄

/**
    从身份证上获取年龄
 
 */

+ (NSString *)getIdentityCardAge:(NSString *)numberStr {
    
    NSDateFormatter *formatterTow = [[NSDateFormatter alloc]init];
    [formatterTow setDateFormat:@"yyyy-MM-dd"];
    
    
    NSString* birthday = [self birthdayStrFromIdentityCard:numberStr];
    NSLog(@"birthday :%@",birthday);
    NSDate *bsyDate = [formatterTow dateFromString:birthday];
    
    
  
    NSTimeInterval dateDiff = [bsyDate timeIntervalSinceNow];
 
    int age = trunc(dateDiff/(60*60*24))/365;
    return [NSString stringWithFormat:@"%d",-age];
}


1.4 判断是否小于18岁

+ (BOOL )isAgeLower18:(NSString *)numberStr {
    
    NSString *age = [CRMIdentityCardTool getIdentityCardAge:numberStr];
    
    
    NSLog(@"%@", [NSString stringWithFormat:@"%@%@",@"校验年龄",age]);
    
    
    
    
    
    if(age.doubleValue< 18){
        
        
        return YES;

    }

    
    return NO;
    
    
    
}

II 应用

2.1 用法举例

            if (![CRMIdentityCardTool validateIdentityCard:_frCardTextF.text] ) {
                
                
              return  [SVProgressHUD showInfoWithStatus:@"请输入正确的法人证件号码"];
                
                
                
            }// 如果符合身份证规则,再进一步判断是否大于等于18岁,如<18周岁, 则提示“法人未满18周岁,禁止进件!”
            
            else{
                
                
                
                
                if([CRMIdentityCardTool isAgeLower18:_frCardTextF.text]){
                    
                    
                    return  [SVProgressHUD showInfoWithStatus:@"法人未满18周岁,禁止进件!"];
                    

                    
                }
                
                
            }

2.2 测试验证

11010120050307505X
110101200503070371
110101200503078170
110101200503074815
110101200503075754

see also

iOS 银行卡号有效性校验Luhn算法 (银行卡号码校验算法) & 身份证校验:【校验年龄、校验是否符合身份证号生成规则】

目录
相关文章
|
17天前
|
搜索推荐 Java Android开发
打造个性化安卓应用:从设计到发布的全程指南
【9月更文挑战第15天】本篇文章将带领读者踏上一段激动人心的旅程,从构思一个独特的安卓应用想法开始,直至将其变为现实并成功发布。我们将一起探索如何捕捉灵感、设计界面、编写代码以及最终将应用推向市场。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供宝贵的洞见和实用的技巧,让你的应用在竞争激烈的市场中脱颖而出。
53 17
|
4月前
|
存储 安全 网络安全
APP 安全评估报告:直面移动应用安全威胁,守护用户数据安全
移动APP安全问题日益严重,包括数据泄露、恶意软件和权限滥用等威胁。例如,Ring App安全漏洞导致用户信息曝光,13款Android应用暴露大量用户数据。此外,工信部通报50款APP违规收集个人信息。安全评估是保障APP安全的关键,涉及代码安全、数据传输安全、用户权限管理和隐私保护等方面。经过评估,这款APP在所有方面表现出色,符合最高安全标准,确保用户隐私和数据安全。
155 2
|
5月前
|
存储 安全
医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付
医院安全(不良)事件管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况
45 0
|
安全 BI
不良事件管理系统源码,商业级全套源码
相关技术:PHP+vscode+vue2+element+laravel8+mysql5.7 有演示,商业级源码 不良事件上报系统,对患者安全(不良)事件实施全过程追踪管理,包括数据上报、流转审批、数据统计、原因分析、措施制定、效果追踪等环节,管理过程设置权限分级,相关人员职责明确,通过闭环管理使不良事件得到有效解决。 包含10大类医疗安全(不良)事件,即医疗事件、药品事件、护理事件、医学技术检查事件、输血事件、医院感染事件、医疗器械事件、安全管理与意外伤害事件,进一步又细分为60余类二级事件,全面覆盖医院所有临床科室、辅助科室及职能部门。
不良事件管理系统源码,商业级全套源码
|
缓存 安全 前端开发
iOS小技能:请求安全防护
银行和信用卡类app 为了安全,防止修改和抓包都是基本的要求。
229 0
|
存储 安全 前端开发
语音聊天app开发,各类安全问题的常见应对措施
语音聊天app开发,各类安全问题的常见应对措施
|
安全 测试技术 开发工具
App 不想被“点名”,mPaaS 隐私合规检测为开发者护航数字生态建设
《个人信息保护法》的即将落地,无疑是近年来政策法规及监管标准不断细化深化、监管查处力度不断加大、处置通报常规化的又一里程碑式的具象体现,App 开发企业如若违规将会面临的各类损失也在日益增加。
808 0
App 不想被“点名”,mPaaS 隐私合规检测为开发者护航数字生态建设
|
安全 Android开发 存储
安卓应用安全指南 5.5.2 处理隐私数据 规则书
5.5.2 处理隐私数据 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 处理隐私策略时,遵循以下规则: 5.5.2.1 将用户数据的传输限制为最低需求(必需) 将使用数据传输到外部服务器或其他目标时,将传输限制在提供服务的最低需求。
1077 0
|
安全 Android开发 数据格式
安卓应用安全指南 5.5.1 处理隐私数据 示例代码
5.5.1 处理隐私数据 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 在准备应用的隐私政策时,你可以使用“协助创建应用隐私政策的工具” [29]。
1108 0
|
安全 算法 Java
安卓应用安全指南 5.7 使用指纹认证功能
5.7 使用指纹认证功能 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 目前正在研究和开发的各种用于生物认证的方法中,使用面部信息和声音特征的方法尤其突出。
1426 0
下一篇
无影云桌面