-
September 13th, 2018, 12:11
#1
عضو انجمن
تابع چک کردن کارت اعتباری و بانکی
سلام و عرض ادب خدمت بازدیدکنندگان محترم
شاید بسیار برایتان پیش آمده باشد که در پروژه ای لازم هست که شماره کارت بانکی کاربر را دریافت کنید
و شاید تا الان تنها اعتبارسنجی که انجام میدادید چک کردن 16رقمی بودن و فقط عدد بودن کارت بانکی بوده
بنا به دلایلی لازم شد که واقعا صحت کارت بانکی کاربر را بوسیله الگوریتمی تشخیص دهیم
خب بریم سراغ بررسی ساختار کارت های اعتباری و بانکی
شماره روی کارت های اعتباری یا کارت های بانکی شماره ای است 16 رقمی که از سمت چپ رقم اول بیانگر نوع یا کاربرد کارت (برای کارت های بانکی و اعتباری این رقم می تواند 4 یا 5 یا 6 باشد ) و 5 رقم بعدی بیانگر شماره شناسایی صادر کننده کارت و ارقام 7 تا 15 بیانگر شماره حساب یا شماره منحصر به فرد در مرکز صادرکننده کارت و رقم آخر آن هم یک رقم کنترل است که از روی 15 رقم سمت چپ بدست می آید. برای بررسی کنترل کد کافی است مجدد از روی 15 رقم سمت چپ صحت رقم کنترل را محاسبه کنیم
برای محاسبه رقم کنترل از روی سایر ارقام ، از سمت چپ و با شروع از موقعیت 1 تا موقعیت 16 ، ارقام موقعیت فرد را در 2 و ارقام موقعیت زوج را در یک ضرب می کنیم، اگر حاصل ضرب هر مرحله بیشتر از 9 شد 9 واحد از آن کم کنید تا یک رقمی شود و سپس اعداد حاصل را با هم جمع می کنیم.
اگر عدد حاصل از اجرای مرحله یک بر 10 بخش پذیر باشد ، شماره کارت صحیح قلمداد می شود در غیر اینصورت شماره کارت صحیح نمی باشد
منبع توضیحات ساختار کارت های اعتباری و بانکی : علی آرش
منبع کد : کارگاه طراحی امیدتک
کد 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';
ویرایش توسط omid1991 : September 14th, 2018 در ساعت 23:55
دلیل: بروز رسانی تابع
-
تعداد تشکر ها ازomid1991 به دلیل پست مفید
-
September 13th, 2018 12:11
# ADS
-
September 14th, 2018, 10:48
#2
عضو انجمن
پاسخ : تابع چک کردن کارت اعتباری و بانکی
آلگوریتم چک کردن کارت اعتباری ، همون آلگوریتم Luhn هست
کد PHP:
function luhn($number)
{
$sum = 0;
$numDigits = strlen($number);
$parity = $numDigits % 2;
for ($i = 0; $i < $numDigits; $i++) {
$digit = substr($number, $i, 1);
if ($parity == ($i % 2))
{
$digit <<= 1;
if (9 < $digit)
{
$digit = $digit - 9;
}
}
$sum += $digit;
}
return (0 == ($sum % 10));
}
-
تعداد تشکر ها ازrezaonline.net به دلیل پست مفید
-
September 14th, 2018, 13:14
#3
عضو انجمن
پاسخ : تابع چک کردن کارت اعتباری و بانکی

نوشته اصلی توسط
rezaonline.net
آلگوریتم چک کردن کارت اعتباری ، همون آلگوریتم Luhn هست
کد PHP:
function luhn($number)
{
$sum = 0;
$numDigits = strlen($number);
$parity = $numDigits % 2;
for ($i = 0; $i < $numDigits; $i++) {
$digit = substr($number, $i, 1);
if ($parity == ($i % 2))
{
$digit <<= 1;
if (9 < $digit)
{
$digit = $digit - 9;
}
}
$sum += $digit;
}
return (0 == ($sum % 10));
}
جیگرتو بخرم کد من اصلا شبیه به این کد هست ؟!
بعدشم این کد رو تست کن باگ داره کارت بانکی تقلبی هم قبول میکنه 
کدی که من نوشتم طبق توضیحات علی آرش و تقریبا بدون باگ هست
ویرایش توسط omid1991 : September 15th, 2018 در ساعت 03:53
-
-
September 14th, 2018, 19:51
#4
عضو دائم
پاسخ : تابع چک کردن کارت اعتباری و بانکی

نوشته اصلی توسط
omid1991
جیگرتو بخرم کد من اصلا شبیه به این کد هست ؟!
بعدشم این کد رو تست کن باگ داره کارت بانکی تقلبی هم قبول میکنه

کدی که من نوشتم طبق توضیحات علی آرش و بدون باگ هست

باسلام،
هم در کد شما هم در کد rezaonline.net امکان تقلب وجود دارد به طور مثال در کد شما 6000000000000031 و در کد دیگر 6000000000000000038343434343434343434 درست برگشت میخورد به این دلیل که ساختن عدد در mod 10 کار دشواری نیست.
کدی که قرار دادند همان ارقام موقعیت فرد را در 2 ضرب می کند اما تفاوتی که دارد شامل تمام کردیت کارت ها می شود، به طور مثال visa نوزده و سیزده رقمی هم دارد که باید ارقام موقعیت فرد بر تعداد ارقام % 2 بخش پذیر باشد تا در دو ضرب شود که در نتیجه کد شما جواب نمی دهد. اما کد شما برای کارت ها های داخلی کافی است که جای بهینه تر شدن هم دارد به طور مثال در حلقه اعداد لازم نیست هر بار شرط بررسی بزرگتر از 9 اجرا شود، شما فقط برای ارقام موقعیت فرد بررسی کنید که برای این کار نیاز است لاین بالاتر آن به شکل دیگر نوشته شود.
همچنین فکر کنم بانک ملت رقم اول 9 و بانک توسعه صادرات رقم اول 2 هم دارند که باید تحقیق کنید و اگر همچین چیزی هست به پیش شماره ها اضافه کنید تا کد کامل شود.
-
تعداد تشکر ها ازT.Toosi به دلیل پست مفید
-
September 14th, 2018, 20:36
#5
عضو انجمن
ویرایش توسط omid1991 : September 14th, 2018 در ساعت 22:39
-
-
September 14th, 2018, 23:07
#6
عضو انجمن
پاسخ : تابع چک کردن کارت اعتباری و بانکی

نوشته اصلی توسط
T.Toosi
باسلام،
هم در کد شما هم در کد rezaonline.net امکان تقلب وجود دارد به طور مثال در کد شما 6000000000000031 و در کد دیگر 6000000000000000038343434343434343434 درست برگشت میخورد به این دلیل که ساختن عدد در mod 10 کار دشواری نیست.
کدی که قرار دادند همان ارقام موقعیت فرد را در 2 ضرب می کند اما تفاوتی که دارد شامل تمام کردیت کارت ها می شود، به طور مثال visa نوزده و سیزده رقمی هم دارد که باید ارقام موقعیت فرد بر تعداد ارقام % 2 بخش پذیر باشد تا در دو ضرب شود که در نتیجه کد شما جواب نمی دهد. اما کد شما برای کارت ها های داخلی کافی است که جای بهینه تر شدن هم دارد به طور مثال در حلقه اعداد لازم نیست هر بار شرط بررسی بزرگتر از 9 اجرا شود، شما فقط برای ارقام موقعیت فرد بررسی کنید که برای این کار نیاز است لاین بالاتر آن به شکل دیگر نوشته شود.
همچنین فکر کنم بانک ملت رقم اول 9 و بانک توسعه صادرات رقم اول 2 هم دارند که باید تحقیق کنید و اگر همچین چیزی هست به پیش شماره ها اضافه کنید تا کد کامل شود.
عزیز من تحقیق کردم بانک ملت تو بعضی از شهرها با شماره 991975 شروع میشه و بانک توسعه صادرات با شماره 207177 شروع میشه
الگورتیم رو تغییر دادم علاوه بر کارت های ایرانی کارت های بانکی بین المللی هم میشه چک کرد
درمورد دور زدن ، برنامه نویسا و هکر ها بله براشون کاری نداره
ویرایش توسط omid1991 : September 15th, 2018 در ساعت 00:00
-
تعداد تشکر ها از omid1991 به دلیل پست مفید