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;elsereturn NO;
}

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

案例:

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

该校验的过程:

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

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校验规则,必须严格按照该规则的卡才能提交表单。

判断银行账号是否输入正确相关推荐

  1. 【已解决】Mac不能登录iCloud,账号密码输入正确会转圈,之后再次回到初始登陆iCloud页面

    Mac电脑上退出了iCloud账号,再次登录,账号密码输入正确会转圈,如果不正确,会提示密码不对,转圈之后就让再次输入账号密码,一直不能登录. 后面该问题已闭环,升级后解决该问题,可以直接看更新部分. ...

  2. Windows--远程桌面账号密码输入正确却显示凭据失败

    Windows–远程桌面账号密码输入正确却显示凭据失败的解决方法 Windows A电脑 通过自带的远程桌面连接 Windows B电脑 A电脑:客户端 B电脑:服务器 一般来说客户端不需要什么操作 ...

  3. 代码技巧1.类似于登录、注册界面要判断登录账号是不是空,验证码是否正确等,怎么写比较舒服一点?

    类似于登录.注册界面要判断登录账号是不是空,验证码是否正确等,怎么写比较舒服一点? case R.id.btn_get_verify_code://点击获取验证//业务需求 点击获取验证码的地方加上图 ...

  4. centos输入正确的账号和密码登陆不进去

    vm下启动centos,输入正确的账号和密码,依然登陆不进去,一直处于这个界面: 暂时的解决方法是:先等待一段时间.重启,然后再输入密码,然后,ctrl+c 不停地ctrl+c,然后就登陆进去了.什么 ...

  5. 网站输入正确账号密码页面刷新一下_Folx的密码管理保存网站登陆信息

    Folx的密码管理保存网站登陆信息 大家下载某个文件时,需要登录文件所在的网站才能进行下载,否则哪怕有下载链接也无权限进行文件下载,那Folx遇到这种情况是否就无法使用了呢?Folx的密码管理也能保存 ...

  6. centos6.5_x64远程链接输入正确的账号密码无法登陆

    centos6.5_x64远程链接输入正确的账号密码无法登陆 背景: 硬件:二手服务器 软件:centos6.5-x64 昨天安装了些服务,安装包都是从官网下载安装 事故: 第二天来公司用xshell ...

  7. 登陆工行网上银行报60058017错误及输入正确网银密码提示密码不正确

    文章编号: 000007 - 最后修改:2010年07月28日 - 撰写人: Lander Zhang  适合项目: 通用 标题: 登陆工行网上银行报60058017错误及输入正确网银密码提示密码不正 ...

  8. 输入正确的账号密码和验证码后 验证码一直报错误的解决办法

    这两天写了一个登录的功能页面,用的是ivew,大致样子长这样 输入正确的账号密码以及验证码后死活提示验证码错误,后来查了下才发现需要对发起请求的时候配置 withCredentials: true 我 ...

  9. FTP登录时一直弹出登录窗口,就算输入正确的账号密码也不能登录

    FTP登录时一直弹出登录窗口,就算输入正确的账号密码也不能登录 一.问题描述 办公室的FTP本来用得好好的,结果有一天突然就不能用了.在文件资源管理器的地址栏输入FTP地址会正常弹出输入账号密码的对话 ...

最新文章

  1. 一致性算法(paxos,raft,ZAB)——paxos算法(大概)
  2. Java中使用SQLite数据库
  3. 遍历 HashMap 的 5 种最佳方式,我不信你全知道!
  4. 问题与解答 [Questions Answers]
  5. sql count用法_SQL学习笔记3:count(*)函数
  6. mybatis.net - 5 嵌入资源与引用资源
  7. controller调用controller的方法_SpringCloud(5):Feign整合Ribbon和Hystrix来进行远程调用与服务熔断...
  8. matlab最小二乘法_基于最小二乘法的线性回归拟合
  9. 蚂蚁金服:开源增强版 SpringBoot 的研发框架!
  10. android多线程网络通信
  11. WPF Ribbon 开发资料分享
  12. 第三方app版本更新 自定义接口协议+自定义对话框+显示进度对话框
  13. 正版win8/win8.1系统激活密钥(key)备份还原操作步骤
  14. 程序员在线写诗《寒江雪》
  15. 用欧拉公式推导三角函数所有公式包括 倍角公式-半角公式-和差化积-积化和差...
  16. Unity引擎UI模块知识Tree
  17. 区块链供应链金融有着怎样的意义?
  18. Android studio中使用NumCpp最新开源库
  19. 云学智慧校园-高校信息化一体化平台 V2.0 SE-WBS排期表(初拟)
  20. 从服务业开始创业,该怎么起步?

热门文章

  1. 第四章 图像频域滤波
  2. hooks 使用dva_hooks 中使用dva
  3. 机器学习系列(10)_决策树与随机森林回归
  4. 贷款违约预测-Task2 数据分析
  5. Android面试官,面试安卓开发十大问题
  6. 苹果公司新专利:自动防窥屏和共享屏幕
  7. 查看gcc/g++版本以及对应默认的的C++标准
  8. Android 网络框架
  9. LocalDB安装和连接
  10. FineReport自学题目——填报校验