Quantcast
Channel: Python/Django Solr Lucene ubuntu linux developer
Viewing all articles
Browse latest Browse all 10

Python code to check either the card number provided is valid or not

$
0
0

Python code to check either the card number provided is valid or not
can be used in validating the Credit-card while dealing with cards

# coding=utf-8

class Check_Credit_Card(object):
    """
    Class to check either the Credit card number is valid or not
    """
    cc_patterns = dict(amex={15: ('34', '37')},
        carteblanche={14: ('300', '301', '302', '303', '304', '305', '36', '38')},
        dinersclub={14: ('300', '301', '302', '303', '304', '305', '36', '38')}, discover={16: ('6011')},
        enroute={(15): ('2014', '2149')}, jcb={15: ('2131', '1800'), (16): ('3')},
        mastercard={(16): ('51', '52', '53', '54', '55')}, visa={(13, 16): ('4')})

    def check(self,cc_num,cc_type):
        """
        Main function to check the card
        """
        cc_type = cc_type.strip().lower().replace(' ', '')
        cc_num = str(cc_num)

        if cc_type in self.cc_patterns.keys():
            # Perform length check
            valid_lengths = self.cc_patterns[cc_type].keys()
            if len(cc_num) not in valid_lengths:
                return (False, 'Invalid length (%s) for %s' % \
                    (str(valid_lengths).strip('[]'), cc_type))

            # Perform prefix check
            valid_prefixes = self.cc_patterns[cc_type][len(cc_num)]
            prefix_match = False
            for prefix in valid_prefixes:
                prefix_length = len(prefix)
                if cc_num[:prefix_length] == prefix:
                    prefix_match = True
            if not prefix_match:
                return (False, 'Invalid prefix (not in %s)' % \
                    ','.join(valid_prefixes))

            # Perform mod 10 check
            if cc_type == 'enroute':
                pass # Only cc_type that doesn't do a mod 10 check
            else:
                check_digits = []
                is_even = False
                for digit in cc_num:
                    if not is_even:
                        check_digits.append(int(digit))
                    else:
                        mult_digits = str(int(digit) * 2)
                        check_digits.append(mult_digits[0])
                        if len(mult_digits == 2):
                            check_digits.append(int(mult_digits[1]))

                check_sum = sum(check_digits)
                if check_sum % 10 != 0:
                    return False, 'Invalid check sum (%d)' % check_sum

            return True, ''
        else:
            return False, 'Invalid card type (%s)' % cc_type

if __name__ == "__main__": #For testing you can Use the file directly in python console..
    x = Check_Credit_Card()
    x = x.check('5235235879456682','MASTERCARD')
    print x[0]

#VIEWS.PY
def Check_Validity(request):
    if request.method == 'POST':
        Data = request.POST.copy()
        cc_obj = Check_Credit_Card()
        result = cc_obj.check(Data.get('card_no',''),Data.get('card_type',''))
        return HttpResponse(simplejson.dumps({'result':result[0],'reason':result[1]}), mimetype="application/json")
    return HttpResponse(simplejson.dumps({'result':'Not a valid method'}), mimetype="application/json")
#URLS.PY
url(r'^check_validity$',Check_Validity,name="Check_Validity_View")


Viewing all articles
Browse latest Browse all 10

Trending Articles