Parse Credit Card input from Magnetic Stripe

前端 未结 6 1822
故里飘歌
故里飘歌 2020-12-23 17:36

Does anyone know how to parse a credit card string input from a Magnetic Card Swiper?

I tried a JavaScript parser but never got it to work. This is what the input l

6条回答
  •  感情败类
    2020-12-23 18:17

    here is my code:

    1st the listener to get the data.... this data needs validation which i am looking for help on. A good swipe works fine, but a bad swipe will cause an error in the parser.

    $('#cc-dialog-form').keypress(function(e) 
    {
    
        var charCode = e.which;
        //ie? evt = e || window.event;
        track_start = '%';
        finished = false;
        timeout = 100;
        track_start_code = track_start.charCodeAt(0);
        //console.log('Track_start_code: ' + track_start_code);
    
        //console.log('keycode ' + e.keycode);
    
    
        //console.log('charcode ' + charCode);
        //console.log('track_start_code ' + track_start_code);
        if (charCode == track_start_code)
        {
            collect_track_data = true;
                $('#offline_cc_entry').hide();
                $('#cc_online').hide();
                $('#Manual_CC_DATA').hide();
                $('#cc_loading_image').show();      
    
        }
        if (collect_track_data)
        {   
            if (charCode == $.ui.keyCode.ENTER) 
            {
                //all done
                //console.log( card_data);
                collect_track_data = false;
                $('#cc_loading_image').hide();
                $('#Manual_CC_DATA').show();
                //console.log("Track Data: " + card_data);
    
    
                process_swipe_cc_payment(card_data);
                card_data = '';
    
            }
            else
            {
                card_data = card_data + String.fromCharCode(charCode);
                console.log(card_data);
                if (e.preventDefault) e.preventDefault();
                e.returnValue=false;
                return false;
            }
        }
        else
        {
            //i am guessing this will be regular input?
            if (charCode == $.ui.keyCode.ENTER) 
            {
                 process_keyed_or_offline_CC_payment();
            }
        }
        //console.log("which: " + e.which);
        //console.log("keyCode: " + e.keyCode);
        //track and collect data here?
    
    });
    

    And here is the parser.... note I put it all in one function so I can destroy all the variables so they are not lingering in a browser.

        parse_data = true;
    if (parse_data)
    {
    
    var parsed_card_data = {};
    parsed_card_data['card_data'] = card_data;
    var tracks = card_data.split("?");
    
    //console.log ("tracks");
    //console.log (tracks);
    parsed_card_data['track1'] = tracks[0];
    parsed_card_data['track2'] = tracks[1];
    //if there is a third track we might find it under tracks[2]
    
    //splitting the card data OPTION 1
    
    var track1_parsed = tracks[0].split("^");
    
    //console.log (track1_parsed);
    
    
    
    //track1 data....
    var card_number_track1 = track1_parsed[0].substring(2);
    
    
    parsed_card_data['card_number_track1'] = card_number_track1;
    
    var details2_1 = tracks[1].split(";");
    details2_1 = details2_1[1].split("=");
    
    
    var exp_date_track_1 = details2_1[1];
    exp_date_track_1 = exp_date_track_1.substring(0, exp_date_track_1.length - 1);
    exp_date_track_1 = exp_date_track_1.substring(2, 4) + "/" + exp_date_track_1.substring(0,2);
    parsed_card_data['exp_track1'] = exp_date_track_1;
    
    
    
    //now check if track one matches track 2...
    
    track2_parsed = tracks[1].split("=");
    
    
    card_number_track_2 = track2_parsed[0].substring(1);
    
    
    
    parsed_card_data['card_number_track_2'] = card_number_track_2;
    exp_date_track_2 = track2_parsed[1].substring(0,4);
    exp_date_track_2 = exp_date_track_2.substring(2, 4) + "/" + exp_date_track_2.substring(0,2);
    parsed_card_data['exp_date_track_2'] = exp_date_track_2;
    
    
    var primary_account_number =  card_number_track1.substring(0,1);
    
    
    if(card_number_track1 == card_number_track_2 &&  exp_date_track_1 == exp_date_track_2)
    {
            //now make a security feature showing the last 4 digits only....
        parsed_card_data['secure_card_number'] = "xxxx " + card_number_track1.substring(card_number_track1.length-4, card_number_track1.length);
    
    
    
    
        if(card_number_track1.length == 15)
        {
            parsed_card_data['card_type'] = "American Express"; 
        }
        else if(primary_account_number == 4)
        {
            parsed_card_data['card_type'] = "Visa";
        }
        else if(primary_account_number == 5)
        {
            parsed_card_data['card_type'] = "Master Card";
        }
        else if(primary_account_number == 6)
        {
            parsed_card_data['card_type'] = "Discover";
        }
        else
        {
            parsed_card_data['card_type'] = false;
        }
    
        var names_1 = track1_parsed[1].split("/");
        parsed_card_data['first_name'] = names_1[1].trim();
        parsed_card_data['last_name'] = names_1[0].trim();
    
    
        //console.log("return Data");
        //console.log(return_data);
    
    }
    else
    {
        parsed_card_data = false;
    }
    
        //zero out the variables...
    
        tracks = '';
        track1_parsed = '';
        card_number_track1 = '';
        details2_1 = '';
        exp_date_track_1 = '';
        track2_parsed = '';
        card_number_track_2 = '';
        exp_date_track_2 = '';
        primary_account_number = '';
    }
    
    if(parsed_card_data)
    {
        //console.log(parsed_card_data);
        $('#card_type').val(parsed_card_data['card_type']);
        $('#credit_card_number').val(parsed_card_data['secure_card_number']);
        $('#expiration').val(parsed_card_data['exp']);
        $('#card_holder').val(parsed_card_data['first_name']+ " " + parsed_card_data['last_name']);
    
        //parsed_card_data['track1'] is basically what we want???
    
        $('#CC_SWIPE_INSTRUCTIONS').hide();
        $('#CC_DATA').hide();
        $('#cc_loading_image').show();
    
    
    
        var post_string = {};
        post_string['ajax_request'] = 'CREDIT_CARD_PAYMENT';
        post_string['amount'] = $('#cc_input').val();
        post_string['card_data'] = parsed_card_data;
        post_string['pos_sales_invoice_id'] = pos_sales_invoice_id;
        post_string['pos_payment_gateway_id'] = $('#pos_payment_gateway_id').val();
        post_string['line'] = 'online';
        post_string['swipe'] = 'swipe';
    
        card_data = '';
                    parsed_card_data = {};
        var url = 'ajax_requests.php';
        $.ajax({
                type: 'POST',
                url: url,
                data: post_string,
                async: true,
                success:    function(response) 
                {
                    $('#cc_loading_image').hide();
                    console.log(response);
                    $('#CC_RESPONSE').show();
                    $('#CC_RESPONSE').html(response);
                    //here we would update the payment table - currently we will just refresh
    
                    post_string = '';
    
                }
                });
        post_string = '';
    }
    else
    {
        //error
        alert("Read Error");
        $( "#cc-dialog-form" ).dialog( "close" );
    }
    

提交回复
热议问题