اعتبارسنجی شماره کارت بانکی
الگوریتم Luhn و تشخیص بانک از BIN؛ مالک کارت برنمیگردد.
محاسبه فقط در مرورگر است؛ شماره کارت به سرور فرستاده نمیشود.
۱۶ رقم وارد کنید.
مرتبط
وقتی در فروشگاه آنلاین یا اپ پرداخت، شمارهٔ کارت را تایپ میکنید و قبل از رفتن به درگاه، پیغام «شماره نامعتبر» میبینید، معمولاً اولین حدس این است که کارت مسدود شده یا موجودی کافی نیست. در بسیاری از موارد اصل ماجرا سادهتر است: یک رقم جابهجا شده، فاصلهٔ اضافه از کپی پیامرسان مانده، یا رقم کنترل با الگوریتم Luhn همخوان نیست. ماشینحساب اعتبارسنجی کارت در FinAI همان لحظه، فقط روی دستگاه شما، بررسی میکند آیا از نظر ساختار ریاضی شمارهٔ ۱۶ رقمی قابل قبول است یا نه؛ بدون تماس با بانک، بدون استعلام موجودی، و بدون اینکه بدانید کارت به نام چه کسی صادر شده است.
تفاوت این دو لایه — «ساختار درست» در برابر «کارت واقعی و فعال» — برای هر کسی که پرداخت میگیرد یا میدهد مهم است. فروشندهای که قبل از ثبت سفارش Luhn را چک میکند، خطای تایپی مشتری را زودتر میگیرد و از برگشت تراکنشهای بیفایده در درگاه جلوگیری میکند. خریداری که شمارهٔ کارت دوستش را برای واریز کپی کرده، با یک رد Luhn میفهمد احتمالاً یک رقم کم یا زیاد شده، نه اینکه حتماً حساب بسته شده باشد. در ادامه میخوانید Luhn دقیقاً چه میگوید، چه نمیگوید، رابطهٔ آن با شش رقم اول (BIN) چیست، و چرا هرگز نباید شمارهٔ کامل را برای «اعتبارسنجی» به سرورهای ناشناس بفرستید.
Luhn چیست و چرا روی کارت بانکی دیده میشود
الگوریتم Luhn — که گاهی «mod 10» هم مینامندش — در دههٔ ۱۹۵۰ برای تشخیص خطای دستی در شمارههای شناسایی ابداع شد و بعد به استاندارد ISO/IEC 7812 برای شمارههای کارت بانکی راه یافت. ایده ساده است: از رقم آخر (رقم کنترل) استفاده میکنید تا بفهمید آیا بقیهٔ ارقام با یک قاعدهٔ ثابت جمع میشوند یا یک رقم در مسیر اشتباه وارد شده. این قاعده هیچ ارتباطی با رمز دوم، CVV2، تاریخ انقضا، یا اتصال به شبکهٔ شتاب ندارد؛ purely یک فیلتر ریاضی روی ۱۶ رقم است.
در ایران، کارتهای بانکی عضو شتاب معمولاً ۱۶ رقم دارند و رقم شانزدهم همان رقم کنترل Luhn است. اگر کسی ۱۵ رقم اول را درست بنویسد و رقم آخر را اشتباه بزند، Luhn رد میشود حتی وقتی پانزده رقم اول دقیقاً متعلق به یک کارت واقعی باشد. برعکس، میتوان — با دانستن قاعده — ترکیبی ساخت که Luhn را پاس کند ولی هیچ کارت صادرشدهای در شبکه وجود نداشته باشد. پس «پذیرش Luhn» فقط میگوید: «این رشته از نظر چکدیجیت قابل دفاع است»، نه «این کارت در دیتابیس بانک ثبت شده».
گامبهگام روی یک شمارهٔ فرضی
فرض کنید (فقط برای آموزش) شمارهای دارید که پانزده رقم اولش مشخص است و میخواهید بدانید رقم کنترل چه باید باشد. در Luhn از راست به چپ شمارش میکنید: رقم یکم (از راست) رقم کنترل است و در جمع نهایی بدون دوبرابر شدن وارد میشود؛ رقم دوم دو برابر، رقم سوم بدون دوبرابر، رقم چهارم دو برابر، و الی آخر. هر بار که دو برابر کردن عددی را به دو رقم (مثلاً ۱۴) تبدیل کرد، ارقام را جمع میکنید (۱+۴=۵). مجموع همه باید مضرب ۱۰ باشد.
در عمل، ابزار FinAI این کار را در مرورگر انجام میدهد: ارقام فارسی به لاتین نرمال میشوند، فاصله و خط تیره حذف میشوند، اگر طول غیر از ۱۶ باشد ورودی رد میشود، و سپس نتیجهٔ «Luhn قبول» یا «Luhn رد» نمایش داده میشود. اگر بانک از جدول BIN شناخته شود، نام بانک هم کنار نتیجه میآید؛ آن بخش مربوط به شش رقم اول است، نه خود Luhn.
خطاهای تایپ و کپی که Luhn میگیرد
تجربهٔ پشتیبانی فروشگاهها نشان میدهد شایعترین خطاها اینهاست: جابهجایی دو رقم مجاور (مثلاً ۴۲ بهجای ۲۴)، یک رقم تکراری یا حذفشده هنگام کپی از PDF، و paste کردن شمارهای که در انتها کاراکتر نامرئی یا emoji فاصله دارد. Luhn بسیاری از این خطاهای تکرقمی را تشخیص میدهد چون جمع mod 10 بههم میریزد.
اما Luhn جادو نیست. اگر دو رقم غیرمجاور عوض شوند، گاهی تصادفاً هنوز مضرب ۱۰ میماند — احتمال کم است ولی صفر نیست. اگر کل شماره را اشتباه از یک منبع جعلی کپی کرده باشید ولی ساختار Luhn درست باشد، ابزار «معتبر» میگوید در حالی که کارت اصلاً صادر نشده. بنابراین Luhn لایهٔ اول است، نه آخر.
- فاصله و خط تیره: در فرمهای پرداخت معمولاً بیاثرند؛ ابزار قبل از Luhn آنها را حذف میکند.
- ارقام فارسی ۰–۹: باید به لاتین تبدیل شوند؛ اگر تبدیل نشود، طول یا رقم اشتباه خوانده میشود.
- کارت ۱۶ رقمی نبودن: برخی محصولات جهانی ۱۵ یا ۱۹ رقم دارند؛ این ابزار برای الگوی ۱۶ رقمی شتاب طراحی شده است.
BIN و Luhn: دو پرسش جدا
شش رقم اول شماره کارت، BIN (Bank Identification Number) یا در ادبیات جدیدتر IIN نامیده میشود. این بازه به صادرکننده اشاره میکند: کدام بانک یا موسسه کارت را چاپ کرده، گاهی نوع کارت (Debit/Credit) را هم در سطح شبکه hint میدهد. جدول BIN در FinAI از دادهٔ ثابت داخل پروژه تغذیه میشود؛ مثل دفترچهٔ مرجع، نه استعلام زنده از core banking.
سناریوی رایج: Luhn «قبول» و BIN «بانک X». یعنی ساختار ریاضی درست است و شش رقم اول با آن بانک در جدول ما همخوان است. هنوز نمیدانید کارت فعال است، مسدود نیست، یا به نام گیرندهٔ واریز میخورد. سناریوی دیگر: Luhn «قبول» ولی BIN «شناخته نشد». ممکن است BIN تازه صادر شده و هنوز در جدول بهروز نشده، یا کارت از موسسهای خارج از پوشش جدول است. سناریوی سوم: Luhn «رد» — در این حالت حتی اگر BIN شبیه بانک معتبر باشد، اول باید رقمها را اصلاح کنید؛ ابزار تشخیص بانک از BIN در این حالت فقط کمک ثانویه است.
برای فقط دیدن نام بانک بدون اجرای کامل Luhn روی ۱۶ رقم، میتوانید از همان ابزار lookup با شش رقم اول استفاده کنید. برای مسیر «آیا قبل از درگاه حداقل تایپی درست است؟»، اعتبارسنجی کارت مناسبتر است چون هر دو لایه را یکجا نشان میدهد.
چرا Luhn به معنی مالکیت کارت نیست
مالکیت کارت یعنی: این ۱۶ رقم به حساب فلان شخص در بانک Y متصل است، کارت منقضی نشده، و بانک اجازهٔ برداشت داده. هیچکدام از اینها در Luhn نیست. استعلام مالکیت فقط از مسیرهای رسمی — OTP بانک، درگاه با 3DS، یا سامانههایی که خود بانک در اختیار پذیرنده گذاشته — ممکن است و حتی آنها هم برای حریم خصوصی محدودیت دارند.
برای واریز پول، طرف مقابل اغلب «شماره کارت» میدهد نه «نام صاحب حساب». اگر Luhn درست باشد، هنوز ممکن است به حساب شخص ثالث واریز کنید. FinAI عمداً نام صاحب کارت را برنمیگرداند؛ ابزار آموزشی-عملی برای چک ساختار است، نه KYC. اگر میخواهید مطمئن شوید پول به حساب درست میرود، باید از شبا و نام گیرنده در درگاه interbank یا تایید دو مرحلهای بانک استفاده کنید — موضوعی که در اعتبارسنجی شبا از زاویهٔ دیگری باز میشود.
محاسبه در مرورگر؛ شماره کارت را به سرور نفرستید
سیاست FinAI برای خانوادهٔ ابزارهای بانکی این است: رقمهای کارت در JavaScript سمت کاربر پردازش میشوند و در درخواست HTTP به سرور FinAI ارسال نمیشوند. دلیلش امنیتی و حقوقی است: شماره کامل کارت دادهٔ حساس پرداخت (PCI scope) محسوب میشود؛ لاگ کردن یا نگهداشتن آن روی سرور مقایسهای بدون مجوز، ریسک نشت و سوءاستفاده را بالا میبرد.
اگر سایتی از شما خواست «برای اعتبارسنجی رایگان» شماره کارت کامل را در فرم سرور وارد کنید، مشکوک است — همان کاری را که Luhn محلی انجام میدهد میتواند بدون خروج داده از دستگاه انجام شود. استثناء: خود درگاه پرداخت بانکی که برای تراکنش واقعی به شبکه وصل است؛ آنجا ارسال کارت بخش قرارداد پذیرندگی است، نه یک ماشینحساب عمومی.
چه چیزهایی را در چت و ایمیل نفرستید
CVV2، رمز دوم پویا، و تاریخ انقضا را هرگز برای «چک Luhn» لازم ندارید. اگر کسی ادعا کرد با فقط ۱۶ رقم میتواند موجودی را دید، کلاهبرداری است. حداکثر کاری که Luhn عمومی میکند همان checksum است. برای تبدیل کارت به شبا هم الگوریتم واحد nationwide وجود ندارد؛ ابزار کارت به شبا در FinAI صریح میگوید وقتی الگوریتم بانک در ریپو نیست، خروجی قطعی نیست و باید از اپ رسمی بانک کمک بگیرید.
کاربرد عملی برای پذیرنده، حسابدار، و کاربر خانگی
پذیرندهٔ آنلاین: قبل از redirect به درگاه، Luhn سمت کلاینت خطای تایپ را کم میکند؛ نرخ تراکنش ناموفض «invalid card number» پایین میآید. این جایگزین تایید هویت نیست.
حسابدار یا منابع انسانی: وقتی لیست شماره کارت کارمندان برای واریز حقوق میگیرد، یک pass سریع Luhn از اشتباهات دادهورود جلوگیری میکند. باز هم تطبیق با شبا پروندهٔ پرسنلی جداگانه میخواهد.
کاربر: اگر کارت فیزیکی فرسوده و رقمها محو شده، Luhn روی حدسهایتان قبل از تماس با بانک وقت میگذارد. اگر همهٔ حدسها رد شد، احتمال خطای دید یا کارت جایگزین با شمارهٔ جدید مطرح است.
Luhn در برابر اعتبارسنجی شبا
شبا (IBAN ایران) با باقیماندهٔ ۹۷ mod 97 چک میشود، نه Luhn. یک فرد ممکن است شبای درست و کارت درست داشته باشد که به یک حساب باشند؛ یا شبا را اشتباه تایپ کند ولی کارت را درست. ابزارهای FinAI را جدا نگه دارید: کارت → Luhn + BIN؛ شبا → IBAN + کد سهرقمی بانک در BBAN. برای نگاشت بین دو دنیا، کارت به شبا فقط تا جایی که دادهٔ عمومی اجازه میدهد پیش میرود.
سوءبرداشتهای رایج در شبکههای اجتماعی
گاهی ویدیوهایی میبینید که میگویند «با این سایت بفهمید کارت پلیسی است یا نه» و شماره کامل میخواهند. Luhn و BIN نمیتوانند چنین چیزی بگویند. گاهی ادعا میشود «رد Luhn یعنی کارت سرقتی» — خیر؛ یعنی رقم اشتباه است یا شماره ساختگی. آگاهی از محدودیت ابزار، استفادهٔ امنتر از خود ابزار مهمتر است.
جمعبندی کاربردی بدون اغراق
اعتبارسنجی Luhn در FinAI یک فیلتر سریع روی ۱۶ رقم است: خطای تایپ را زودتر میگیرد، با BIN نام احتمالی بانک را نشان میدهد، در مرورگر اجرا میشود، و مالکیت یا موجودی را اثبات نمیکند. برای پرداخت واقعی هنوز درگاه بانک مرجع است؛ برای واریز مطمئن، شبا و تایید گیرنده؛ برای شناخت صادرکننده بدون کل کارت، lookup BIN کافی است. اگر ساختار رد شد، قبل از هر اقدام مالی رقمها را با منبع معتبر — کارت فیزیکی، اپ بانک، یا SMS رسمی — دوباره بخوانید.