2015-04-27 7 views
8

क्या मुझे क्रेडिट कार्ड नंबरों को प्रमाणित करने के लिए माइक्रोसॉफ्ट के CreditCardAttribute का उपयोग करना चाहिए?क्या मुझे क्रेडिट कार्ड नंबरों को प्रमाणित करने के लिए क्रेडिट कार्ड एट्रिब्यूट का उपयोग करना चाहिए?

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

या क्या मुझे भुगतान गेटवे इसे संभालने देना चाहिए, या कुछ और करना चाहिए? मैं यह पूछने के बाद कुछ पूछता हूं कि कुछ ग्राहक अपनी क्रेडिट कार्ड की जानकारी के साथ भुगतान जमा करने में असमर्थ हैं। सौभाग्य से, मैं इन ग्राहकों में से एक के साथ काम करने में सक्षम था, और पाया कि CreditCardAttribute को हटाने के बाद उनके वीजा कार्ड को बिना किसी समस्या के संसाधित किया गया था।

भाग में, यह सवाल अशिष्ट है, लेकिन मैं अन्य डेवलपर के विचारों और अनुभवों से लाभ उठाना चाहता हूं, और अन्य डेवलपर्स को प्रश्न पूछकर CreditCardAttribute का उपयोग करने के जोखिमों से अवगत कराऊंगा।

+0

करने के लिए एक कड़ी के रूप में जाना जाता है प्रश्न में विशेषता का दस्तावेज बहुत उपयोगी होगा। –

+0

@OndrejTucny [यहां आप जाते हैं] (https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.creditcardattribute%28v=vs.110%29.aspx)। त्वरित गूगल खोज एक लंबा रास्ता तय करता है। –

+1

[यह प्रश्न] (http://stackoverflow.com/q/12580450/3199927) कुछ अंतर्दृष्टि प्रदान करता है कि 'क्रेडिट कार्ड एट्रिब्यूट' इनपुट को मान्य करता है। – Tom

उत्तर

3

मुझे लगता है कि सबसे अच्छा तरीका यह पता लगाने के लिए बस यह परीक्षण करने के लिए है:

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

अगर है विधि मूल सी # CreditCardAttribute वर्ग से है। 1 से 12 संख्या से बाहर विफल रहा:

 True 
     True 
     True 
     True 
     False //"76009244561", // Dankort (PBS) 
     True 
     True 
     True 
     True 
     True 
     True 
     True 

तो, आप इसे इस्तेमाल करना चाहिए? नहीं, जाहिर है यह सभी संख्याओं का पता नहीं लगाता है। हालांकि आप अपना कोड ले सकते हैं और इसे बेहतर बना सकते हैं!

+0

समस्या पर बहुत अच्छा लगा! काश यह मुझे "सुधारित" सत्यापन का उपयोग करने का विश्वास दिलाता है। दुर्भाग्य से ऐसा लगता है कि मुझे क्या डर है। क्रेडिट कार्ड नंबरों की सूची अपूर्ण है क्योंकि मुझे बताया गया था कि यह वीजा कार्ड था। मुझे उम्मीद है कि वीजा होने में विफल रहता है। ग्राहक गलत हो सकता है, लेकिन मुझे इसके बारे में संदेह है। यह अभी भी मुझे लगता है कि इस तरह से क्रेडिट कार्ड सत्यापन का उपयोग जोखिम भरा है, भले ही आपके पास परीक्षण करने के लिए बहुत सारे नकली क्रेडिट कार्ड नंबर हैं। आखिरकार, वीजा कल नई संख्याएं डाल सकता था कि मेरा कस्टम, पूरी तरह से अद्यतित, सत्यापन विफल हो सकता है। –

+0

वास्तव में, इस पर वेब पर कई बार चर्चा की गई है, लुहान एल्गोरिदम का उपयोग सभी मौजूदा क्रेडिट कार्ड को कवर नहीं कर रहा है। मुझे लगता है कि 100% निश्चित होने का एकमात्र तरीका यह है कि वास्तव में लेनदेन को निष्पादित करके इसे सत्यापित करना है। –

+0

ऐसा कहकर, अगर मुझे किसी कारण से मेरे कोड में सत्यापन करने के लिए मजबूर होना पड़ा, तो इस तरह एक यूनिट परीक्षण होने का निश्चित रूप से जाने का तरीका है। इसके अलावा मैं लॉगिंग करना चाहता हूं (इस्तेमाल किए गए क्रेडिट कार्ड नंबरों की नहीं!) लेकिन सत्यापन की संख्या विफल हो जाती है ताकि मैं यह विचार कर सकूं कि मेरा वैधकर्ता झूठी नकारात्मकता का उत्पादन कर रहा है या नहीं। –

1

क्रेडिट कार्ड attribute के पीछे code में, यह बस Luhn चेक कर रहा है।

सभी भुगतान कार्ड (*) वर्तमान में ISO/IEC/7812 मानक का पालन करते हैं, जिसमें अंतिम अंक के रूप में एक ल्यूएन चेक अंक है।

हालांकि यह लून जांच केवल पारदर्शी त्रुटियों को रोकने के लिए उपयोग की जाती है। यह भुगतान गेटवे पर कार्ड नंबर जमा करने से पहले एक सैनिटी चेक के रूप में उपयोगी है, लेकिन यह मान्य करने के लिए उपयुक्त नहीं है कि कोई संख्या वैध कार्ड नंबर है या नहीं।

वैध कार्ड नंबर श्रेणियां मासिक रूप से बदलती हैं, और एक संख्या को पूरी तरह से सत्यापित करने का एकमात्र तरीका भुगतान गेटवे के माध्यम से इसे सत्यापित करना है। अगर केवल कार्ड को सत्यापित करने का प्रयास किया जाता है (इसे चार्ज करने के बजाए) यह शून्य मान 'प्राधिकरण केवल' शैली की जांच के साथ किया जाना चाहिए।

(*) इसका एकमात्र अपवाद चीन में एक कार्ड के प्रकार चीन UnionPay
(एक Diners क्लब 'मार्ग' ब्रांड ऐतिहासिक वहाँ भी था जो 1992 में वापस ले लिया गया)

+0

क्या आप कुछ सबूत प्रदान करेंगे जो आपके दावे का समर्थन करते हैं कि "सभी भुगतान कार्ड वर्तमान में लुहान एल्गोरिदम का पालन करते हैं"? ऐसा लगता है कि माइक्रोसॉफ्ट ने गलत और अच्छी तरह से ज्ञात एल्गोरिदम लागू किया है, या आपका दावा गलत है। –

+1

माइक्रोसॉफ्ट के कार्यान्वयन में कुछ भी गलत नहीं है। यह एक मान्य luhn जांच एल्गोरिदम है। यदि आप इसे अवैध परीक्षण डेटा खिलाते हैं, तो आपको एक अवैध परीक्षा परिणाम मिलेगा .. अपेक्षित के रूप में :) आपके पास शेष शेष परीक्षण जो पास नहीं होता है वह 11 अंकों का नंबर है। यह वैध कार्ड नंबर के लिए छोटा तरीका है जो आमतौर पर * 16 अंकों न्यूनतम होता है। (प्रारूप आमतौर पर 6 अंकों का आईआईएन होता है, चेक अंक के रूप में अंतिम अंक, अद्वितीय खाता संख्या के रूप में शेष)। इसका मतलब यह होगा कि डैंकोर्ट कार्ड में केवल 10,000 वैध खाता संख्याएं हैं? असंभव लगता है :) – PaulG

+0

शायद मैं आपको गलत समझ रहा हूं लेकिन ऐसा लगता है कि आप मानते हैं कि जिस समस्या का सामना मैंने किया है वह अस्तित्व में नहीं है। मैं जल्दी ही इस समस्या को पकड़ने के लिए भाग्यशाली था :) लगभग 20 ग्राहक जो भुगतान पृष्ठ पर पहुंचे, उनमें से कम से कम एक 16 अंकों वाला वीजा कार्ड नंबर के साथ, क्रेडिट कार्ड एट्रिब्यूट सत्यापन पर फंस गया। एक बार जब मैंने उस विशेषता को हटा दिया तो ग्राहक बिना किसी समस्या के अपना भुगतान जमा करने में सक्षम था। मैं समझता हूं कि लुहान एक मानक है और यह भी मानना ​​है कि एमएस का कार्यान्वयन ठीक है, लेकिन यह पता लगाना कि पहले 20 ग्राहकों में से एक में "गैर-मानक" क्रेडिट कार्ड नंबर आश्चर्यजनक था। –

संबंधित मुद्दे