الگوریتم و متد تشخیص صحت شماره کارت بانکی در PHP و جاوا اسکریپت

بازدید: 8058 بازدید

قطعه کد چک کردن صحیح بودن شماره کارت بانکی و اعتباری به زبان PHP

function bankCardCheck($card='', $irCard=true) {
    $card = (string) preg_replace('/\D/','',$card);
    $strlen = strlen($card);
    if($irCard==true and $strlen!=16)
        return false;
    if($irCard!=true and ($strlen<13 or $strlen>19))
        return false;
    if(!in_array($card[0],[2,4,5,6,9]))
        return false;
    
    for($i=0; $i<$strlen; $i++)
    {
        $res[$i] = $card[$i];
        if(($strlen%2)==($i%2))
        {
            $res[$i] *= 2;
            if($res[$i]>9)
                $res[$i] -= 9;        
        }
    }
    return array_sum($res)%10==0?true:false;    
}


نحوه استفاده از تابع:

$card = '1111222233334444';
if(bankCardCheck($card))
    echo 'ok';
else
    echo 'err';

قطعه کد چک کردن صحیح بودن شماره کارت بانکی و اعتباری به زبان Java Script

function checkCartDigit(code) {
        var L=code.length;
        if(L<16 || parseInt(code.substr(1,10),10)==0 || parseInt(code.substr(10,6),10)==0) return false;
        var c=parseInt(code.substr(15,1),10);
        var s=0;
        var k,d;
        for(var i=0;i<16;i++)
        {
            k=(i%2==0) ? 2 :1;
            d=parseInt(code.substr(i,1),10)*k;
            s+=(d >9) ? d-9 :d;
        }
        return ((s%10)==0);
    }


نحوه استغاده از این تابع نیز مانند مثال گفته شده در قسمت php می باشد.

توضیح در رابطه با الگوریتم

امروزه در اکثر نرم افزارهای تولیدی نیاز به دریافت شماره کارت های اعتباری یا کارت های بانکی از کاربران برای پرداخت یک سری از مزایا یا کمک های غیر نقدی برای پرسنل و یا افراد تحت پوشش شرکت های و موسسات مختلف می باشد.

از طرفی متاسفانه در حال حاضر هیچ الگوریتمی برای تشخیص صحت کد ورودی در اختیار برنامه نویسان قرار داده نشده است که به راحتی بتوانند صحت کد های ۱۶ رقمی که به عنوان شماره کارت در اختیار آنها قرار می دهند را تشخیص دهند که همین مساله نگرانی هایی را در بحث کنترل پرداخت ها و امورمالی به وجود آورده است.

اخیرا با توجه به نیاز خودم به کنترل صحت شماره کارت ها ،الگوریتم مربوط به کنترل شماره ۱۶ رقمی کارت های اعتباری و بانکی  را بدست آوردم و چون مطمئن هستم افراد زیادی هم همین نیاز را دارند روال انجام کار را در این جا توضیح می دهم

شماره روی کارت های اعتباری یا کارت های بانکی شماره ای است ۱۶ رقمی که از سمت چپ رقم اول بیانگر نوع یا کاربرد کارت (برای کارت های بانکی و اعتباری این رقم می تواند ۴ یا ۵ یا ۶ باشد ) و ۵ رقم بعدی بیانگر شماره شناسایی صادر کننده کارت و ارقام ۷ تا ۱۵ بیانگر شماره حساب یا شماره منحصر به فرد در مرکز صادرکننده کارت و رقم آخر آن هم یک رقم کنترل است که از روی ۱۵ رقم سمت چپ بدست می آید. برای بررسی کنترل کد کافی است مجدد از روی ۱۵ رقم سمت چپ صحت رقم کنترل را محاسبه کنیم

ساختار شماره کارت ها در جدول زیر نشان داده شده است

ساختار کد ۱۶ رقمی کارت های بانکی و اعتباری
ارقام کد رقم کنترل شماره منحصر به فرد در مرکز صادر کننده کارت برای شناسه صادر کننده نوع کارت
موقعیت ۱۶ ۱۵ ۱۴ ۱۳ ۱۲ ۱۱ ۱۰ ۹ ۸ ۷ ۶ ۵ ۴ ۳ ۲ ۱
 

۱- برای محاسبه رقم کنترل از روی سایر ارقام ، از سمت چپ و با شروع از موقعیت ۱ تا موقعیت ۱۶ ، ارقام موقعیت فرد را در ۲ و ارقام موقعیت زوج را در یک ضرب می کنیم، اگر حاصل ضرب هر مرحله بیشتر از  ۹ شد  ۹ واحد از آن کم کنید  تا یک رقمی شود و سپس اعداد حاصل را با هم جمع می کنیم.

۲– اگر عدد حاصل از اجرای مرحله یک بر ۱۰ بخش پذیر باشد ، شماره کارت صحیح قلمداد می شود  در غیر اینصورت شماره کارت صحیح نمی باشد

مثال : آیا کد ۶۲۷۴۱۲۹۰۰۵۴۷۳۷۴۲  یک شماره کارت بانکی معتبر است؟

برای این منظور حاصل جمع ضرب ارقام کارت در الگوی مورد نظر را با توجه به روش گفته شده محاسبه می کنیم این حاصل جمع در زیر آمده است. ضمنا چون رقم کنترل را نیز باید در انتهای کار به حاصل جمع مورد نظر اضافه کنیم برای راحتی رقم کنترل را نیز در یک ضرب کرده و به مجموع می افزاییم.

پس الگوی ضرب به صورت ۱۶ رقمی ۲۱۲۱۲۱۲۱۲۱۲۱۲۱۲۱ خواهد بود که هر رقم از الگو در رقم همو موقعیت آن از شماره کارت ضرب می شود ( در هر مرحله  چنانچه حاصلضرب رقم الگو ضرب در  رقم کارت بیشتر از ۹ بود ۹ واحد از نتیجه حاصل ضرب  کسر می کنیم). در زیر ۱۶ مورد ضرب الگو در ۱۶ رقم شماره کارت مورد بررسی در این مثال ،نمایش داده شده است

ساختار کد ۱۶ رقمی کارت های بانکی و اعتباری
ارقام کد رقم کنترل شماره منحصر به فرد در مرکز صادر کننده کارت برای دارنده کارت شناسه صادر کننده نوع کارت
موقعیت ۱۶ ۱۵ ۱۴ ۱۳ ۱۲ ۱۱ ۱۰ ۹ ۸ ۷ ۶ ۵ ۴ ۳ ۲ ۱
ارقام کارت ۲ ۴ ۷ ۳ ۷ ۴ ۵ ۰ ۰ ۹ ۲ ۱ ۴ ۷ ۲ ۶
الگوی ضرب ۱ ۲ ۱ ۲ ۱ ۲ ۱ ۲ ۱ ۲ ۱ ۲ ۱ ۲ ۱ ۲
محاسبه حاصل ضرب ۲ ۸ ۷ ۶ ۷ ۸ ۵ ۰ ۰ ۹ ۲ ۲ ۴ ۵ ۲ ۳
 
 

۶*۲=۱۲   -> 12-9=3
۲*۱=۲
۷*۲=۱۴   -> 14-9=5
۴*۱=۴
۱*۲=۲
۲*۱=۲
۹*۲=۱۸ ->18-9=9
۰*۱=۰
۰*۲=۰
۵*۱=۵
۴*۲=۸
۷*۱=۷
۳*۲=۶
۷*۱=۷
۴*۲=۸
۲*۱=۲

۸+۷+۶+۷+۸+۵+۰+۰+۹+۲+۲+۴+۵+۲+۳=۷۰

چون ۷۰ بر ۱۰ بخش پذیر است پس شماره کارت معتبر می باشد.

لطفا نظرات و پیشنهادات خود را جهت بهبود سایت اعلام نمایید.

چنانچه نمونه کد کاربردی دیگری دارید می توانید از بخش پشتیبانی برای ما ارسال نمایید تا با نام خودتان در سایت قرار بگیرد.

مطالعه بیشتر