اعتبارسنجی شبا
طول، کشور IR و باقیماندهٔ ۹۷؛ نام صاحب حساب نیست.
مالک حساب برنمیگردد؛ فقط ساختار و رقم کنترل IBAN.
شبا باید ۲۴ رقم بعد از IR باشد.
مرتبط
شماره شبا (Sheba) در ایران همان IBAN با پیشوند IR است: بیست و شش نویسه که در انتقالهای بینبانکی، حقوق و دستمزد، و واریزهای P2P جای شماره حساب قدیمی را گرفته. وقتی در فرم واریز شبا را paste میکنید و سیستم میگوید «فرمت نامعتبر»، اغلب مشکل از فاصلهٔ پنهان، حذف IR، یا جابهجایی دو رقم در کپی از اپ بانک است — نه لزوماً از بسته بودن حساب. ابزار اعتبارسنجی شبا در FinAI طول، ساختار IR+۲۴ رقم، و checksum استاندارد IBAN (mod 97) را در مرورگر شما بررسی میکند؛ سپس در صورت معتبر بودن، کد سهرقمی بانک داخل BBAN را با جدول داخلی تطبیق میدهد. این صفحه از زاویهٔ فنی و حقوقی توضیح میدهد mod 97 چگونه کار میکند، کد بانک در کدام خانههای شبا نشسته، چرا paste از پیامرسان خطا میسازد، و چرا حتی شبای «درست» هم نام صاحب حساب را لو نمیدهد.
آنatomy شبا در استاندارد IBAN
IBAN بینالمللی دو بخش دارد: کد کشور دو حرفی و رقمهای کنترل (برای ایران IR + دو رقم)، و BBAN که در هر کشور فرمت ثابت خودش را دارد. برای ایران، پس از IR و دو رقم کنترل، بیست و دو رقم دیگر میآید که در عمل «بدنهٔ» شبای داخلی است: سه رقم کد بانک + شماره حساب پُر شده با صفر از چپ تا طول ثابت. کل رشتهٔ قابل نمایش بیست و شش کاراکتر است؛ گاهی با فاصله هر چهار رقم برای خوانایی چاپ میشود، ولی در محاسبه فاصله معنا ندارد.
FinAI ورودی را نرمال میکند: حروف کوچک به بزرگ، IR اختیاری (اگر نباشد فرض میشود منظور همان ایران است)، ارقام فارسی به لاتین، و فاصله حذف. اگر بعد از پاکسازی دقیقاً ۲۴ رقم نداشته باشید، ابزار بهجای حدس زدن، ورودی را نامعتبر اعلام میکند — چون IBAN ایران بدون طول کامل قابل اعتماد نیست.
mod 97؛ قلب اعتبارسنجی IBAN
برخلاف Luhn روی کارت ۱۶ رقمی، IBAN از باقیماندهٔ تقسیم بر ۹۷ استفاده میکند. دلیلش این است که فضای رقم کنترل دو رقمی (۰۰ تا ۹۸) باید تقریباً یکتا checksum روی کل BBAN بسازد. الگوریتم مرسوم: چهار نویسهٔ اول (IR و دو رقم کنترل) به انتهای رشته منتقل میشوند؛ حروف با جدول A=10, B=11, …, Z=35 به عدد تبدیل میگردند؛ سپس عدد بزرگ بهصورت قطعهقطعه mod 97 محاسبه میشود تا overflow حافظه رخ ندهد. اگر باقیمانده نهایی برابر ۱ باشد، IBAN از نظر checksum پذیرفته میشود.
در پیادهسازی FinAI برای IR، پس از استخراج ۲۴ رقم، دنبالهٔ عددی مطابق استاندارد ساخته و در حلقهٔ «ضرب در ۱۰، جمع رقم، mod 97» پردازش میشود. این همان منطقی است که بانکهای عضو SWIFT برای انتقال cross-border هم به کار میبرند، با این تفاوت که BBAN ایران ساختار خاص خود را دارد. پذیرش mod 97 یعنی: «اگر این شبا در شبکه ثبت شده باشد، حداقل با قواعد چاپ و صدور همخوان است» — هنوز نمیگوید حساب فعال است یا نام فلان شخص روی آن است.
تفاوت ذهنی با Luhn کارت
کاربران گاهی میپرسند چرا کارت Luhn دارد و شبا mod 97. پاسخ در سطح استاندارد است: ISO 13616 برای IBAN طراحی شده و ISO/IEC 7812 برای PAN کارت. در FinAI اعتبارسنجی کارت مسیر جداست؛ confounding این دو باعث میشود کسی شبای نامعتبر را با منطق کارت «درست» کند یا برعکس. برای هر ابزار ورودی و قاعدهٔ خودش را نگه دارید.
کد بانک داخل شبا؛ کجا نگاه کنیم
در BBAN ایران، سه رقم بعد از دو رقم کنترل IBAN (یعنی خانههای سوم تا پنجم در بلوک ۲۴ رقمی بدون IR) معمولاً کد بانک در جدول مرکزی است. مثلاً وقتی در جدول FinAI یا جدول کدهای بانک کد ۰۱۸ را میبینید، شباهای معتبری که آن سه رقم را در موقعیت استاندارد دارند به همان موسسه نسبت داده میشوند — به شرطی که checksum کل IBAN درست باشد.
اگر checksum غلط باشد، ابزار ممکن است هنوز «حدس» بانک از روی سه رقم نشان دهد ولی پرچم «شبا نامعتبر» بزند. این رفتار عمدی است: گاهی کاربر فقط یک رقم در حساب اشتباه زده و میخواهد بداند کدام بانک مدنظر بوده؛ ولی تا checksum درست نشود، برای واریز استفاده نکنید. بانک مقصد تراکنش را reject میکند یا به حساب اشتباه میفرستد — هر دو گران تمام میشوند.
خطاهای paste از اپ و پیامرسان
اپلیکیشنهای بانکی ایران اغلب شبا را با IR و فاصلهٔ گروهی copy میکنند. واتساپ یا تلگرام گاهی direction mark یا zero-width space به ابتدا/انتهای رشته میچسباند. بعضی کاربران IR را حذف میکنند چون فرم فقط ۲۴ رقم میخواهد؛ بعضی «I» لاتین را با «۱» یکی میگیرند. هر کدام mod 97 را میشکند.
- کل رشته را در notepad ساده paste کنید و کاراکترهای عجیب را ببینید.
- مطمئن شوید I و R لاتین هستند، نه یونیکد مشابه.
- ارقام فارسی را به انگلیسی تبدیل کنید یا در ابزار FinAI بگذارید که خودش نرمال کند.
- اگر فرم فقط ۲۴ رقم میگیرد، دو رقم کنترل IBAN را از منبع رسمی دوباره بگیرید؛ حدس زدن رقم کنترل تقریباً همیشه شکست میخورد.
یک اشتباه رایج: کپی «شماره حساب» قدیمی بهجای شبا. طولها فرق میکند و mod 97 معنا پیدا نمیکند. اگر مطمئن نیستید، از منوی «اشتراک شبا» در اپ بانک export بگیرید، نه از SMS قدیمی.
این ابزار مالک حساب را برنمیگرداند
استعلام «شبا به نام چه کسی است» سرویس عمومی نیست؛ بانک فقط در سناریوهای controlled (مثلاً انتقال با تایید نام گیرنده در برخی درگاهها) آن را نشان میدهد. FinAI عمداً از ادعای ownership پرهیز میکند: خروجی «معتبر/نامعتبر»، «کد بانک»، و «نام بانک از جدول» است. حتی اگر شبا mod 97 را پاس کند، ممکن است حساب بسته شده باشد یا مشترک قدیمی باشد — شبکه در لحظهٔ transfer آن را میفهمد، نه checksum offline.
برای HR که حقوق میفرستد، checksum لایهٔ اول جلوگیری از typo است؛ لایهٔ دوم تطبیق نام با لیست پرسنل یا دریافت تاییدیه از کارمند. برای فریلنسری که از کارفرما شبا گرفته، یک screenshot از اپ کارفرما + mod 97 کافی نیست؛ باید مبلغ آزمایشی یا قرارداد باشد.
ادغام بانکها و شباهای قدیمی
پس از ادغام چند بانک در دههٔ گذشته، ممکن است کارت یا کد شعبهٔ قدیمی با برند جدید فرق کند، ولی شباهای صادرشده قبل از ادغام گاهی همچنان valid میمانند تا مهاجرت حساب تمام شود. جدول نام بانک در FinAI بر اساس کد سهرقمی بهروز است، نه لزوماً برند روی کارت قدیمی شما. اگر تشخیص بانک از BIN نام دیگری داد، تناقض لزوماً به معنی شبای جعلی نیست — دو سیستم شناسه (PAN vs IBAN) تاریخچهٔ متفاوت دارند.
حریم خصوصی؛ شبا را هم مثل کارت نگه دارید
شبا کمتر از CVV حساس است، ولی هنوز شناسهٔ حساب است: با ترکیب سایر دادهها میتوان واریز ناخواسته یا فishing هدفمند ساخت. محاسبهٔ mod 97 در FinAI در مرورگر انجام میشود؛ لازم نیست برای «چک فرمت» شبا را به API ناشناس بفرستید. در چت عمومی کل شبا را public نکنید؛ اگر برای واریز لازم است، در کانال خصوصی و ترجیحاً یکبار مصرف بفرستید.
مسیرهای مرتبط در FinAI
اگر از روی کارت بانکی میخواهید بدانید واریز به کدام موسسه میرود، BIN کارت (اعتبارسنجی کارت) یک سرنخ است؛ ولی مسیر رسمی پول همان شبا است. ابزار کارت به شبا صریح میگوید تبدیل قطعی nationwide ندارد و برای IBAN باید به اپ بانک تکیه کنید. وقتی شبا را دارید، همین صفحه مرجع checksum است؛ وقتی فقط PAN دارید، از ابزار کارت شروع کنید ولی انتظار استخراج شبا نداشته باشید مگر بانک الگوریتم عمومی داده باشد.
سناریوهای آموزشی بدون شمارهٔ واقعی
حقوق اداری: فایل Excel شبا کارمندان را قبل از ساتنا جمع میکند. یک pass با ابزار mod 97 جلوی typoهای دستی را میگیرد. ردیفهای reject شده را با منبع HR دوباره میگیرند — نه با حدس تغییر رقم.
خرید کالا: فروشنده شبا میدهد؛ خریدار قبل از مبلغ بالا checksum را چک میکند. اگر invalid بود، تماس صوتی و خواندن رقمبهرقم از روی اپ بانک فروشنده انجام میشود.
تسویهٔ قرارداد: شبا در PDF قرارداد چاپ شده؛ OCR گاهی ۰ و O را قاطی میکند. mod 97 fail سریعترین alarm است.
چرا «معتبر» هنوز کافی نیست
شباهای test در مستندات بعضی vendors وجود دارد که mod 97 را پاس میکنند ولی در production شبکه ایران نیستند. FinAI فقط استاندارد ریاضی و جدول بانک داخلی را اعمال میکند. همچنین IBAN معتبر ممکن است به حساب ارزی یا سپردهٔ خاصی اشاره کند که برای transfer نوع شما مناسب نباشد — آن را core banking تعیین میکند.
در نهایت، اعتبارسنجی شبا در FinAI سه کار مشخص انجام میدهد: طول و IR را enforce میکند، mod 97 را محاسبه میکند، و در صورت امکان بانک را از سه رقم BBAN نام میبرد. نام صاحب حساب، موجودی، و وضعیت freeze را نشان نمیدهد. برای آنها درگاه رسمی بانک و قرارداد با مشتری لازم است. checksum را اینجا بگیرید؛ اعتماد نهایی را با فرآیند کسبوکار خودتان بسازید.
چرا دو رقم کنترل IBAN را نباید دستی حدس زد
گاهی فکر میشود اگر twenty و دو رقم حساب را داریم، میتوان با «جمع کردن» یا «گذاشتن ۰۱» دو رقم اول را درآورد. در IBAN این دو رقم از mod 97 روی کل BBAN مشتق میشوند؛ تغییر یک رقم در حساب معمولاً هر دو رقم کنترل را عوض میکند. اگر فقط body را از مشتری گرفتهاید و IR و check digits ندارید، از او بخواهید دوباره از اپ copy کند — reconstruct دستی تقریباً همیشه وقت تلف کردن است.
در آموزش حسابداری، شبا را مثل شماره ملی حساب در نظر بگیرید: checksum جلوی غلطهای تصادفی را میگیرد، نه جلوی جعل عمدی. برای جعل، سامانهٔ بانک و KYC مرجع است.
انتقال داخلی و شباهای بینالمللی
IR در ابتدای رشته به سیستم میگوید BBAN ایران است. برای wire خارجی، همان IBAN با SWIFT BIC بانک مقصد استفاده میشود؛ mod 97 جهانی است. FinAI روی use case داخلی (پایا، ساتنا، انتقال card-to-sheba در اپ) تمرکز دارد، ولی math همان است. اگر شبا mod 97 را پاس کند ولی بانک گیرنده در جدول ما نباشد، ممکن است کد موسسهٔ کوچک یا تازه باشد — دوباره جدول کد یا تماس با بانک.
همترازی با card-to-sheba در workflow واریز
مسیر اشتباه: PAN را در ابزار تبدیل بزنید، شبای حدسی بگیرید، اینجا mod 97 بزنید، واریز کنید. مسیر درست: شبا را از گیرنده بگیرید، همین ابزار checksum، سپس درگاه با name match اگر موجود است. PAN فقط برای card rail. کارت به شبا وقتی sheba=null است دقیقاً همین workflow را پیشنهاد میکند.
برای تیمهای ops که CSV شبا از ERP import میکنند، یک ستون «validate_sheba_ok» با اسکript local (همان logic mod 97) قبل از upload به bank portal از chargeback جلوگیری میکند. FinAI UI همان logic را بدون نصب برای تکرکورد فراهم میکند.