我应该使用微软的CreditCardAttribute来验证信用卡号码吗?
[Required, CreditCard]
public string CreditCardNumber { get; set; }
或者我应该让支付网关处理它,还是做其他事情?在发现一些客户无法使用他们的信用卡信息提交付款后,我问这个问题 . 幸运的是,我能够与其中一个客户合作,并发现他们的Visa卡在删除 CreditCardAttribute
后没有遇到任何问题 .
在某种程度上,这个问题是修辞性的,但我想从其他开发人员的想法和经验中受益,并让其他开发人员通过提出问题来了解使用 CreditCardAttribute
的风险 .
2 回答
我认为找到这个的最好方法是简单地测试它:
IsValid方法来自原始的C#CreditCardAttribute类 . 12个数字中有1个失败:
那么,你应该使用它吗?不,显然它没有检测到所有数字 . 虽然你可以拿他们的代码并改进它!
在信用卡attribute后面的code中,它只是执行Luhn检查 .
所有支付卡(*)目前都遵循ISO/IEC/7812标准,其最后一位数字为luhn校验位 .
这个luhn检查仅用于防止转换错误 . 在将卡号提交给支付网关之前,它可用作健全性检查,但不适合绝对验证号码是否是有效的卡号 .
有效卡号范围每月更改一次,绝对验证号码的唯一方法是通过支付网关对其进行验证 . 如果仅尝试验证卡(而不是对其进行充电),则应使用零值“仅授权”样式检查 .
(*)唯一的例外是中国的卡片类型,即中国银联
(历史上还有一个大型俱乐部'enRoute'品牌,于1992年被撤销)