Validate credit card number with Mod 10 algorithm in C#

Introduction

All you know what information contains in your NIC number. But do you know what information contains in the Credit Card Number? Following article provides brief details about what information contain in your credit card and demonstrates to how to validate credit card number using mod 10 (Luhn) algorithms with C#.

Background

Card Length

Typically, credit card numbers are all numeric and the length of the credit card number is between 12 digits to 19 digits.
14, 15, 16 digits – Diners Club
15 digits – American Express
13, 16 digits – Visa
16 digits – MasterCard
For more information please refer http://en.wikipedia.org/wiki/Bank_card_number.

Hidden information

Major Industry Identifier (MII)

The first digit of the credit card number is the Major Industry Identifier (MII). It designates the category of the entry which issued the card.
1 and 2 – Airlines
3 – Travel
4 and 5 – Banking and Financial
6 – Merchandising and Banking/Financial
7 – Petroleum
8 – Healthcare, Telecommunications
9 – National Assignment

Issuer Identification Number

The first 6 digits are the Issuer Identification Number. It will identify the institution that issued the card. Following are some of the major IINs.
Amex – 34xxxx, 37xxxx
Visa – 4xxxxxx
MasterCard – 51xxxx – 55xxxx
Discover – 6011xx, 644xxx, 65xxxx

Account Number

Taking away the 6 identifier digits and the last digits, remaining digits are the person’s account number (7th and following excluding last digits)

Check digits

Last digit is known as check digits or checksum. It is used to validate the credit card number using Luhn algorithm (Mod 10 algorithm).
For more information refer: http://en.wikipedia.org/wiki/Bank_card_number andhttp://en.wikipedia.org/wiki/List_of_Issuer_Identification_Numbers.

Luhn algorithm (Mod 10)

The Luhn algorithm or Luhn formula, also known as the “modulus 10″ or “mod 10″ algorithm, is a simple checksum formula used to validate a variety of identification numbers, such as credit card numbers, IMEI numbers, National Provider Identifier numbers in US and Canadian Social Insurance Numbers. It was created by IBM scientist Hans Peter Luhn. (http://en.wikipedia.org/wiki/Luhn_algorithm)
When you implementing eCommerce application, It is a best practice validating credit card number before send it to the bank validation.
Here are the Luhn steps which can used to validate the credit card number.

4 0 1 2 8 8 8 8 8 8 8 8 1 8 8 1

Step 1 – Starting with the check digit double the value of every other digit (right to left every 2nd digit)

Step 2 – If doubling of a number results in a two digits number, add up the digits to get a single digit number. This will results in eight single digit numbers.
Step 2
Step 3 – Now add the un-doubled digits to the odd places

Step 4 – Add up all the digits in this number

If the final sum is divisible by 10, then the credit card number is valid. If it is not divisible by 10, the number is invalid.
Using the code
Following code sample validates your credit card number against Mod 10.
Hide Copy Code
public static bool Mod10Check(string creditCardNumber)
{
//// check whether input string is null or empty
if (string.IsNullOrEmpty(creditCardNumber))
{
return false;
}

//// 1. Starting with the check digit double the value of every other digit
//// 2. If doubling of a number results in a two digits number, add up
/// the digits to get a single digit number. This will results in eight single digit numbers
//// 3. Get the sum of the digits
int sumOfDigits = creditCardNumber.Where((e) => e >= ‘0’ && e <= '9') .Reverse() .Select((e, i) => ((int)e – 48) * (i % 2 == 0 ? 1 : 2))
.Sum((e) => e / 10 + e % 10);

//// If the final sum is divisible by 10, then the credit card number
// is valid. If it is not divisible by 10, the number is invalid.
return sumOfDigits % 10 == 0;
}

————————————————————————————–

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ValidateCreditCard
{
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

“340931724562876”,//American Express
“30387628228509”,//Diners Club
“6011076572567331”,//Discover
“214997288618159”,//enRoute
“3088498025303152”,//JCB
“210054331070006”,//JCB 15 digit
“5131157941313628”,//MasterCard
“4532133451218182”,//Visa
“4716102585525”,//Visa 13 digit
“869945432670749”,//Voyager
};

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

Console.ReadLine();

Console.WriteLine(“******************************* Second Method ***********************************”);
Console.WriteLine(“Please enter your credit card number here:”);
var ccnumber = Console.ReadLine();
var results = Mod10Check(ccnumber);
if (results)
{
Console.WriteLine(“This Credit Card Number is valid!”);
}
else
{
Console.WriteLine(“Invalid Credit Card Number”);
}
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;
}

public static bool Mod10Check(string creditCardNumber)
{
//http://www.codeproject.com/Tips/515367/Validate-credit-card-number-with-Mod-algorithm

//// check whether input string is null or empty
if (string.IsNullOrEmpty(creditCardNumber))
{
return false;
}

//// 1. Starting with the check digit double the value of every other digit
//// 2. If doubling of a number results in a two digits number, add up
/// the digits to get a single digit number. This will results in eight single digit numbers
//// 3. Get the sum of the digits
int sumOfDigits = creditCardNumber.Where((e) => e >= ‘0’ && e <= '9') .Reverse() .Select((e, i) => ((int)e – 48) * (i % 2 == 0 ? 1 : 2))
.Sum((e) => e / 10 + e % 10);

//// If the final sum is divisible by 10, then the credit card number
// is valid. If it is not divisible by 10, the number is invalid.
return sumOfDigits % 10 == 0;
}

}
}

Regular Expression Password Validation

^ The password string will start this way
(?=.*[a-z]) The string must contain at least 1 lowercase alphabetical character
(?=.*[A-Z]) The string must contain at least 1 uppercase alphabetical character
(?=.*[0-9]) The string must contain at least 1 numeric character
(?=.*[!@#\$%\^&\*]) The string must contain at least one special character, but we are escaping reserved RegEx characters to avoid conflict
(?=.{8,}) The string must be eight characters or longer

WPF Enforce Single Instance Application

protected override void OnStartup(StartupEventArgs e)
{
// Single instance application logic

// Get Reference to the current Process
Process thisProc = Process.GetCurrentProcess();
// Check how many total processes have the same name as the current one
if (Process.GetProcessesByName(thisProc.ProcessName).Length > 1)
{
// If ther is more than one, than it is already running.
MessageBox.Show(“Application is already running.”, “Error”, MessageBoxButton.OK, MessageBoxImage.Stop);
Application.Current.Shutdown();
return;
}

// End single instance application logic

base.OnStartup(e);

//////DXSplashScreen.Show<SplashScreenView>();
//Thread.Sleep(5000);
DevExpress.Xpf.Core.ApplicationThemeHelper.UpdateApplicationThemeName();

Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException1;

InitModules();
}

Enforce SSL in Plesk

<!– Enforce SSL –>
<rewrite>
<rules>
<rule name=”HTTP to HTTPS redirect” stopProcessing=”true”>
<match url=”(.*)” />
<conditions>
<add input=”{HTTPS}” pattern=”off” ignoreCase=”true” />
</conditions>
<action type=”Redirect” redirectType=”Permanent” url=”https://{HTTP_HOST}/{R:1}” />
</rule>
</rules>
</rewrite>
<!– End enforce SSL –>

WPF Multi Threading

What you want to do is run the long running processes off the UI thread then when it is finishedupdate the UI – which the Dispatcher helps you to:

  1. Start long process on another thread and return immediately.
  2. (long process still running, UI continues to update)
  3. Long process finishes, update the UI on the UI thread.

e.g.:

    private void UpdateButtonContent(string text)
    {
        button.Content = text;
    }

    private void SimLongRunningProcess()
    {
        Thread.Sleep(2000);
    }

    private void OnProcessFinished(Task task)
    {
        string content;
        if(task.Exception != null)
        {
            content = task.Exception.Message;
        }
        else
        {
            content = "Success";
        }

        Dispatcher.BeginInvoke(new Action<string>(UpdateButtonContent), DispatcherPriority.Normal, content);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Start long running process and return immediatly
        var task = Task.Factory.StartNew(SimLongRunningProcess);
        task.ContinueWith(OnProcessFinished);
    }

Youtube API get video url after video upload

You can have the video url like this :

You have the result :

     "kind": "youtube#searchResult",
"etag": "\"adasdasdasdasdas"",
"id": {
"kind": "youtube#video",
"videoId": "123123asdsad12"
},
...

Now you get the field "videoId": "123123asdsad12"

And you can acces to the video via the link:

https://www.youtube.com/watch?v=123123asdsad12

And that’s it !

OPENJSON requires Compatibility Level 130

The OPENJSON function is available only under compatibility level 130. If your database compatibility level is lower than 130, SQL Server can’t find and run the OPENJSON function. Other built-in JSON functions are available at all compatibility levels.

You can check compatibility level in the sys.databases view or in database properties.

You can change the compatibility level of a database by using the following command:

ALTER DATABASE <DatabaseName> SET COMPATIBILITY_LEVEL = 130