判断银行账号是否输入正确

1、使用例子

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *str = @"4367450088342306";
    BOOL isRight = [self checkCardNo:str];
    if (!isRight) {
        

        NSLog(@"卡号不对");
    }else{
        
        NSLog(@"卡号正确");
    }
    
    
    
}


2、具体实现的方法

#pragma mark -判断银行卡号
- (BOOL) checkCardNo:(NSString*) cardNo{
    int oddsum = 0;     //奇数求和
    int evensum = 0;    //偶数求和
    int allsum = 0;
    int cardNoLength = (int)[cardNo length];
    int lastNum = [[cardNo substringFromIndex:cardNoLength-1] intValue];
    
    cardNo = [cardNo substringToIndex:cardNoLength - 1];
    for (int i = cardNoLength -1 ; i>=1;i--) {
        NSString *tmpString = [cardNo substringWithRange:NSMakeRange(i-1, 1)];
        int tmpVal = [tmpString intValue];
        if (cardNoLength % 2 ==1 ) {
            if((i % 2) == 0){
                tmpVal *= 2;
                if(tmpVal>=10)
                    tmpVal -= 9;
                evensum += tmpVal;
            }else{
                oddsum += tmpVal;
            }
        }else{
            if((i % 2) == 1){
                tmpVal *= 2;
                if(tmpVal>=10)
                    tmpVal -= 9;
                evensum += tmpVal;
            }else{
                oddsum += tmpVal;
            }
        }
    }
    
    allsum = oddsum + evensum;
    allsum += lastNum;
    if((allsum % 10) == 0)
        return YES;
    else
        return NO;
}

3、原理 基于银行卡校验规则(Luhn算法)

案例:

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。

该校验的过程:

1、从卡号最后一位数字开始,逆向将奇数位(135等等)相加。

2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。

3、将奇数位总和加上偶数位总和,结果应该可以被10整除。

例如,卡号是:5432123456788881

则奇数、偶数位(用红色标出)分布:5432123456788881

奇数位和=35

偶数位乘以2(有些要减去9)的结果:16 2 6 1 5 7 7,求和=35

最后35+35=70可以被10整除,认定校验通过。


Luhn
检验数字算法(Luhn Check Digit Algorithm),也叫做模数10公式,是一种简单的算法,用于验证银行卡、信用卡号码的有效性的算法。对所有大型信用卡公司发行的信用卡都起作用,这些公司包括美国Express、护照、万事达卡、Discover和用餐者俱乐部等。这种算法最初是在20世纪60年代由一组数学家制定,现在Luhn检验数字算法属于大众,任何人都可以使用它。

算法:将每个奇数加倍和使它变为单个的数字,如果必要的话通过减去9和在每个偶数上加上这些值。如果此卡要有效,那么,结果必须是10的倍数。

比如上图的卡号为3759 8765 4321 001 (15位),从最高位开始所有的奇数位相加,偶数为乘以2相加(偶数乘以2后如果大于10则两位数相加),把这些奇数和偶数都加在一起得到57.

(57+3)%10 ==0 如果此卡满足被10整除,则有效位必定为3。

针对目前提现成功(clear_success)的记录里面,统计卡号的位数和数量关系如下:

卡号位数数量

<13        3038+

14           538

15           476

16           10884

17           68

18           4395

19          38070

>20        504+

说明:

位数少于14的卡号基本是外资银行,或小银行。

***496748***        **     HSBC                               HSBCHKHHHKH   

***430259***        **     HSBC                               HSBCHKHHHKH   

***51878018***     **    Bank of East Asia Limited      BEASHKHHXXX    

位数多于23的卡号大多是卡号包含字母或空格。

62270014 **** 0045 ***      CHINA CONSTRUCTION BANK **                 

601382700 **** 9077 **      BANK OF CHINA FOSHAN BRANCH **

如果是国内的主流银行(中、农、工、建、招、交等)基本都是基于16位或者19位的卡号。

来看看提现成功(clear_success)里面的卡有多少满足Luhn规则

针对16位美元个人用户  准确率:99.84%

正确的卡号数量:3105    不正确的卡号数量 :14

卡号45806509689007** is NOT valid

卡号48620375555016** is NOT valid

卡号54202100231152** is NOT valid

卡号58890201075786** is NOT valid

卡号62106200000456** is NOT valid

卡号62129986037235** is NOT valid

卡号62252017026526** is NOT valid

.....

针对19位美元个人用户   准确率:99.96%

正确的卡号数量:10574       不正确的卡号数量 :13  其中3笔发生退票

卡号60138214000567721** is NOT valid

卡号60138217000662109** is NOT valid

卡号60138220005824282** is NOT valid

卡号60138220006014219** is NOT valid

卡号60220001386050410** is NOT valid

卡号62161132000004484** is NOT valid

卡号62220212082154900** is NOT valid

卡号62220836020035821** is NOT valid

卡号63214140980000000** is NOT valid

以上都是提现成功的卡号,可以看到基本都严格满足Luhn算法。

卡号位数数量

15      1

16      149

17      4

18      64

19      502

20      3

正确的卡号数量:622

不正确的卡号数量:29 + 1 +4+64+3

14%卡填写违法了Luhn算法,也就是这部分卡号都是可以提前通过Luhn校验发现的。

结论是我们可以在填写收款账户的时候,添加一种Luth算法的JS脚本检查用户填写的卡号存在问题。当然即时用户填写的卡号违法了该规则,我们仍然运行用户填写,但给出相应的警示内容(可能填错)。

目前在收银台页面(Checkout.vm)针对信用卡的交易,校验的JS :isValidCardfunction函数就包含了Luth校验规则,必须严格按照该规则的卡才能提交表单。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您的描述,我可以为您分析手机银行转账汇款的相关测试场景。以下是一些可能需要考虑的测试方案: 1. 正常转账流程测试: - 检查是否能够成功填写收款人户名、账号以及银行信息。 - 验证转账金额是否能够正确计算和显示。 - 确保付款卡信息的正确性。 - 测试是否能够成功提交转账请求并收到相应的确认信息。 2. 异常情况测试: - 测试转账金额输入负数或超过账户余额的情况,检查系统是否能够给出相应的错误提示。 - 验证当收款人户名或账号输入错误时,系统是否能够给出准确的提示信息。 - 检查当银行信息输入错误时,系统是否能够提醒用户进行修正。 - 测试当付款卡信息不完整或错误时,系统是否能够正确判断并提示用户进行修正。 3. 安全性测试: - 验证密码输入是否正常工作,并且能够隐藏用户输入的密码。 - 检查是否有密码错误次数限制以及相应的错误提示。 - 测试转账过程中是否有合适的加密措施来保护用户的个人信息和支付数据。 4. 用户界面测试: - 确保转账页面的布局和样式符合设计规范,并且各个输入框、按钮等元素能够正常响应用户操作。 - 验证页面的响应速度和流畅度是否满足用户的预期。 - 检查转账过程中是否有适当的加载提示或进度条,以便用户了解操作的进展情况。 这些是一些可能的测试场景,具体的测试方案和用例可以根据您的具体需求和系统设计来进行进一步的制定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值