تشخیص بانک از شبا
کد سه رقمی داخل شبا را با جدول بانکهای ایران میخواند.
۲۴ رقم شبا لازم است.
مرتبط
گاهی کل شبا را ندارید که mod 97 بزنید، یا میخواهید قبل از paste در فرم واریز فقط ببینید «این رشته قرار است به کدام موسسه برود». سه رقم بعد از دو رقم کنترل IBAN — در بدنهٔ بیستوچهار رقمی بدون IR — همان کد بانک در جدول نظارتی است که FinAI در جدول کدهای بانک نگه میدارد. ابزار تشخیص بانک از شبا همین slice را میخواند و نام فارسی بانک را برمیگرداند. این کار را در مرورگر انجام میدهد؛ شبا برای lookup به سرور ارسال نمیشود. این صفحه از زاویهٔ تفکیک نقشها توضیح میدهد چرا این ابزار با اعتبارسنجی شبا و تشخیص بانک از BIN فرق دارد، و چه زمانی هر سه را پشت سر هم بزنید.
شمارهگذاری رقمها؛ خانهٔ سوم تا پنجم BBAN
برای وضوح، بدنه را بدون IR تصور کنید: دو رقم اول check digit، سپس بیست و دو رقم BBAN. در آرایهٔ صفر-based همان body، اندیس ۲ تا ۴ (سه رقم) کد بانک است. در زبان روزمره میگویند «رقمهای سوم تا پنجم بعد از IR» اگر IR و check را شمارش کنید: IR + dd + bbb + account. FinAI در validate و bank-from هر دو از digits.slice(2,5) روی body استفاده میکند تا یک منبع truth باشد.
اگر کاربر فقط «بیست و دو رقم انتهایی» را paste کند بدون دو رقم کنترل، slice جابهجا میشود و نام بانک غلط میآید. ابزار bank-from-sheba انتظار دارد ورودی شبیه شبای واقعی باشد؛ برای checksum کامل validate مسیر جدا است.
چه چیزی برمیگردد و چه چیزی نه
خروجی: کد سهرقمی و نام بانک از جدول ثابت. خروجی نیست: معتبر بودن IBAN، نام صاحب حساب، فعال بودن حساب، نوع سپرده. حتی اگر سه رقم با بانک X match کند، mod 97 ممکن است fail باشد — در validate آن را «نامعتبر» میبینید ولی ممکن است برای debug همان سه رقم نشان داده شود تا بفهمید typo در کدام بخش بوده.
برای compliance phishing: مهاجم گاهی شبای با checksum غلط ولی کد بانک معتبر میدهد تا قربانی فکر کند «بانک ملی» است. bank-from فقط label میدهد؛ validate جلوی واریز اشتباه را میگیرد. هر دو را در workflow آموزش دهید.
مقایسه با validate-sheba
validate-sheba سه لایه دارد: طول، mod 97، و در صورت valid نام بانک. bank-from-sheba روی شناسایی موسسه تمرکز میکند حتی وقتی کاربر هنوز مطمئن نیست کل رشته درست تایپ شده. use case: preview در UI قبل از submit؛ آموزش کارمند؛ یا parse کردن draft CSV که ستون checksum جدا ندارد.
- فقط میخواهید بدانید واریز به کدام برند میرود: bank-from کافی است اگر body کامل است.
- قبل از پایا: validate اجباری است.
- شبا ناقص: هیچکدام قطعی نیست؛ از منبع کامل بگیرید.
مقایسه با card-bank-lookup
BIN شش رقم اول PAN است؛ کد شبا سه رقم داخل BBAN. هر دو در FinAI از family یکسان بانکها تغذیه میشوند ولی کلید متفاوت است. سناریوی reconciliation: مشتری کارت ۶۱۰۴۳۳ داده و شبا با کد ۰۵۷ — lookup میگوید ملت، bank-from میگوید پاسارگاد. این تناقض هشدار است، نه bug lookup. source of truth برای interbank transfer شبا است؛ BIN برای POS و chargeback story.
اگر فقط PAN دارید، اعتبارسنجی کارت Luhn را هم چک میکند؛ bank-from روی شبا کار میکند نه کارت. کارت به شبا تبدیل قطعی نمیدهد؛ برای family check از BIN + bank-from روی شبای دریافتی استفاده کنید.
جدول ثابت؛ بهروزرسانی و «نامشخص»
کد بانک موسسهٔ ادغامشده ممکن است یکی باشد ولی برند روی کارت legacy دیگر. جدول FinAI نام فعلی را نشان میدهد. کد تازه تا release بعدی ممکن است در جدول نباشد — bank-from null یا «نامشخص» میدهد. صفحهٔ جدول برای مرور انسانی و BIN نمونه است، نه realtime API بانک مرکزی.
حریم خصوصی
شبا شناسهٔ حساب است. lookup در client-side یعنی برای دیدن نام بانک لازم نیست رشته را به FinAI POST کنید. عادت بد: paste کل شبا در توییت «این شبای فروشنده درسته؟». عادت خوب: فقط سه رقم میانی را برای سوال عمومی کافی نیست — بهتر است اصلاً شبای کامل public نشود؛ از validate local استفاده کنید.
گردش کار واریز P2P
- گیرنده شبا را فرستاد.
- bank-from: نام بانک با انتظار ذهنی شما یکی است؟
- validate-sheba: mod 97 OK؟
- درگاه بانک: name match اگر دارد.
- مبلغ آزمایشی برای قراردادهای جدید.
مرحلهٔ ۲ جلوی social engineering زودتر از mod 97 کمک میکند وقتی قربانی «بانک X» گفته ولی کد بانک Y است.
ادغام بانکها و شباهای قدیمی
شبای صادرشده قبل از ادغام ممکن است سالها valid بماند. کد داخل BBAN به موسسهٔ حقوقی فعلی map میشود. اگر فاکتور قدیمی نام «سامان» دارد ولی کد ۰۵۶ با جدول امروز «سامان» است، bank-from همان را میگوید — تاریخ برند روی کاغذ با شبا فرق دارد.
ورودیهای messy از پیامرسان
فاصله، IR کوچک، ارقام فارسی: FinAI نرمال میکند قبل از slice. zero-width space گاهی slice را خراب میکند اگر strip نشود — validate و bank-from هر دو strip میکنند. اگر IR حذف شده ولی ۲۴ رقم کامل است، slice درست است. اگر ۲۲ رقم فقط BBAN بدون check، ابزار گمراه میشود.
برای توسعهدهندگان فرم واریز
UX pattern: on blur شبا، bank-from نام را زیر فیلد نشان دهد؛ on submit validate. این split خطای کاربر را زودتر میفهمد. cache جدول bank codes در bundle همان iran-banks.ts است؛ نسخهٔ سایت با release sync باشد.
رابطه با generate-sheba
اگر از تولید شبا استفاده کردید، bank-from روی خروجی باید همان بانکی را بدهد که کد را در فرم زدید. اگر نداد، باگ در pad یا code است نه در جدول. cross-check سریع قبل از publish فایل حقوق.
رابطه با format
فرمت شبا فاصله اضافه میکند؛ bank-from قبل از slice فاصله را حذف میکند. ترتیب ابزار مهم نیست: format → bank-from یا برعکس برای نام بانک یکسان است.
سناریوی حسابرسی داخلی
تیم audit نمونهای از شباهای پرداختشده را میگیرد و فقط distribution کد بانک را میشمارد — بدون mod 97 — تا ببیند آیا پرداخت به موسسهٔ قرارداد شده رفته. این analytics سبک است؛ برای کنترل کامل validate لازم است. FinAI UI برای نمونهٔ کوچک مناسب است.
سوءبرداشت رایج
«نام بانک از شبا یعنی حساب ثبت شده.» خیر. «کد بانک با شماره شعبه یکی است.» خیر، سه رقم موسسه است نه شعبه. «میتوانم از شبا BIN بسازم.» خیر؛ BIN از PAN میآید. جدول کد هر دو را کنار هم lists میکند برای human cross-check.
آموزش کارمندان عملیات
در manual داخلی screenshot بگیرید: سه رقم بعد از دو رقم اول body با فلش مشخص شود. تمرین با شبای formatشده از format و validate روی همان رشته. تأکید کنید bank-from جای استعلام نام صاحب حساب نیست — بانک فقط در درگاه.
چرا API زنده بانک نمیزنیم
قرارداد، latency، و logging PAN/Sheba در سرور third-party. جدول static tradeoff آگاهانه برای ابزار عمومی آموزشی است. سازمانهای بزرگ میتوانند جدول را export و با SLA داخلی بهروز کنند.
جمعبندی
تشخیص بانک از شبا ذرهبین روی سه رقم میانی BBAN است: سریع، offline، و مکمل validate-sheba نه جایگزین آن. با BIN lookup برای family check و با جدول کد برای مطالعهٔ انسانی ترکیب شود. داده در مرورگر میماند؛ اعتماد به transfer با mod 97 و فرآیند بانکی شما کامل میشود.
عمق بیشتر برای مدیران محصول
اگر feature «پیشنهاد لوگوی بانک» میسازید، bank-from همان backend client-side است. fallback وقتی code unknown: لینک به جدول کد و validate. error copy صریح: «کد شناخته نشد؛ شبا را کامل چک کنید.»
در بازار ایران، آگاهی از کد بانک در BBAN به کاربر کمک میکند phishing با برند جعلی را زودتر تشخیص دهد — به شرطی که بداند label از جدول FinAI آمده و checksum هنوز باید در validate تأیید شود. این دو لایه را در آموزش سازمان جدا نگه دارید.
نقشهٔ ذهنی ابزارهای FinAI در یک نگاه
از کارت: validate-card، card-bank-lookup، card-to-sheba (بدون sheba قطعی). از حساب: generate-sheba. از شبا: format (نمایش)، bank-from (موسسه)، validate (ریاضی). مرجع: bank-codes. این نقشه در onboarding تیم finance IT مفید است تا ابزار اشتباه برای ticket انتخاب نشود.
هر بار که شبای جدیدی در قرارداد میبینید، سه سؤال بپرسید: checksum در validate چه میگوید؟ کد بانک با ذینفع قرارداد یکی است؟ با BIN کارت طرف اگر دارد همخوان است؟ bank-from فقط وسطی را جواب میدهد — دو سؤال دیگر را ابزارهای دیگر پوشش میدهند.
نمونهٔ آموزشی بدون شبای واقعی
در کارگاه آموزشی میتوانید ساختار را با ارقام ساختگی تمرین دهید: فرض کنید body بیستوچهار رقمی دارید که دو رقم اول check است و رقم سوم تا پنجم مثلاً ۰۱۷ میخواند — در جدول FinAI این کد به ملی ایران map میشود. اگر check غلط باشد، validate میگوید نامعتبر ولی bank-from هنوز «ملی» را نشان میدهد تا بدانید mismatch از checksum است نه از انتخاب بانک. چنین تمرینی به تازهکارها کمک میکند بین «نام بانک» و «شبای قابل واریز» فرق بگذارند.
تفاوت با استعلام شعبه
گاهی کاربر فکر میکند سه رقم کد بانک همان کد شعبهٔ چهار رقمی روی چک است. در IBAN ایران این دو مفهوم جداست: سه رقم، شناسهٔ موسسه در شبکهٔ بینبانکی است؛ شعبه در سامانهٔ داخلی بانک جای دیگری encode میشود. اگر روی چک قدیمی «شعبه ۱۲۳۴» میبینید، آن را در bank-from وارد نکنید — نتیجه بیمعناست.
پشتیبانی از ارقام فارسی و copy غیرلاتین
کیبورد فارسی در موبایل گاهی شبا را با ۰۱۲۳… مینویسد. FinAI قبل از slice، ارقام را یکسانسازی میکند؛ بنابراین bank-from با validate رفتار همراستا دارد. حرف I و R در IR باید لاتین باشند؛ اگر کاربر «آیآر» تایپ کند، ابزار ممکن است گمراه شود — در آموزش staff تأکید کنید از copy اپ استفاده شود نه تایپ دستی پیشوند.
چکلیست مدیرعامل برای قراردادهای بالا
قبل از امضای قرارداد خرید یا فروش با پیشپرداخت بزرگ، شبای طرف را در validate بزنید و نام بانk از bank-from را با نام حقوقی در قرارداد مقایسه کنید. اگر طرف «بانک تجارت» نوشته ولی کد ۰۵۷ میآید، توقف و استعلام. این دو دقیقه از client-side tools ارزانتر از یک واریز اشتباه است.