সংখ্যার ভিত্তিতে আপনি ক্রেডিট কার্ডের ধরণটি কীভাবে সনাক্ত করতে পারেন?


516

আমি কীভাবে খালি তার সংখ্যার ভিত্তিতে ক্রেডিট কার্ডের ধরণ সনাক্ত করতে পারি তা চেষ্টা করার চেষ্টা করছি। কেউ কি এটি খুঁজে পেতে একটি নির্দিষ্ট, নির্ভরযোগ্য উপায় সম্পর্কে জানেন?


3
নিয়মিত ভাব প্রকাশ করা। পরীক্ষা করে দেখুন এই লিঙ্কে আরও তথ্যের জন্য।
সেনফো

3
বিস্তারিত উইকিপিডিয়া সমস্ত আছেন: en.wikipedia.org/wiki/Credit_card_numbers
স্টেন Vesterli

1
উইকিপিডিয়ায় en.wikedia.org/wiki/Credit_card_n নাম্বারে একটি ভাল সারসংক্ষেপ টেবিল রয়েছে । এটি প্রথম এক থেকে ছয়টি অঙ্ক যা কার্ডের ধরণ এবং জারিকারীকে বলে।
অ্যালেক্স

3
প্রথম সংখ্যার গোষ্ঠীটি বের করার জন্য আমি অন্য কোনও রেজেেক্স ব্যবহার করব না, আপনি সাধারণত প্রথম 4 নম্বর (মার্কিন যুক্তরাষ্ট্রে) থেকে বলতে পারেন। চার্জ সাফ করার জন্য অর্থ প্রদানের বিরক্ত করার আগে এটি বৈধ হতে পারে কিনা তা নিশ্চিত করার জন্য কার্ড নম্বরটিতে একটি 10 ​​মড চেকসাম চালান। Luhn অ্যালগরিদম
ড্যান ব্লেয়ার

3
এই অ্যালগোরিদমগুলি 'সর্বকালের জন্য' ভাল থাকলেও যে কেউ মন্তব্য করতে পারে - বা তারা পর্যায়ক্রমে পরিবর্তিত হয় যেমন 'কোনও ফোন নম্বর ক্যালিফোর্নিয়ায় রয়েছে কিনা তা গণনা করার জন্য' অ্যালগরিদম যেমন
সাইমন_উইভার

উত্তর:


771

ক্রেডিট / ডেবিট কার্ড নম্বরটি প্যান বা প্রাথমিক অ্যাকাউন্ট নম্বর হিসাবে উল্লেখ করা হয় । প্যান প্রথম ছয় সংখ্যার থেকে নেয়া হয় IIN , অথবা ইস্যুকারী সনাক্তকারী নম্বর , ইস্যুয়িং ব্যাঙ্ক একাত্মতার (IINs পূর্বে বিন নামে পরিচিত ছিল - ব্যাংক সনাক্তকারী সংখ্যা - যাতে আপনি কিছু দস্তাবেজ যে পরিভাষা উল্লেখ দেখতে পারেন)। এই ছয়টি ডিজিট আন্তর্জাতিক মানের, আইএসও / আইসিসি 7812 এর সাপেক্ষে , এবং নম্বর থেকে কার্ডের ধরণ নির্ধারণ করতে ব্যবহার করা যেতে পারে।

দুর্ভাগ্যক্রমে আসল আইএসও / আইইসি 7812 ডাটাবেসটি সর্বজনীনভাবে উপলভ্য নয়, তবে উইকিপিডিয়ায় বাণিজ্যিক এবং বিনামূল্যে উভয়ই অফিশিয়াল তালিকা রয়েছে ।

যাইহোক, নম্বর থেকে প্রকারটি সনাক্ত করতে, আপনি নীচের মত একটি নিয়মিত প্রকাশ করতে পারেন: মূল এক্সপ্রেশনগুলির জন্য ক্রেডিট

ভিসা: ^4[0-9]{6,}$ ভিসা কার্ড নম্বর 4 দিয়ে শুরু হয়।

মাস্টারকার্ড: ^5[1-5][0-9]{5,}|222[1-9][0-9]{3,}|22[3-9][0-9]{4,}|2[3-6][0-9]{5,}|27[01][0-9]{4,}|2720[0-9]{3,}$ ২০১ 2016 সালের আগে মাস্টারকার্ড সংখ্যা ৫৫ এর মাধ্যমে ৫৫ নম্বর দিয়ে শুরু হবে তবে এটি কেবল মাস্টারকার্ড ক্রেডিট কার্ডকেই সনাক্ত করবে ; মাস্টারকার্ড সিস্টেম ব্যবহার করে জারি করা অন্যান্য কার্ড রয়েছে যা এই আইআইএন পরিসরে পড়ে না। ২০১ In সালে, তারা পরিসীমাটিতে (222100-272099) যোগ করবে।

আমেরিকান এক্সপ্রেস: ^3[47][0-9]{5,}$ আমেরিকান এক্সপ্রেস কার্ড নম্বর 34 বা 37 দিয়ে শুরু হয়।

ডিনার 'স ক্লাব: ^3(?:0[0-5]|[68][0-9])[0-9]{4,}$ ডিনার ক্লাব কার্ড নম্বরগুলি 300 থেকে 305, 36 বা 38 এর মধ্যে দিয়ে শুরু হয় Din এখানে ডিনার ক্লাব কার্ড রয়েছে যা 5 দিয়ে শুরু হয় এবং 16 টি সংখ্যা রয়েছে। এগুলি ডিনার্স ক্লাব এবং মাস্টারকার্ডের মধ্যে একটি যৌথ উদ্যোগ এবং এটি মাস্টারকার্ডের মতো প্রক্রিয়া করা উচিত।

আবিষ্কার করুন: ^6(?:011|5[0-9]{2})[0-9]{3,}$ কার্ডের নম্বরগুলি 6011 বা 65 দিয়ে শুরু হবে।

জেসিবি: ^(?:2131|1800|35[0-9]{3})[0-9]{3,}$ জেসিবি কার্ড 2131, 1800 বা 35 দিয়ে শুরু হবে।

দুর্ভাগ্যক্রমে, মাস্টারকার্ড সিস্টেমের সাথে প্রক্রিয়াজাত বেশ কয়েকটি কার্ড রয়েছে যা মাস্টারকার্ডের আইআইএন পরিসরগুলিতে বাস করে না (সংখ্যাগুলি 51 ... 55 থেকে শুরু হয়); সর্বাধিক গুরুত্বপূর্ণ ঘটনাটি হ'ল মায়েস্ট্রো কার্ডগুলির মধ্যে অনেকগুলি অন্যান্য ব্যাংকের আইআইএন রেঞ্জ থেকে জারি করা হয়েছে এবং তাই এটি পুরো নম্বর জুড়ে অবস্থিত। ফলস্বরূপ, ধরে নেওয়া সর্বোত্তম যে আপনি যে কোনও কার্ড গ্রহণ করেন যা অন্য কোনও ধরণের নয় তা অবশ্যই মাস্টারকার্ড হতে হবে

গুরুত্বপূর্ণ : কার্ডের সংখ্যা দৈর্ঘ্যে পরিবর্তিত হয়; উদাহরণস্বরূপ, ভিসা অতীতে 13 ডিজিটের প্যান এবং 16 ডিজিটের প্যান সহ কার্ড ইস্যু করেছে। ভিসার ডকুমেন্টেশন বর্তমানে ইঙ্গিত দেয় যে এটি 12 এবং 19 সংখ্যার মধ্যে সংখ্যা জারি করতে বা জারি করতে পারে। সুতরাং, আপনার কমপক্ষে digit ডিজিট আছে কিনা তা যাচাই করা ছাড়া কার্ডের সংখ্যাটির দৈর্ঘ্য পরীক্ষা করা উচিত নয় (সম্পূর্ণ আইআইএন প্লাস ওয়ান চেক ডিজিটের জন্য, যা লুহান অ্যালগরিদমের দ্বারা পূর্বাভাস করা মানের সাথে মিলিত হওয়া উচিত) )।

আরও একটি ইঙ্গিত: কার্ডহোল্ডার প্যান প্রক্রিয়া করার আগে ইনপুট থেকে যে কোনও সাদা স্থান এবং বিরামচিহ্নগুলি অক্ষর করুন । কেন? কারণ প্রকৃত ক্রেডিট কার্ডের সামনে যেমন প্রদর্শিত হয়, তার অনুরূপ গ্রুপগুলিতে অঙ্কগুলি প্রবেশ করা সাধারণত অনেক সহজ easier

4444 4444 4444 4444

এর চেয়ে সঠিকভাবে প্রবেশ করা অনেক সহজ

4444444444444444

ব্যবহারকারীকে শাস্তি দেওয়ার ক্ষেত্রে আসলেই কোনও লাভ নেই কারণ তারা এমন অক্ষর প্রবেশ করেছে যা আপনি এখানে প্রত্যাশা করেন না।

এটি আপনার প্রবেশ ক্ষেত্রগুলিতে কমপক্ষে 24 টি অক্ষরের জন্য জায়গা রয়েছে তা নিশ্চিত করার বিষয়টিও বোঝায় , অন্যথায় ব্যবহারকারীরা যারা স্পেসে প্রবেশ করেন তারা ঘরছাড়া হয়ে যাবেন। আমি আপনাকে 32 ক্ষেত্রের অক্ষর প্রদর্শনের জন্য ক্ষেত্রটি যথেষ্ট প্রশস্ত করতে এবং 64 টি পর্যন্ত অনুমতি দেওয়ার পরামর্শ দিচ্ছি; যা প্রসারণের জন্য প্রচুর হেডরুম দেয়।

এখানে একটি চিত্র যা কিছুটা আরও অন্তর্দৃষ্টি দেয়:

আপডেট (২০১৪): এই উত্তরের মন্তব্যে উল্লিখিত চেকসাম পদ্ধতিটি আর কোনও কার্ডের সত্যতা যাচাইয়ের একটি বৈধ উপায় বলে মনে হচ্ছে না

আপডেট (২০১)): মাস্টারকার্ড আচে অর্থ প্রদান শুরু করে নতুন বিআইএন রেঞ্জ বাস্তবায়ন করবে ।

ক্রেডিট কার্ড যাচাইকরণ


7
দুর্দান্ত উদাহরণ। আপনার কি মাস্ত্রো কার্ডের জন্য নিয়মিত প্রকাশ আছে?
মানিকান্দন

4
না না না. আপনি কার্ড সংখ্যার দৈর্ঘ্যের উপর নির্ভর করতে পারবেন না; এগুলি যে কোনও সময় পরিবর্তন করতে পারে। আপনি যে কার্ড নম্বরের উপর নির্ভর করতে পারবেন তার একমাত্র অংশটি হ'ল আইআইএন (যেটিকে বিআইএন বলা হত) এবং এটি নম্বরটির উপসর্গ। অতিরিক্তভাবে, আপনি যেভাবে পরামর্শ দেন সেইভাবে আপনি মাস্টারকার্ড কার্ডগুলি সনাক্ত করতে পারবেন না ; এটি কেবলমাত্র মাস্টারকার্ড সিস্টেমের মাধ্যমে প্রক্রিয়া করা কার্ডগুলির একটি উপসেট বেছে নেবে (মূল সমস্যাটি মায়েস্ট্রো কার্ড হ'ল, যার মধ্যে বিভিন্ন আইআইএন উপসর্গ রয়েছে)।
অ্যালিস্টায়ার

2
@ আলাস্টায়ার আপনি মন্তব্য করার আগে প্রকাশগুলি পড়েছেন? এগুলি আইআইএন ব্যবহারের জন্য বিশেষভাবে লেখা হয়েছিল, সুতরাং আপনি কী বলতে চাইছেন তা আমি বুঝতে পারি না। তদ্ব্যতীত, আইআইএন কার্ড ইস্যুকারীকে সনাক্ত করতে ব্যবহার করা যেতে পারে, তবে বৈধ নয়। 5412, উদাহরণস্বরূপ, একটি সম্পূর্ণ মাস্টারকার্ড প্রতিনিধিত্ব করে না, তবে আপনার পরামর্শটি বোঝায় যে এটি এটি করে। আমি কোনও প্রমাণ পাইনি যে মাস্টারকার্ডগুলি 16 সংখ্যা ছাড়া আর কিছুই। আপনার দাবির জন্য উত্স নির্দ্বিধায় অনুভব করুন আপনি মাস্ত্রো কার্ডগুলির জন্য একটি আপডেটের প্রয়োজন তা উল্লেখ করে আপনি সঠিক।
সেনফো

3
@senfo আপনি ঠিক বলেছেন, 5412 একটি সম্পূর্ণ মাস্টারকার্ড নম্বর হবে না। আইআইএনগুলি ছয় ডিজিট দীর্ঘ, সুতরাং একটি সম্পূর্ণ কার্ড নম্বর অবশ্যই 7 ডিজিট (ন্যূনতম) হতে হবে এবং অবশ্যই লুহন চেকটি পাস করতে হবে। মাস্টারকার্ড সংখ্যার 16 টি সংখ্যা ব্যতীত অন্য কিছু রয়েছে এমন "প্রমাণ" দেওয়ার দরকার নেই; মুল বক্তব্যটি হ'ল আজকের পরিস্থিতি নির্বিশেষে, ভবিষ্যতে তারা 17 বা 18 সংখ্যা সহ কার্ড জারি করতে পারে বা কিছু কিছু 15 এর সাথে থাকতে পারে। তাদের উপর 16 ডিজিট দীর্ঘ হওয়া নির্ভর করা অপ্রয়োজনীয় এবং দীর্ঘমেয়াদী রক্ষণাবেক্ষণের ঝুঁকি তৈরি করে।
অ্যালিস্টায়ার

3
আমার বিশ্বাস করা খুব কঠিন যে লুহান অ্যালগরিদম অনুসারে কিছু বৈধ কার্ডের একটি সঠিক চেক ডিজিট থাকবে না believe এটি সাধারণ টাইপস এবং বোবা জালিয়াতির প্রচেষ্টার বিরুদ্ধে কার্ড নম্বর পরীক্ষা করতে একেবারে সর্বত্র ব্যবহার করে। পরিবর্তে, আমি পর্যবেক্ষণ করেছি বেশ কিছু স্মার্ট লোক কেবল অ্যালগরিদমকে না ধরে, এবং তারা কেবল এটি ভুল করে গণনা করে।
Rennex

74

জাভাস্ক্রিপ্টে:

function detectCardType(number) {
    var re = {
        electron: /^(4026|417500|4405|4508|4844|4913|4917)\d+$/,
        maestro: /^(5018|5020|5038|5612|5893|6304|6759|6761|6762|6763|0604|6390)\d+$/,
        dankort: /^(5019)\d+$/,
        interpayment: /^(636)\d+$/,
        unionpay: /^(62|88)\d+$/,
        visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
        mastercard: /^5[1-5][0-9]{14}$/,
        amex: /^3[47][0-9]{13}$/,
        diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
        discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
        jcb: /^(?:2131|1800|35\d{3})\d{11}$/
    }

    for(var key in re) {
        if(re[key].test(number)) {
            return key
        }
    }
}

ইউনিট পরীক্ষা:

describe('CreditCard', function() {
    describe('#detectCardType', function() {

        var cards = {
            '8800000000000000': 'UNIONPAY',

            '4026000000000000': 'ELECTRON',
            '4175000000000000': 'ELECTRON',
            '4405000000000000': 'ELECTRON',
            '4508000000000000': 'ELECTRON',
            '4844000000000000': 'ELECTRON',
            '4913000000000000': 'ELECTRON',
            '4917000000000000': 'ELECTRON',

            '5019000000000000': 'DANKORT',

            '5018000000000000': 'MAESTRO',
            '5020000000000000': 'MAESTRO',
            '5038000000000000': 'MAESTRO',
            '5612000000000000': 'MAESTRO',
            '5893000000000000': 'MAESTRO',
            '6304000000000000': 'MAESTRO',
            '6759000000000000': 'MAESTRO',
            '6761000000000000': 'MAESTRO',
            '6762000000000000': 'MAESTRO',
            '6763000000000000': 'MAESTRO',
            '0604000000000000': 'MAESTRO',
            '6390000000000000': 'MAESTRO',

            '3528000000000000': 'JCB',
            '3589000000000000': 'JCB',
            '3529000000000000': 'JCB',

            '6360000000000000': 'INTERPAYMENT',

            '4916338506082832': 'VISA',
            '4556015886206505': 'VISA',
            '4539048040151731': 'VISA',
            '4024007198964305': 'VISA',
            '4716175187624512': 'VISA',

            '5280934283171080': 'MASTERCARD',
            '5456060454627409': 'MASTERCARD',
            '5331113404316994': 'MASTERCARD',
            '5259474113320034': 'MASTERCARD',
            '5442179619690834': 'MASTERCARD',

            '6011894492395579': 'DISCOVER',
            '6011388644154687': 'DISCOVER',
            '6011880085013612': 'DISCOVER',
            '6011652795433988': 'DISCOVER',
            '6011375973328347': 'DISCOVER',

            '345936346788903': 'AMEX',
            '377669501013152': 'AMEX',
            '373083634595479': 'AMEX',
            '370710819865268': 'AMEX',
            '371095063560404': 'AMEX'
        };

        Object.keys(cards).forEach(function(number) {
            it('should detect card ' + number + ' as ' + cards[number], function() {
                Basket.detectCardType(number).should.equal(cards[number]);
            });
        });
    });
});

1
@ jolly.exe - আপনার ফিডাল সমস্ত পরীক্ষার জন্য অপরিবর্তিত কাজ করে না :(
শেডট্রি ডেভেলপার

@ ShadeTreeDeveloper শুধু যে কোনও মান যেমন প্রবেশ করান। 372176090165471 পাঠ্য ক্ষেত্রে AMAX এর জন্য
কোড স্পাই

@ jolly.exe আমি দেখছি ... আমি এমন কিছু আশা করছিলাম যা টাইপ করার সাথে সাথে ফর্ম্যাট হবে (কীপ ইভেন্টটি বন্ধ)। আমি একটি পূর্ণ সংখ্যা প্রবেশ করিয়ে দিলে ফিডলটি কাজ করে।
শেডটিড্রিপ্লোপার

আমি যে ইনপুট ফর্ম্যাটিং এবং বৈধতা চেয়েছিলাম তা করতে এই বিট কোডটি লিখেছিলাম। quercusv.github.io/smartForm
শেডট্রি ডেভেলপার

আপনি কীভাবে ভি-পে এবং ব্যানকন্ট্যাক্ট কার্ড নম্বর সনাক্ত করবেন তা জানেন? ধন্যবাদ
ওলেকসান্ডার IY

38

আপডেট হয়েছে: 15 ই জুন 2016 (বর্তমানে চূড়ান্ত সমাধান হিসাবে)

দয়া করে মনে রাখবেন যে আমি যেটিকে ভোট দিয়েছি তার পক্ষে আমি সবচেয়ে বেশি ভোট দিয়েছি, তবে এটি স্পষ্ট করার জন্যই এগুলি হ'ল রিজেক্সপস আসলে কাজ করে আমি হাজার হাজার আসল বিএন কোড দিয়ে এটি পরীক্ষা করেছি। সর্বাধিক গুরুত্বপূর্ণ হ'ল স্টার্ট স্ট্রিংগুলি ব্যবহার করা (otherwise) অন্যথায় এটি বাস্তব বিশ্বে মিথ্যা ফলাফল দেবে!

জেসিবি ^(?:2131|1800|35)[0-9]{0,}$ সমেত শুরু করুন: 2131, 1800, 35 (3528-3589)

আমেরিকান এক্সপ্রেস দিয়ে ^3[47][0-9]{0,}$ শুরু: 34, 37

ডিনার্স ক্লাবটি ^3(?:0[0-59]{1}|[689])[0-9]{0,}$ শুরু করুন: 300-305, 309, 36, 38-39

ভিসা দিয়ে ^4[0-9]{0,}$ শুরু: 4

মাস্টারকার্ড দিয়ে ^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$ শুরু করুন: 2221-2720, 51-55

মায়েস্ট্রো ^(5[06789]|6)[0-9]{0,}$ মায়েস্ট্রো সর্বদা সীমার মধ্যে বর্ধমান: 60-69 , অন্য কিছু নয় / দিয়ে শুরু হয়েছে, তবে 5 থেকে শুরু করে অবশ্যই মাস্টারকার্ড হিসাবে এনকোড করতে হবে। কোডের শেষের দিকে মায়েস্ট্রো কার্ডগুলি অবশ্যই সনাক্ত করতে হবে কারণ অন্য কারও 60-69 এর মধ্যে রয়েছে। কোড দেখুন।

^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$কোড করা বেশ কঠিন আবিষ্কার করুন, দিয়ে শুরু করুন: 6011, 622126-622925, 644-649, 65

ইন জাভাস্ক্রিপ্ট আমি এই ফাংশন ব্যবহার করুন। আপনি যখন এটি কোনও অনকিআপ ইভেন্টে অর্পণ করেন এটি ভাল হয় এবং এটি যত তাড়াতাড়ি সম্ভব ফলাফল দেয়।

function cc_brand_id(cur_val) {
    // the regular expressions check for possible matches as you type, hence the OR operators based on the number of chars
    // regexp string length {0} provided for soonest detection of beginning of the card numbers this way it could be used for BIN CODE detection also

    //JCB
    jcb_regex = new RegExp('^(?:2131|1800|35)[0-9]{0,}$'); //2131, 1800, 35 (3528-3589)
    // American Express
    amex_regex = new RegExp('^3[47][0-9]{0,}$'); //34, 37
    // Diners Club
    diners_regex = new RegExp('^3(?:0[0-59]{1}|[689])[0-9]{0,}$'); //300-305, 309, 36, 38-39
    // Visa
    visa_regex = new RegExp('^4[0-9]{0,}$'); //4
    // MasterCard
    mastercard_regex = new RegExp('^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$'); //2221-2720, 51-55
    maestro_regex = new RegExp('^(5[06789]|6)[0-9]{0,}$'); //always growing in the range: 60-69, started with / not something else, but starting 5 must be encoded as mastercard anyway
    //Discover
    discover_regex = new RegExp('^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$');
    ////6011, 622126-622925, 644-649, 65


    // get rid of anything but numbers
    cur_val = cur_val.replace(/\D/g, '');

    // checks per each, as their could be multiple hits
    //fix: ordering matter in detection, otherwise can give false results in rare cases
    var sel_brand = "unknown";
    if (cur_val.match(jcb_regex)) {
        sel_brand = "jcb";
    } else if (cur_val.match(amex_regex)) {
        sel_brand = "amex";
    } else if (cur_val.match(diners_regex)) {
        sel_brand = "diners_club";
    } else if (cur_val.match(visa_regex)) {
        sel_brand = "visa";
    } else if (cur_val.match(mastercard_regex)) {
        sel_brand = "mastercard";
    } else if (cur_val.match(discover_regex)) {
        sel_brand = "discover";
    } else if (cur_val.match(maestro_regex)) {
        if (cur_val[0] == '5') { //started 5 must be mastercard
            sel_brand = "mastercard";
        } else {
            sel_brand = "maestro"; //maestro is all 60-69 which is not something else, thats why this condition in the end
        }
    }

    return sel_brand;
}

এখানে আপনি এটি সঙ্গে খেলতে পারেন:

http://jsfiddle.net/upN3L/69/

পিএইচপি এই ফাংশনটি ব্যবহারের জন্য, এটি কয়েকটি উপ ভিসা / এমসি কার্ডগুলিও সনাক্ত করে:

/**
  * Obtain a brand constant from a PAN
  *
  * @param string $pan               Credit card number
  * @param bool   $include_sub_types Include detection of sub visa brands
  * @return string
  */
public static function getCardBrand($pan, $include_sub_types = false)
{
    //maximum length is not fixed now, there are growing number of CCs has more numbers in length, limiting can give false negatives atm

    //these regexps accept not whole cc numbers too
    //visa
    $visa_regex = "/^4[0-9]{0,}$/";
    $vpreca_regex = "/^428485[0-9]{0,}$/";
    $postepay_regex = "/^(402360|402361|403035|417631|529948){0,}$/";
    $cartasi_regex = "/^(432917|432930|453998)[0-9]{0,}$/";
    $entropay_regex = "/^(406742|410162|431380|459061|533844|522093)[0-9]{0,}$/";
    $o2money_regex = "/^(422793|475743)[0-9]{0,}$/";

    // MasterCard
    $mastercard_regex = "/^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$/";
    $maestro_regex = "/^(5[06789]|6)[0-9]{0,}$/";
    $kukuruza_regex = "/^525477[0-9]{0,}$/";
    $yunacard_regex = "/^541275[0-9]{0,}$/";

    // American Express
    $amex_regex = "/^3[47][0-9]{0,}$/";

    // Diners Club
    $diners_regex = "/^3(?:0[0-59]{1}|[689])[0-9]{0,}$/";

    //Discover
    $discover_regex = "/^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$/";

    //JCB
    $jcb_regex = "/^(?:2131|1800|35)[0-9]{0,}$/";

    //ordering matter in detection, otherwise can give false results in rare cases
    if (preg_match($jcb_regex, $pan)) {
        return "jcb";
    }

    if (preg_match($amex_regex, $pan)) {
        return "amex";
    }

    if (preg_match($diners_regex, $pan)) {
        return "diners_club";
    }

    //sub visa/mastercard cards
    if ($include_sub_types) {
        if (preg_match($vpreca_regex, $pan)) {
            return "v-preca";
        }
        if (preg_match($postepay_regex, $pan)) {
            return "postepay";
        }
        if (preg_match($cartasi_regex, $pan)) {
            return "cartasi";
        }
        if (preg_match($entropay_regex, $pan)) {
            return "entropay";
        }
        if (preg_match($o2money_regex, $pan)) {
            return "o2money";
        }
        if (preg_match($kukuruza_regex, $pan)) {
            return "kukuruza";
        }
        if (preg_match($yunacard_regex, $pan)) {
            return "yunacard";
        }
    }

    if (preg_match($visa_regex, $pan)) {
        return "visa";
    }

    if (preg_match($mastercard_regex, $pan)) {
        return "mastercard";
    }

    if (preg_match($discover_regex, $pan)) {
        return "discover";
    }

    if (preg_match($maestro_regex, $pan)) {
        if ($pan[0] == '5') { //started 5 must be mastercard
            return "mastercard";
        }
        return "maestro"; //maestro is all 60-69 which is not something else, thats why this condition in the end

    }

    return "unknown"; //unknown for this system
}

1
এবং দয়া করে নোট করুন, এটি কেবল সিসি নম্বর সনাক্তকরণ এবং বৈধতা নয়। এটি পৃথক, লুহন চেক হওয়া উচিত ...
জ্যানোস সাজাবো

ভিসা ইলেক্ট্রন কোথায়, এবং কেন মাষ্ট্রো কিছু ক্ষেত্রে মাস্টারকার্ড ফিরিয়ে দেয়? মাস্টারকার্ড কি তা পরীক্ষা করে দেখা উচিত নয়?
BadHorsie

এটি এই জিসিবি পরীক্ষার নম্বরটি যেকোন প্রকারের (3088514174175777) হিসাবে স্বীকৃতি দিতে ব্যর্থ হয়েছে এবং এই পরীক্ষার জেসিবি নম্বরটি ডাইনার_ক্লাব (3096278649822922) হিসাবে চিহ্নিত করে। পরীক্ষা কার্ড নম্বর এই তালিকা ধরে নেওয়া যাক করছে বৈধ যাহাই হউক না কেন ( freeformatter.com/credit-card-number-generator-validator.html )
ড্রিউ

কোনও ডকুমেন্টেশন নেই যে 308 বা 309 শুরু করা কোনও জিসিবি কার্ড হতে পারে
জ্যানোস সাজাবো

সিসি টাইপ সনাক্তকরণ কোড সরবরাহের জন্য +1, যা আপনি সাধারণত ইউএক্সের জন্য করতে চান - এমসিতে নতুন রেঞ্জের রেজিেক্সের জন্য একটি ছোট্ট টুইকের প্রয়োজন: / ^ (5 [1-5] | 222 [1-9] | 22 [3-9] [0-9] | 2 [3-6] [0-9] {2} | 27 [01] [0-9] | 2720) [0-9] {0,} $ /
কিনকুটা

21
public string GetCreditCardType(string CreditCardNumber)
{
    Regex regVisa = new Regex("^4[0-9]{12}(?:[0-9]{3})?$");
    Regex regMaster = new Regex("^5[1-5][0-9]{14}$");
    Regex regExpress = new Regex("^3[47][0-9]{13}$");
    Regex regDiners = new Regex("^3(?:0[0-5]|[68][0-9])[0-9]{11}$");
    Regex regDiscover = new Regex("^6(?:011|5[0-9]{2})[0-9]{12}$");
    Regex regJCB = new Regex("^(?:2131|1800|35\\d{3})\\d{11}$");


    if (regVisa.IsMatch(CreditCardNumber))
        return "VISA";
    else if (regMaster.IsMatch(CreditCardNumber))
        return "MASTER";
    else  if (regExpress.IsMatch(CreditCardNumber))
        return "AEXPRESS";
    else if (regDiners.IsMatch(CreditCardNumber))
        return "DINERS";
    else if (regDiscover.IsMatch(CreditCardNumber))
        return "DISCOVERS";
    else if (regJCB.IsMatch(CreditCardNumber))
        return "JCB";
    else
        return "invalid";
}

রেগেক্স, সি # ব্যবহার করে ক্রেডিট কার্ডের ধরণটি পরীক্ষা করার জন্য এখানে ফাংশনটি দেওয়া হচ্ছে


19

এটা দেখ:

http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B

function isValidCreditCard(type, ccnum) {
    /* Visa: length 16, prefix 4, dashes optional.
    Mastercard: length 16, prefix 51-55, dashes optional.
    Discover: length 16, prefix 6011, dashes optional.
    American Express: length 15, prefix 34 or 37.
    Diners: length 14, prefix 30, 36, or 38. */

    var re = new Regex({
        "visa": "/^4\d{3}-?\d{4}-?\d{4}-?\d",
        "mc": "/^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/",
        "disc": "/^6011-?\d{4}-?\d{4}-?\d{4}$/",
        "amex": "/^3[47]\d{13}$/",
        "diners": "/^3[068]\d{12}$/"
    }[type.toLowerCase()])

    if (!re.test(ccnum)) return false;
    // Remove all dashes for the checksum checks to eliminate negative numbers
    ccnum = ccnum.split("-").join("");
    // Checksum ("Mod 10")
    // Add even digits in even length strings or odd digits in odd length strings.
    var checksum = 0;
    for (var i = (2 - (ccnum.length % 2)); i <= ccnum.length; i += 2) {
        checksum += parseInt(ccnum.charAt(i - 1));
    }
    // Analyze odd digits in even length strings or even digits in odd length strings.
    for (var i = (ccnum.length % 2) + 1; i < ccnum.length; i += 2) {
        var digit = parseInt(ccnum.charAt(i - 1)) * 2;
        if (digit < 10) { checksum += digit; } else { checksum += (digit - 9); }
    }
    if ((checksum % 10) == 0) return true;
    else return false;
}

15

সম্প্রতি আমার এই জাতীয় কার্যকারিতা দরকার ছিল, আমি রুবিকে জেন্ড ফ্রেমওয়ার্ক ক্রেডিট কার্ড ভ্যালিডেটর পোর্ট করছি। রুবি মণি: https://github.com/Fivell/credit_card_validations Zend ফ্রেমওয়ার্ক: https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/CreditCard.php

টাইপ সনাক্তকরণের জন্য তারা উভয়ই INN রেঞ্জ ব্যবহার করে। এখানে আপনি INN সম্পর্কে পড়তে পারেন

এটি অনুসারে আপনি ক্রেডিট কার্ডটি বিকল্পভাবে সনাক্ত করতে পারবেন (রেগেক্সপস ছাড়াই, তবে উপসর্গ এবং সম্ভাব্য দৈর্ঘ্য সম্পর্কে কিছু বিধি ঘোষণা করে)

সুতরাং সর্বাধিক ব্যবহৃত কার্ডের জন্য আমাদের পরবর্তী নিয়ম রয়েছে

########  most used brands #########

    visa: [
        {length: [13, 16], prefixes: ['4']}
    ],
    mastercard: [
        {length: [16], prefixes: ['51', '52', '53', '54', '55']}
    ],

    amex: [
        {length: [15], prefixes: ['34', '37']}
    ],
    ######## other brands ########
    diners: [
        {length: [14], prefixes: ['300', '301', '302', '303', '304', '305', '36', '38']},
    ],

    #There are Diners Club (North America) cards that begin with 5. These are a joint venture between Diners Club and MasterCard, and are processed like a MasterCard
    # will be removed in next major version

    diners_us: [
        {length: [16], prefixes: ['54', '55']}
    ],

    discover: [
        {length: [16], prefixes: ['6011', '644', '645', '646', '647', '648',
                                  '649', '65']}
    ],

    jcb: [
        {length: [16], prefixes: ['3528', '3529', '353', '354', '355', '356', '357', '358', '1800', '2131']}
    ],


    laser: [
        {length: [16, 17, 18, 19], prefixes: ['6304', '6706', '6771']}
    ],

    solo: [
        {length: [16, 18, 19], prefixes: ['6334', '6767']}
    ],

    switch: [
        {length: [16, 18, 19], prefixes: ['633110', '633312', '633304', '633303', '633301', '633300']}

    ],

    maestro: [
        {length: [12, 13, 14, 15, 16, 17, 18, 19], prefixes: ['5010', '5011', '5012', '5013', '5014', '5015', '5016', '5017', '5018',
                                                              '502', '503', '504', '505', '506', '507', '508',
                                                              '6012', '6013', '6014', '6015', '6016', '6017', '6018', '6019',
                                                              '602', '603', '604', '605', '6060',
                                                              '677', '675', '674', '673', '672', '671', '670',
                                                              '6760', '6761', '6762', '6763', '6764', '6765', '6766', '6768', '6769']}
    ],

    # Luhn validation are skipped for union pay cards because they have unknown generation algoritm
    unionpay: [
        {length: [16, 17, 18, 19], prefixes: ['622', '624', '625', '626', '628'], skip_luhn: true}
    ],

    dankrot: [
        {length: [16], prefixes: ['5019']}
    ],

    rupay: [
        {length: [16], prefixes: ['6061', '6062', '6063', '6064', '6065', '6066', '6067', '6068', '6069', '607', '608'], skip_luhn: true}
    ]

}

তারপরে উপসর্গটি অনুসন্ধান করে এবং দৈর্ঘ্যের তুলনা করে আপনি ক্রেডিট কার্ড ব্র্যান্ডটি সনাক্ত করতে পারেন। লুহান অ্যালগোরিটম সম্পর্কেও ভুলে যাবেন না (এটি এখানে http://en.wikedia.org/wiki/Luhn বর্ণনা করা হয়েছে )।

হালনাগাদ

নিয়ম আপডেট তালিকা এখানে পাওয়া যাবে https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml


2
খুব উদাহরণস্বরূপ। ভিসা কার্ডগুলি 13 ডিজিট দীর্ঘ হতে পারে।
হারমান কান

@ হারমানকান, কোনও ভিসার ওয়েবসাইট বলে না যে এটির দৈর্ঘ্য ১ length হওয়া উচিত, আমি মনে করি দীর্ঘ সময় আগে এটি ১৩ টি হতে পারে তবে আজকাল নয়
ফাইভেল

1
আমি মনে করি এটি উত্তরাধিকার সমর্থন
পাঁচটি

1
@ হারমানকান, আরও একটি জিনিস রয়েছে, ভিসার ভিপি কার্ড রয়েছে এবং উইকিপিডিয়াতে অনুমিত হওয়া ভিসার ভিপে ব্র্যান্ডের প্যান দৈর্ঘ্য 13 থেকে 19 ডিজিট নির্দিষ্ট করতে পারে তাই 16 টিরও বেশি সংখ্যার কার্ড নম্বর এখন দেখা যাচ্ছে।
ফাইভেল

1
@Ethan, আমার আপডেট উত্তরে গত লিংক পরীক্ষা raw.githubusercontent.com/Fivell/credit_card_validations/master/...
Fivell

13

কোডেপ্রজেক্টে সিসি সম্পর্কিত সমস্ত ধরণের জন্য এখানে সম্পূর্ণ সি # বা ভিবি কোড রয়েছে।

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • PassesLuhnTest

এই নিবন্ধটি কয়েক বছর ধরে কোনও নেতিবাচক মন্তব্য ছাড়াই আপ হয়েছে।


1
@ বারেট - এটি ঠিক করেছেন। দেখে মনে হচ্ছে তারা এ্যাসনেট 'বিভাগ থেকে' বৈধকরণ 'বিভাগে স্থানান্তর করেছে যা লিঙ্কটি পরিবর্তন করেছে
সাইমন_উইভার

2
লিঙ্কটি নষ্ট হয়ে গেছে। এই একই ইউটিলিটি হতে পারে? কোডেপ্রজেক্ট
জোশ নোই

কোডেপ্রজেক্ট কোডটি ২০০ 2007 সালের War
আরন

8

কমপ্যাক্ট জাভাস্ক্রিপ্ট সংস্করণ

    var getCardType = function (number) {
        var cards = {
            visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
            mastercard: /^5[1-5][0-9]{14}$/,
            amex: /^3[47][0-9]{13}$/,
            diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
            discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
            jcb: /^(?:2131|1800|35\d{3})\d{11}$/
        };
        for (var card in cards) {
            if (cards[card].test(number)) {
                return card;
            }
        }
    };

8

পিএইচপি-তে আনাতোলির উত্তর:

 public static function detectCardType($num)
 {
    $re = array(
        "visa"       => "/^4[0-9]{12}(?:[0-9]{3})?$/",
        "mastercard" => "/^5[1-5][0-9]{14}$/",
        "amex"       => "/^3[47][0-9]{13}$/",
        "discover"   => "/^6(?:011|5[0-9]{2})[0-9]{12}$/",
    );

    if (preg_match($re['visa'],$num))
    {
        return 'visa';
    }
    else if (preg_match($re['mastercard'],$num))
    {
        return 'mastercard';
    }
    else if (preg_match($re['amex'],$num))
    {
        return 'amex';
    }
    else if (preg_match($re['discover'],$num))
    {
        return 'discover';
    }
    else
    {
        return false;
    }
 }

7

এখানে একটি পিএইচপি ক্লাস ফাংশন সিসিএনম্বার দ্বারা সিসিটাইপ প্রদান করে।
এই কোডটি কার্ডকে বৈধতা দেয় না বা চালায় না লুহান অ্যালগোরিদম কেবল এই পৃষ্ঠায় টেবিলের উপর ভিত্তি করে ক্রেডিট কার্ডের ধরণের সন্ধান করার চেষ্টা করে । সিসকার্ডের ধরণ নির্ধারণ করতে মূলত সিসনম্বার দৈর্ঘ্য এবং সিসকার্ড উপসর্গ ব্যবহার করা হয়।

<?php
class CreditcardType
{
    public static $creditcardTypes = [
        [
            'Name' => 'American Express',
            'cardLength' => [15],
            'cardPrefix' => ['34', '37'],
        ], [
            'Name' => 'Maestro',
            'cardLength' => [12, 13, 14, 15, 16, 17, 18, 19],
            'cardPrefix' => ['5018', '5020', '5038', '6304', '6759', '6761', '6763'],
        ], [
            'Name' => 'Mastercard',
            'cardLength' => [16],
            'cardPrefix' => ['51', '52', '53', '54', '55'],
        ], [
            'Name' => 'Visa',
            'cardLength' => [13, 16],
            'cardPrefix' => ['4'],
        ], [
            'Name' => 'JCB',
            'cardLength' => [16],
            'cardPrefix' => ['3528', '3529', '353', '354', '355', '356', '357', '358'],
        ], [
            'Name' => 'Discover',
            'cardLength' => [16],
            'cardPrefix' => ['6011', '622126', '622127', '622128', '622129', '62213','62214', '62215', '62216', '62217', '62218', '62219','6222', '6223', '6224', '6225', '6226', '6227', '6228','62290', '62291', '622920', '622921', '622922', '622923','622924', '622925', '644', '645', '646', '647', '648','649', '65'],
        ], [
            'Name' => 'Solo',
            'cardLength' => [16, 18, 19],
            'cardPrefix' => ['6334', '6767'],
        ], [
            'Name' => 'Unionpay',
            'cardLength' => [16, 17, 18, 19],
            'cardPrefix' => ['622126', '622127', '622128', '622129', '62213', '62214','62215', '62216', '62217', '62218', '62219', '6222', '6223','6224', '6225', '6226', '6227', '6228', '62290', '62291','622920', '622921', '622922', '622923', '622924', '622925'],
        ], [
            'Name' => 'Diners Club',
            'cardLength' => [14],
            'cardPrefix' => ['300', '301', '302', '303', '304', '305', '36'],
        ], [
            'Name' => 'Diners Club US',
            'cardLength' => [16],
            'cardPrefix' => ['54', '55'],
        ], [
            'Name' => 'Diners Club Carte Blanche',
            'cardLength' => [14],
            'cardPrefix' => ['300', '305'],
        ], [
            'Name' => 'Laser',
            'cardLength' => [16, 17, 18, 19],
            'cardPrefix' => ['6304', '6706', '6771', '6709'],
        ],
    ];

    public static function getType($CCNumber)
    {
        $CCNumber = trim($CCNumber);
        $type = 'Unknown';
        foreach (CreditcardType::$creditcardTypes as $card) {
            if (! in_array(strlen($CCNumber), $card['cardLength'])) {
                continue;
            }
            $prefixes = '/^(' . implode('|', $card['cardPrefix']) . ')/';
            if (preg_match($prefixes, $CCNumber) == 1) {
                $type = $card['Name'];
                break;
            }
        }
        return $type;
    }
}

6

অর্থ প্রদানের প্রক্রিয়াজাতকরণের অংশ হিসাবে ক্রেডিট কার্ডের প্রকারটি সনাক্ত করার চেষ্টা করবেন না। আপনি বৈধ লেনদেন হ্রাস করার ঝুঁকি নিয়ে যাচ্ছেন।

আপনার যদি আপনার পেমেন্ট প্রসেসরের তথ্য সরবরাহ করতে হয় (যেমন পেপাল ক্রেডিট কার্ডের জন্য কার্ডের ধরণের নাম রাখা দরকার ) তবে এটি উপলব্ধ ন্যূনতম তথ্য থেকে অনুমান করুন, যেমন

$credit_card['pan'] = preg_replace('/[^0-9]/', '', $credit_card['pan']);
$inn = (int) mb_substr($credit_card['pan'], 0, 2);

// @see http://en.wikipedia.org/wiki/List_of_Bank_Identification_Numbers#Overview
if ($inn >= 40 && $inn <= 49) {
    $type = 'visa';
} else if ($inn >= 51 && $inn <= 55) {
    $type = 'mastercard';
} else if ($inn >= 60 && $inn <= 65) {
    $type = 'discover';
} else if ($inn >= 34 && $inn <= 37) {
    $type = 'amex';
} else {
    throw new \UnexpectedValueException('Unsupported card type.');
}

এই বাস্তবায়ন (কেবলমাত্র প্রথম দুটি সংখ্যা ব্যবহার করে) সমস্ত বড় (এবং পেপালের ক্ষেত্রে সমর্থিত সমস্ত) কার্ড স্কিমগুলি সনাক্ত করতে যথেষ্ট। আসলে, আপনি ব্যতিক্রম পুরোপুরি এড়িয়ে যেতে এবং সর্বাধিক জনপ্রিয় কার্ডের ধরণে ডিফল্ট করতে চাইতে পারেন। আপনার অনুরোধের প্রতিক্রিয়াতে কোনও বৈধতা ত্রুটি আছে কিনা পেমেন্ট গেটওয়ে / প্রসেসর আপনাকে জানাতে দিন।

বাস্তবতা হ'ল আপনার অর্থ প্রদানের প্রবেশদ্বারটি আপনার সরবরাহ করা মূল্য সম্পর্কে চিন্তা করে না


1
এটি কেবল অসত্য। আমি তিনটি পৃথক সরবরাহকারীকে জানি যে ডিওর জন্য কার্ডের ধরণগুলি পাস করতে হবে এবং আপনি যদি এটি পাস না করেন তবে লেনদেন ব্যর্থ হবে।
এড ডিগাগন

3
@ এডিডেগাগনে - "কোন মানটি" ​​"পাস হলে যত্ন করে না" এর সমান হয় না তা বিবেচ্য নয়।
কোয়ান্টিন স্কোসেন

আমি কোথায় উল্লেখ করেছি? আমি কেবল উল্লেখ করেছি যে এমন কিছু সরবরাহকারী রয়েছে যা আপনাকে সিসি টাইপে পাস করতে হবে, এর চেয়ে বেশি কিছুই নয়।
এড ডিগাগেন

আপনি এই জটিল সমস্যাটি সহজ করতে পারবেন না, তবে সাধারণত অর্থ প্রদানের সরবরাহকারীদের আপনার কার্ডের ধরণের পরামর্শ দেওয়ার প্রয়োজন হয় না, তাদের সনাক্ত করার নিজস্ব পদ্ধতি রয়েছে
জানোস সাজাবো

6

ক্রেডিট কার্ডের প্রথম নম্বরগুলি বিক্রেতাকে আনুমানিকভাবে ব্যবহার করতে ব্যবহার করা যেতে পারে:

  • ভিসা: 49,44 বা 47
  • ভিসা ইলেক্ট্রন: 42, 45, 48, 49
  • মাস্টারকার্ড: 51
  • AMEX: 34
  • রাতের খাবার: 30, 36, 38
  • জেসিবি: 35

এই ব্যাপ্তিগুলি প্রধানত আপডেট করা হয়েছে, কার্ড বিক্রেতারা সংস্থাগুলি পোস্টে উল্লিখিত তুলনায় আরও রেঞ্জ যুক্ত করেছে।
এনজেআইমনদার

6

কার্ড রেঞ্জ রিকগনিশন (সিআরআর) এ, অ্যালগরিদমগুলির একটি অপূর্ণতা যা রেগেক্স বা অন্যান্য হার্ড-কোডেড রেঞ্জের একটি সিরিজ ব্যবহার করে, তা হল আমার অভিজ্ঞতার সাথে সময়ের সাথে বিআইএন / আইআইএনগুলি পরিবর্তিত হয়। কার্ডের সহ-ব্র্যান্ডিং একটি চলমান জটিলতা। বিভিন্ন কার্ড অধিগ্রহণকারী / বণিকদের আপনার একই কার্ডের আলাদা আচরণ করা প্রয়োজন, যেমন ভূ-অবস্থানের উপর নির্ভর করে।

তদ্ব্যতীত, বিস্তৃত প্রচলনে যেমন ইউনিয়নপে কার্ডগুলি সহ বিগত কয়েক বছরে, বিদ্যমান মডেলগুলি নতুন পরিসীমাগুলির সাথে লড়াই করে না যা কখনও কখনও বিস্তৃত বিস্তৃত রেঞ্জগুলির সাথে বিভক্ত হয় যা তারা ছাড়িয়ে যায়।
আপনার সিস্টেমের যে ভূগোলটি আবশ্যক তা জেনে রাখা বিশেষত দেশগুলিতে ব্যবহারের জন্য সীমাবদ্ধ বিধায় সহায়তা করতে পারে। উদাহরণস্বরূপ, সীমা 62 এর মধ্যে মার্কিন যুক্তরাষ্ট্রে কিছু এএএ সাব-রেঞ্জ অন্তর্ভুক্ত রয়েছে তবে যদি আপনার মার্চেন্টের ভিত্তি মার্কিন যুক্তরাষ্ট্রে থাকে তবে আপনি সমস্ত 62 ইউনিয়নপে হিসাবে বিবেচনা করতে পারবেন।
আপনাকে মার্চেন্টের অবস্থানের ভিত্তিতে কোনও কার্ডকে আলাদাভাবে আচরণ করতে বলা হতে পারে। উদাহরণস্বরূপ ইউকে নির্দিষ্ট কার্ডগুলিকে ঘরোয়াভাবে ডেবিট হিসাবে বিবেচনা করা, তবে আন্তর্জাতিকভাবে creditণ হিসাবে।

একটি বড় অধিগ্রহণকারী ব্যাংক দ্বারা পরিচালিত নিয়মের খুব দরকারী সেট রয়েছে। যেমন https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf এবং https://www.barclaycard.co.uk/business/files/BIN-Rules-UK.pdf । (জুনে ২০১ Val সালের বৈধ লিঙ্কগুলি, আপডেট হওয়া রেফারেন্সের জন্য একটি লিঙ্ক সরবরাহকারী ব্যবহারকারীকে ধন্যবাদ।) তবে এই সতর্কতার সাথে সচেতন হন যে এই সিআরআর বিধিগুলি কার্ড ইস্যু করা মহাবিশ্বকে প্রতিনিধিত্ব করতে পারে কারণ এটি সেই সত্তার দ্বারা অর্জিত ব্যবসায়ীদের ক্ষেত্রে প্রযোজ্য, এটিতে CUP / UPI হিসাবে চিহ্নিত রেঞ্জের অন্তর্ভুক্ত নেই।

এই মন্তব্যগুলি চৌম্বকীয় স্ট্রাইপ (ম্যাগস্ট্রাইপ) বা পিকেই (প্যান কী এন্ট্রি) পরিস্থিতিতে প্রযোজ্য। আইসিসি / ইএমভি বিশ্বে পরিস্থিতি আবার আলাদা।

আপডেট: এই পৃষ্ঠার অন্যান্য উত্তরগুলিতে (এবং লিঙ্কযুক্ত উইকিপিডিয়া পৃষ্ঠাটিও) জিসিবি সর্বদা 16 টি দীর্ঘ। তবে, আমার সংস্থায় ইঞ্জিনিয়ারদের একটি নিবেদিত দল রয়েছে যা একাধিক অধিগ্রহণকারী ব্যাংক এবং ভৌগলিক জুড়ে আমাদের পস ডিভাইস এবং সফ্টওয়্যারকে প্রত্যয়িত করে। এই দলটি জিসিবি থেকে প্রাপ্ত সাম্প্রতিকতম শংসাপত্রের প্যাকের কার্ডে একটি দীর্ঘ দীর্ঘ 19 টি প্যানের জন্য কেস কেস করেছিল।


হাই @ কাইক ওলিভিরা, আপডেট লিঙ্কগুলি দেখুন। ধন্যবাদ mac9416 যিনি আপডেট বিএন-বিধি রেফারেন্সের জন্য একটি লিঙ্ক সরবরাহ করেছেন।
মাইকরোগার

1
আপডেট বিএন-বিধি রেফারেন্সের জন্য আপনাকে @ mac9416 ধন্যবাদ।
মাইকরোগার

5

উসমান ওয়াই এর উত্তরের সুইফট ২.১ সংস্করণ। কিছু স্ট্রিং মান দ্বারা কল তাই যাচাই করতে একটি মুদ্রণ বিবৃতি ব্যবহার করুন

print(self.validateCardType(self.creditCardField.text!))

func validateCardType(testCard: String) -> String {

    let regVisa = "^4[0-9]{12}(?:[0-9]{3})?$"
    let regMaster = "^5[1-5][0-9]{14}$"
    let regExpress = "^3[47][0-9]{13}$"
    let regDiners = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$"
    let regDiscover = "^6(?:011|5[0-9]{2})[0-9]{12}$"
    let regJCB = "^(?:2131|1800|35\\d{3})\\d{11}$"


    let regVisaTest = NSPredicate(format: "SELF MATCHES %@", regVisa)
    let regMasterTest = NSPredicate(format: "SELF MATCHES %@", regMaster)
    let regExpressTest = NSPredicate(format: "SELF MATCHES %@", regExpress)
    let regDinersTest = NSPredicate(format: "SELF MATCHES %@", regDiners)
    let regDiscoverTest = NSPredicate(format: "SELF MATCHES %@", regDiscover)
    let regJCBTest = NSPredicate(format: "SELF MATCHES %@", regJCB)


    if regVisaTest.evaluateWithObject(testCard){
        return "Visa"
    }
    else if regMasterTest.evaluateWithObject(testCard){
        return "MasterCard"
    }

    else if regExpressTest.evaluateWithObject(testCard){
        return "American Express"
    }

    else if regDinersTest.evaluateWithObject(testCard){
        return "Diners Club"
    }

    else if regDiscoverTest.evaluateWithObject(testCard){
        return "Discover"
    }

    else if regJCBTest.evaluateWithObject(testCard){
        return "JCB"
    }

    return ""

}

4

স্ট্রিপ কার্ড স্কিম সনাক্তকরণের জন্য এই দুর্দান্ত জাভাস্ক্রিপ্ট লাইব্রেরি সরবরাহ করেছে। আমাকে কয়েকটি কোড স্নিপেট যুক্ত করতে এবং এটি কীভাবে ব্যবহার করতে হয় তা আপনাকে দেখান।

প্রথমত এটি আপনার ওয়েব পৃষ্ঠায় অন্তর্ভুক্ত করুন

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.payment/1.2.3/jquery.payment.js " ></script>

দ্বিতীয়ত কার্ড স্কিম সনাক্ত করার জন্য ফাংশন কার্ডটাইপ ব্যবহার করুন।

$(document).ready(function() {              
            var type = $.payment.cardType("4242 4242 4242 4242"); //test card number
            console.log(type);                                   
}); 

আরও উদাহরণ এবং ডেমো জন্য রেফারেন্স লিঙ্ক এখানে।

  1. Jquery.payment.js এর জন্য স্ট্রাইপ ব্লগ
  2. গিথুব সংগ্রহশালা

4

দ্রুত আপনি ক্রেডিট কার্ডের ধরণ সনাক্ত করতে একটি এনাম তৈরি করতে পারেন।

enum CreditCardType: Int { // Enum which encapsulates different card types and method to find the type of card.

case Visa
case Master
case Amex
case Discover

func validationRegex() -> String {
    var regex = ""
    switch self {
    case .Visa:
        regex = "^4[0-9]{6,}$"

    case .Master:
        regex = "^5[1-5][0-9]{5,}$"

    case .Amex:
        regex = "^3[47][0-9]{13}$"

    case .Discover:
        regex = "^6(?:011|5[0-9]{2})[0-9]{12}$"
    }

    return regex
}

func validate(cardNumber: String) -> Bool {
    let predicate = NSPredicate(format: "SELF MATCHES %@", validationRegex())
    return predicate.evaluateWithObject(cardNumber)
}

// Method returns the credit card type for given card number
static func cardTypeForCreditCardNumber(cardNumber: String) -> CreditCardType?  {
    var creditCardType: CreditCardType?

    var index = 0
    while let cardType = CreditCardType(rawValue: index) {
        if cardType.validate(cardNumber) {
            creditCardType = cardType
            break
        } else {
            index++
        }
    }
    return creditCardType
  }
}

ক্রেডিটকার্ড টাইপ.কার্ড টাইপফোর্ডসিডিটকার্ড নাম্বার ("# কার্ড নম্বর") পদ্ধতিটিতে কল করুন যা ক্রেডিটকার্ডটাইপ এনাম মান প্রদান করে।


3

JQuery সহ আমার সমাধান:

function detectCreditCardType() {
    var type = new Array;
    type[1] = '^4[0-9]{12}(?:[0-9]{3})?$';      // visa
    type[2] = '^5[1-5][0-9]{14}$';              // mastercard
    type[3] = '^6(?:011|5[0-9]{2})[0-9]{12}$';  // discover
    type[4] = '^3[47][0-9]{13}$';               // amex

    var ccnum = $('.creditcard').val().replace(/[^\d.]/g, '');
    var returntype = 0;

    $.each(type, function(idx, re) {
        var regex = new RegExp(re);
        if(regex.test(ccnum) && idx>0) {
            returntype = idx;
        }
    });

    return returntype;
}

যদি 0টি ফিরে আসে তবে ক্রেডিট কার্ডের ধরণটি সনাক্ত করা যায় না।

ক্রেডিট কার্ড ইনপুট ক্ষেত্রে "ক্রেডিটকার্ড" শ্রেণি যুক্ত করা উচিত।


1
বিদ্যমান উত্তরের বিভিন্নতা।
গাজুস

1
হ্যাঁ, আমি উপরের উত্তরগুলি থেকে কোডটি ব্যবহার করেছি, এটি উন্নত করে এখানে পোস্ট করেছি।
ডাউনভোটের

3
আপনার (ক) এটি বিদ্যমান কোডের উন্নতি হিসাবে পরামর্শ দেওয়া উচিত, (খ) উপযুক্ত অবদানগুলি লিখেছিলেন বা (গ) আপনি নিয়মিত প্রকাশটি লেখার জন্য যে উত্সগুলি ব্যবহার করেছেন তা উল্লেখ করতে হবে।
গজুস

1
গজুস, আমি বিশ্বাস করি যে এই মুহুর্তে আমি যেভাবে পারি পারত সম্প্রদায়কে সহায়তা করেছি, দয়া করে আমাকে কারও জন্য কিছু করা উচিত ছিল তা বলা বন্ধ করুন। আমি সাহায্যকারী হতে পারে আমি যা করেছি।
জুরাব ওয়েব

3

আমি ক্রেডিট কার্ড ফর্ম্যাটিং এবং ফোন নম্বর ফর্ম্যাটিংয়ের জন্য বেশ কিছুটা অনুসন্ধান করেছি। প্রচুর ভাল টিপস পেয়েছে তবে কিছুই আমার সঠিক আকাঙ্ক্ষাগুলির সাথে খাপ খায়নি তাই আমি এই বিট কোডটি তৈরি করেছি । আপনি এটি এর মতো ব্যবহার করুন:

var sf = smartForm.formatCC(myInputString);
var cardType = sf.cardType;

2
// abobjects.com, parvez ahmad ab bulk mailer
use below script

function isValidCreditCard2(type, ccnum) {
       if (type == "Visa") {
          // Visa: length 16, prefix 4, dashes optional.
          var re = /^4\d{3}?\d{4}?\d{4}?\d{4}$/;
       } else if (type == "MasterCard") {
          // Mastercard: length 16, prefix 51-55, dashes optional.
          var re = /^5[1-5]\d{2}?\d{4}?\d{4}?\d{4}$/;
       } else if (type == "Discover") {
          // Discover: length 16, prefix 6011, dashes optional.
          var re = /^6011?\d{4}?\d{4}?\d{4}$/;
       } else if (type == "AmEx") {
          // American Express: length 15, prefix 34 or 37.
          var re = /^3[4,7]\d{13}$/;
       } else if (type == "Diners") {
          // Diners: length 14, prefix 30, 36, or 38.
          var re = /^3[0,6,8]\d{12}$/;
       }
       if (!re.test(ccnum)) return false;
       return true;
       /*
       // Remove all dashes for the checksum checks to eliminate negative numbers
       ccnum = ccnum.split("-").join("");
       // Checksum ("Mod 10")
       // Add even digits in even length strings or odd digits in odd length strings.
       var checksum = 0;
       for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
          checksum += parseInt(ccnum.charAt(i-1));
       }
       // Analyze odd digits in even length strings or even digits in odd length strings.
       for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
          var digit = parseInt(ccnum.charAt(i-1)) * 2;
          if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
       }
       if ((checksum % 10) == 0) return true; else return false;
       */

    }
jQuery.validator.addMethod("isValidCreditCard", function(postalcode, element) { 
    return isValidCreditCard2($("#cardType").val(), $("#cardNum").val()); 

}, "<br>credit card is invalid");


     Type</td>
                                          <td class="text">&nbsp; <form:select path="cardType" cssclass="fields" style="border: 1px solid #D5D5D5;padding: 0px 0px 0px 0px;width: 130px;height: 22px;">
                                              <option value="SELECT">SELECT</option>
                                              <option value="MasterCard">Mastercard</option>
                                              <option value="Visa">Visa</option>
                                               <option value="AmEx">American Express</option>
                                              <option value="Discover">Discover</option>
                                            </form:select> <font color="#FF0000">*</font> 

$("#signupForm").validate({

    rules:{
       companyName:{required: true},
       address1:{required: true},
       city:{required: true},
       state:{required: true},
       zip:{required: true},
       country:{required: true},
       chkAgree:{required: true},
       confPassword:{required: true},
       lastName:{required: true},
       firstName:{required: true},
       ccAddress1:{required: true},
       ccZip:{         
           postalcode : true
       },
       phone:{required: true},
       email:{
           required: true,
           email: true
           },
       userName:{
           required: true,
           minlength: 6
           },
       password:{
           required: true,
           minlength: 6
           },          
       cardNum:{           
            isValidCreditCard : true
       },

ক্রেডিট কার্ড যাচাইয়ের জন্য অ্যালগরিদম সম্পর্কে প্রশ্নটি সুনির্দিষ্ট বাস্তবায়ন নয়। এই কোডটি কী করে?
এমিল বিক্রষ্টম

2

মাত্র এক চামচ খাওয়ানো:

$("#CreditCardNumber").focusout(function () {


        var regVisa = /^4[0-9]{12}(?:[0-9]{3})?$/;
        var regMasterCard = /^5[1-5][0-9]{14}$/;
        var regAmex = /^3[47][0-9]{13}$/;
        var regDiscover = /^6(?:011|5[0-9]{2})[0-9]{12}$/;

        if (regVisa.test($(this).val())) {
            $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/visa.png")'>");          

        }

        else if (regMasterCard.test($(this).val())) {
        $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/mastercard.png")'>");

        }

        else if (regAmex.test($(this).val())) {

           $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/amex.png")'>");

        }
         else if (regDiscover.test($(this).val())) {

           $("#CCImage").html("<img height='40px' src='@Url.Content("~/images/discover.png")'>");

        }
        else {
        $("#CCImage").html("NA");

        }

    });

2

পাইথনে লিখিত কিছু বুলিয়ান ফাংশনগুলির উদাহরণ এখানে রয়েছে যা Trueযদি ফাংশনের নাম অনুসারে কার্ড সনাক্ত করা হয় তবে ফিরে আসে return

def is_american_express(cc_number):
    """Checks if the card is an american express. If us billing address country code, & is_amex, use vpos
    https://en.wikipedia.org/wiki/Bank_card_number#cite_note-GenCardFeatures-3
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^3[47][0-9]{13}$', cc_number))


def is_visa(cc_number):
    """Checks if the card is a visa, begins with 4 and 12 or 15 additional digits.
    :param cc_number: unicode card number
    """

    # Standard Visa is 13 or 16, debit can be 19
    if bool(re.match(r'^4', cc_number)) and len(cc_number) in [13, 16, 19]:
        return True

    return False


def is_mastercard(cc_number):
    """Checks if the card is a mastercard. Begins with 51-55 or 2221-2720 and 16 in length.
    :param cc_number: unicode card number
    """
    if len(cc_number) == 16 and cc_number.isdigit():  # Check digit, before cast to int
        return bool(re.match(r'^5[1-5]', cc_number)) or int(cc_number[:4]) in range(2221, 2721)
    return False


def is_discover(cc_number):
    """Checks if the card is discover, re would be too hard to maintain. Not a supported card.
    :param cc_number: unicode card number
    """
    if len(cc_number) == 16:
        try:
            # return bool(cc_number[:4] == '6011' or cc_number[:2] == '65' or cc_number[:6] in range(622126, 622926))
            return bool(cc_number[:4] == '6011' or cc_number[:2] == '65' or 622126 <= int(cc_number[:6]) <= 622925)
        except ValueError:
            return False
    return False


def is_jcb(cc_number):
    """Checks if the card is a jcb. Not a supported card.
    :param cc_number: unicode card number
    """
    # return bool(re.match(r'^(?:2131|1800|35\d{3})\d{11}$', cc_number))  # wikipedia
    return bool(re.match(r'^35(2[89]|[3-8][0-9])[0-9]{12}$', cc_number))  # PawelDecowski


def is_diners_club(cc_number):
    """Checks if the card is a diners club. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^3(?:0[0-6]|[68][0-9])[0-9]{11}$', cc_number))  # 0-5 = carte blance, 6 = international


def is_laser(cc_number):
    """Checks if the card is laser. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^(6304|670[69]|6771)', cc_number))


def is_maestro(cc_number):
    """Checks if the card is maestro. Not a supported card.
    :param cc_number: unicode card number
    """
    possible_lengths = [12, 13, 14, 15, 16, 17, 18, 19]
    return bool(re.match(r'^(50|5[6-9]|6[0-9])', cc_number)) and len(cc_number) in possible_lengths


# Child cards

def is_visa_electron(cc_number):
    """Child of visa. Checks if the card is a visa electron. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^(4026|417500|4508|4844|491(3|7))', cc_number)) and len(cc_number) == 16


def is_total_rewards_visa(cc_number):
    """Child of visa. Checks if the card is a Total Rewards Visa. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^41277777[0-9]{8}$', cc_number))


def is_diners_club_carte_blanche(cc_number):
    """Child card of diners. Checks if the card is a diners club carte blance. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^30[0-5][0-9]{11}$', cc_number))  # github PawelDecowski, jquery-creditcardvalidator


def is_diners_club_carte_international(cc_number):
    """Child card of diners. Checks if the card is a diners club international. Not a supported card.
    :param cc_number: unicode card number
    """
    return bool(re.match(r'^36[0-9]{12}$', cc_number))  # jquery-creditcardvalidator

1

কার্ড নম্বরটির প্রথম ছয়টি অঙ্ক (প্রাথমিক এমআইআই ডিজিট সহ) ইস্যুকারী সনাক্তকরণ নম্বর (আইআইএন) হিসাবে পরিচিত । এগুলি কার্ড সরবরাহকারী প্রতিষ্ঠানকে সনাক্ত করে যা কার্ড ধারককে কার্ড জারি করে। বাকি নম্বরটি কার্ড সরবরাহকারী দ্বারা বরাদ্দ করা হয়। কার্ড নম্বরটির দৈর্ঘ্য এটির সংখ্যাগুলির সংখ্যা। অনেক কার্ড প্রদানকারী তাদের কার্ডে পুরো আইআইএন এবং অ্যাকাউন্ট নম্বর মুদ্রণ করে।

উপরের তথ্যের ভিত্তিতে আমি কার্ড ব্র্যান্ড চিহ্নিত করতে জাভা কোডের একটি স্নিপেট রাখতে চাই ।

নমুনা কার্ডের ধরণ

public static final String AMERICAN_EXPRESS = "American Express";
public static final String DISCOVER = "Discover";
public static final String JCB = "JCB";
public static final String DINERS_CLUB = "Diners Club";
public static final String VISA = "Visa";
public static final String MASTERCARD = "MasterCard";
public static final String UNKNOWN = "Unknown";

কার্ড উপসর্গ

// Based on http://en.wikipedia.org/wiki/Bank_card_number#Issuer_identification_number_.28IIN.29
public static final String[] PREFIXES_AMERICAN_EXPRESS = {"34", "37"};
public static final String[] PREFIXES_DISCOVER = {"60", "62", "64", "65"};
public static final String[] PREFIXES_JCB = {"35"};
public static final String[] PREFIXES_DINERS_CLUB = {"300", "301", "302", "303", "304", "305", "309", "36", "38", "39"};
public static final String[] PREFIXES_VISA = {"4"};
public static final String[] PREFIXES_MASTERCARD = {
        "2221", "2222", "2223", "2224", "2225", "2226", "2227", "2228", "2229",
        "223", "224", "225", "226", "227", "228", "229",
        "23", "24", "25", "26",
        "270", "271", "2720",
        "50", "51", "52", "53", "54", "55"
    };

ইনপুট নম্বরটিতে প্রদত্ত উপসর্গগুলির কোনও আছে কিনা তা পরীক্ষা করে দেখুন।

public String getBrand(String number) {

String evaluatedType;
if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_AMERICAN_EXPRESS)) {
    evaluatedType = AMERICAN_EXPRESS;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_DISCOVER)) {
    evaluatedType = DISCOVER;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_JCB)) {
    evaluatedType = JCB;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_DINERS_CLUB)) {
    evaluatedType = DINERS_CLUB;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_VISA)) {
    evaluatedType = VISA;
} else if (StripeTextUtils.hasAnyPrefix(number, PREFIXES_MASTERCARD)) {
    evaluatedType = MASTERCARD;
} else {
    evaluatedType = UNKNOWN;
}
    return evaluatedType;
}

অবশেষে, ইউটিলিটি পদ্ধতি

/**
  * Check to see if the input number has any of the given prefixes.
  *
  * @param number the number to test
  * @param prefixes the prefixes to test against
  * @return {@code true} if number begins with any of the input prefixes
*/

public static boolean hasAnyPrefix(String number, String... prefixes) {
  if (number == null) {
       return false;
  }
   for (String prefix : prefixes) {
       if (number.startsWith(prefix)) {
       return true;
    }
  }
     return false;
}

উল্লেখ


1

কোটলিনের জন্য এটি চেষ্টা করুন। Regex যোগ করুন এবং যখন বিবৃতি যোগ করুন।

private fun getCardType(number: String): String {

        val visa = Regex("^4[0-9]{12}(?:[0-9]{3})?$")
        val mastercard = Regex("^5[1-5][0-9]{14}$")
        val amx = Regex("^3[47][0-9]{13}$")

        return when {
            visa.matches(number) -> "Visa"
            mastercard.matches(number) -> "Mastercard"
            amx.matches(number) -> "American Express"
            else -> "Unknown"
        }
    }

0

নিয়মিত প্রকাশের নিয়ম যা সংশ্লিষ্ট কার্ড বিক্রেতাদের সাথে মেলে :

  • (4\d{12}(?:\d{3})?) ভিসার জন্য
  • (5[1-5]\d{14}) মাস্টারকার্ডের জন্য
  • (3[47]\d{13}) এএমএক্সের জন্য।
  • ((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?) মাস্ত্রোর পক্ষে
  • (3(?:0[0-5]|[68][0-9])[0-9]{11}) ডিনার্স ক্লাবের জন্য
  • (6(?:011|5[0-9]{2})[0-9]{12}) আবিষ্কারের জন্য
  • (35[2-8][89]\d\d\d{10}) জেসিবির জন্য।

আমি মনে করি যে জেসিবির জন্য রেজেেক্স ভুল। 3528 এবং 3589 এর মধ্যে প্রথম প্রথম চারটি সংখ্যা গ্রহণ করা উচিত, তবে 3570 উদাহরণ নয় is
গাব

0

নম্বর থেকে ক্রেডিট কার্ডের ধরণটি সনাক্ত করতে আমি https://github.com/bendrucker/creditcards-tyype/ ব্যবহার করি । আমি যে সমস্যার সমাধান করেছিলাম তা হ'ল পরীক্ষার নম্বর 6011 1111 1111 1117 আবিষ্কার করুন

https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ থেকে আমরা দেখতে পাচ্ছি এটি একটি আবিষ্কারের সংখ্যা কারণ এটি 6011 দ্বারা শুরু হয় But তবে ক্রেডিটকার্ডস-প্রকারের ফলাফল আমি পেয়েছি "ম্যায়েস্ট্রো" ro বিষয়টি লেখকের কাছে খুলেছি। তিনি আমাকে খুব শীঘ্রই জবাব দিয়েছিলেন এবং এই পিডিএফ ডকটি https://www.discovernetwork.com/downloads/IPP_VAR_Comp تعم.pdf সরবরাহ করুন ডক থেকে আমরা স্পষ্ট দেখতে পাচ্ছি যে 6011 1111 1111 1117 আবিষ্কারের ক্রেডিট কার্ডের সীমাতে আসে না।


আমারও একই সমস্যা আছে, আপনি কি এই ঠিক করে ফেলেছেন?
lucasvm1980

@ lucasvm1980 আমি মনে করি ডিস্কোভারনেটওয়ার্ক.কম পিডিএফ ফাইলটি আরও নির্ভরযোগ্য। এবং 6011 1111 1111 1117 নম্বরটি কেবল একটি পরীক্ষা নম্বর, কোনও আসল ক্রেডিট কার্ডের এই নম্বর নেই। সুতরাং আমি মনে করি এটি নিয়ে কোনও চিন্তা করার দরকার নেই।
yuxiaomin

দেখে মনে হচ্ছে কিছু ডিস্কভার কার্ডের সাথে কিছু ত্রুটি রয়েছে, আমি বৈধ নম্বর চেষ্টা করেছি এবং আমিও ত্রুটি পেয়েছি।
lucasvm1980

@ lucasvm1980 আপনি কি নম্বরটি সরবরাহ করতে এবং গিথুবে একটি সমস্যা জমা দিতে পারেন?
yuxiaomin

0

দ্রুত চেষ্টা করুন।

func checkCardValidation(number : String) -> Bool
{
    let reversedInts = number.characters.reversed().map { Int(String($0)) }
        return reversedInts.enumerated().reduce(0, {(sum, val) in
            let odd = val.offset % 2 == 1
            return sum + (odd ? (val.element! == 9 ? 9 : (val.element! * 2) % 9) : val.element!)
        }) % 10 == 0
}

ব্যবহার করুন।

if (self.checkCardValidation(number: "yourNumber") == true) {
     print("Card Number valid")
}else{
     print("Card Number not valid")
}

0
follow Luhn’s algorithm

 private  boolean validateCreditCardNumber(String str) {

        int[] ints = new int[str.length()];
        for (int i = 0; i < str.length(); i++) {
            ints[i] = Integer.parseInt(str.substring(i, i + 1));
        }
        for (int i = ints.length - 2; i >= 0; i = i - 2) {
            int j = ints[i];
            j = j * 2;
            if (j > 9) {
                j = j % 10 + 1;
            }
            ints[i] = j;
        }
        int sum = 0;
        for (int i = 0; i < ints.length; i++) {
            sum += ints[i];
        }
        if (sum % 10 == 0) {
           return true;
        } else {
            return false;
        }


    }

then call this method

Edittext mCreditCardNumberEt;

 mCreditCardNumberEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

             int cardcount=   s.toString().length();
                 if(cardcount>=16) {
                    boolean cardnumbervalid=   validateCreditCardNumber(s.toString());
                    if(cardnumbervalid) {
                        cardvalidtesting.setText("Valid Card");
                        cardvalidtesting.setTextColor(ContextCompat.getColor(context,R.color.green));
                    }
                    else {
                        cardvalidtesting.setText("Invalid Card");
                        cardvalidtesting.setTextColor(ContextCompat.getColor(context,R.color.red));
                    }
                }
               else if(cardcount>0 &&cardcount<16) {
                     cardvalidtesting.setText("Invalid Card");
                     cardvalidtesting.setTextColor(ContextCompat.getColor(context,R.color.red));
                }

                else {
                    cardvalidtesting.setText("");

                }


                }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.