我应该使用CreditCardAttribute来验证信用卡号吗?

时间:2015-04-27 15:20:48

标签: c# validation payment-gateway credit-card

我应该使用Microsoft的CreditCardAttribute来验证信用卡号吗?

[Required, CreditCard]
public string CreditCardNumber { get; set; }

或者我应该让支付网关处理它,还是做其他事情?我发现一些客户无法使用他们的信用卡信息提交付款后我问这个问题。幸运的是,我能够与其中一位客户合作,并在删除CreditCardAttribute后发现他们的Visa卡处理没有问题。

在某种程度上,这个问题是修辞性的,但我想从其他开发人员的想法和经验中受益,并让其他开发人员通过提出问题来了解使用CreditCardAttribute的风险。 / p>

2 个答案:

答案 0 :(得分:3)

我认为找到这个的最好方法是简单地测试它:

{% for key in cart %}  
          {% for info in product %}
                         {% if key == info.id %}
                             // do your bits here
                         {% endif %}
          {% endfor %}
{% endfor %}

IsValid方法来自原始的C#CreditCardAttribute类。 12个数字中有1个失败了:

using System;
using System.Linq;
using System.Text;
using System.IO;

namespace SO
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] cards = new string[] {
                //http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm
                "378282246310005",  // American Express
                "4012888888881881", // Visa
                "6011111111111117", // Discover
                "4222222222222", // Visa
                "76009244561", // Dankort (PBS)
                "5019717010103742", // Dakort (PBS) 
                "6331101999990016", // Switch/Solo (Paymentech)
                "30569309025904", // Diners Club 
                //http://www.getcreditcardnumbers.com/
                "5147004213414803", // Mastercard
                "6011491706918120", // Discover
                "379616680189541", // American Express
                "4916111026621797", // Visa
            };

            foreach (string card in cards)
            {
                Console.WriteLine(IsValid(card));
            }

            Console.ReadLine();
        }

        public static bool IsValid(object value)
        {
            if (value == null)
            {
                return true;
            }

            string ccValue = value as string;
            if (ccValue == null)
            {
                return false;
            }
            ccValue = ccValue.Replace("-", "");
            ccValue = ccValue.Replace(" ", "");

            int checksum = 0;
            bool evenDigit = false;

            // http://www.beachnet.com/~hstiles/cardtype.html
            foreach (char digit in ccValue.Reverse())
            {
                if (digit < '0' || digit > '9')
                {
                    return false;
                }

                int digitValue = (digit - '0') * (evenDigit ? 2 : 1);
                evenDigit = !evenDigit;

                while (digitValue > 0)
                {
                    checksum += digitValue % 10;
                    digitValue /= 10;
                }
            }

            return (checksum % 10) == 0;
        }
    }
}

那么,你应该使用它吗?不,显然它没有检测到所有数字。虽然你可以拿他们的代码并改进它!

答案 1 :(得分:3)

在信用卡code后面的attribute,只需执行Luhn支票。

所有支付卡(*)目前都遵循ISO/IEC/7812标准,其中有一个luhn校验位作为最终数字。

此luhn检查仅用于防止转换错误。在将卡号提交到支付网关之前,它可用作健全性检查,但不适合绝对验证号码是否是有效的卡号。

有效的卡号范围每月更改一次,绝对验证号码的唯一方法是通过支付网关对其进行验证。如果只是试图验证一张卡(而不是对它进行充电),则应该使用零值&#39;授权&#39;风格检查。

(*)唯一的例外是中国的卡片类型,即中国银联  (历史上还有一个Diners Club&#39; enRoute&#39;品牌,于1992年被撤销)