ملی ای‌پی‌آی

چرا شماره حساب با خط تیره و بدون بانک به شبا تبدیل نمی‌شود؟

شماره حساب بدون بانک معنای یکتا ندارد؛ خط تیره و نقطه فقط شکل نمایش‌اند و باید پیش از تبدیل حذف شوند، و شماره کارت یا شماره مشتری نباید جای آن بنشیند.

شماره حساب بدون بانک، یک عدد بی‌صاحب است. همان رشته‌ای که در یک بانک به حساب جاری شما اشاره می‌کند، در بانک دیگر می‌تواند حساب شخص دیگری باشد، و شبا درست از همین‌جا ساخته می‌شود: بانک و حساب کنار هم.

پس اگر فرم شما فقط یک فیلد «شماره حساب» دارد، یا باید بانک را از جای دیگری بدانید یا باید آن را بپرسید. بقیهٔ این نوشته دربارهٔ چیزهایی است که در عمل سر راه این تبدیل سبز می‌شود: خط تیره و نقطه، شماره‌هایی که حساب نیستند ولی شبیه حسابند، و ورودی‌هایی که باید پیش از ارسال دور بریزید. اگر فقط خودِ سرویس را می‌خواهید، تبدیل حساب به شبا را ببینید؛ اینجا سراغ ریزه‌کاری‌ها می‌رویم.

شماره حساب با خط تیره، نقطه و اسلش

بانک‌ها شماره حساب را همیشه یک‌دست چاپ نمی‌کنند. کاربر در دفترچه یا برگهٔ ثبت‌شده‌اش ممکن است عددی ببیند که با خط تیره به چند تکه شکسته شده، و آن را عیناً کپی کند. بعضی‌ها نقطه یا اسلش هم می‌گذارند.

این جداکننده‌ها بخشی از هویت حساب نیستند، فقط شکل نمایش‌اند. در ورودی ما، فقط ارقام و همین سه جداکننده (- و / و .) پذیرفته می‌شود و پیش از ارسال به مرجع، هر چه رقم نیست حذف می‌شود. یعنی این سه ورودی یک حساب را نشان می‌دهند:

  • ۱۲۳-۴۵۶-۷۸۹۰
  • 123.456.7890
  • 1234567890

(این ارقام فقط نمونه‌اند، شماره حساب واقعی نیستند.) پس لازم نیست در فرم خودتان جداکننده‌ها را سختگیرانه رد کنید. بهتر است بگذارید کاربر همان‌طور که دیده بنویسد و شما در سمت خودتان یک بار تمیزش کنید. ارقام فارسی را هم پیش از هر چیز به لاتین ببرید، تا اگر ورودی را در پایگاه داده ذخیره می‌کنید، دو شکل از یک حساب نداشته باشید.

سه عددی که حساب نیستند ولی اشتباه گرفته می‌شوند

کاربر هنگام پر کردن فرم بین چند عددی که بانک به او داده سرگردان است. سه عدد بیشتر از بقیه جای شماره حساب می‌نشینند:

  1. شماره کارت. شانزده رقم روی کارت. این شماره حساب نیست و تبدیلش به شبا مسیر جداگانه‌ای دارد: تبدیل کارت به شبا.
  2. شماره مشتری. عددی که بانک به شما به‌عنوان مشتری می‌دهد، نه به حسابتان.
  3. شماره شبا. گاهی کاربر همین را در فیلد حساب می‌چسباند.

نکتهٔ مهم: هیچ‌کدام از این سه خودبه‌خود خطا نمی‌دهند. شماره مشتری یک رشتهٔ عددی معمولی است و از نظر شکل با یک شماره حساب فرقی ندارد. نتیجه ممکن است «حساب پیدا نشد» باشد، و بدتر، در حالتی نادر ممکن است همان عدد در آن بانک به حساب دیگری برسد. به همین دلیل پیش از ارسال، دو بررسی ارزان انجام بدهید: اگر ورودی شانزده رقم است و الگوریتم کنترلی کارت را پاس می‌کند، به احتمال زیاد شماره کارت است؛ اگر با IR شروع می‌شود، شبا است. در هر دو حالت به کاربر بگویید «این شماره کارت است، شماره حساب را وارد کنید»، به‌جای اینکه یک استعلام بی‌نتیجه بفرستید.

بانک را از کجا بیاوریم

ورودی دوم بانک است، و این جایی است که تجربهٔ کاربری معمولاً خراب می‌شود. دو راه دارید:

  • انتخاب‌گر بانک در فرم. ساده است ولی کاربر باید بداند حسابش کجاست و فهرست طولانی را بگردد.
  • استنتاج از جای دیگر. اگر کاربر پیش‌تر کارت همان حساب را داده، بانک از شش رقم اول کارت درمی‌آید (نگاه کنید به تشخیص بانک از روی شماره کارت).

مقدار بانک در ورودی ما یا شناسهٔ لاتین بانک است (مثل mellat) یا کد سه‌رقمی بانک در شبا. فهرست مقدارهای معتبر را در مستندات ببینید و در انتخاب‌گر خودتان همان‌ها را به‌کار ببرید، نه نام فارسی تایپ‌شده را.

مثال یک فراخوان:

bash curl -X POST 'https://…/api/v1/account-to-iban/' \ -H 'Authorization: Bearer $MELLIAPI_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"bankAccount": "123-456-7890", "bank": "mellat"}'

آدرس و کلید را از پنل خودتان بردارید؛ اینجا فقط شکل ورودی مهم است.

چرا نمی‌شود شبا را خودتان از حساب ساخت

وسوسه‌انگیز است: شبا یک ساختار شناخته‌شده دارد، بخشی از آن کد بانک است، بخشی شماره حساب، و رقم کنترلی از روی بقیه محاسبه می‌شود. پس چرا برای هر حساب یک استعلام بفرستیم؟

چون ساختن رشته با محاسبه، فقط شکل را می‌سازد. نحوهٔ جا دادن شماره حساب در بخش حساب شبا بین بانک‌ها یکسان نیست، همان ناهمگونی قالبی که در بالا دیدید. اگر قاعدهٔ یک بانک را اشتباه حدس بزنید، رقم کنترلی را هم با همان داده‌ٔ اشتباه محاسبه می‌کنید و رشته‌ای می‌سازید که از همهٔ بررسی‌های ساختاری رد می‌شود ولی به حساب اشتباه (یا هیچ حسابی) اشاره می‌کند. بررسی ساختاری شبا فقط می‌گوید رشته خودش سازگار است (اعتبارسنجی ساختار شبا)، نه اینکه حسابی پشتش هست.

به نظر من قاعدهٔ درست این است: ساخت را به مرجع بسپارید، اعتبارسنجی نتیجه را خودتان انجام بدهید. دوم رایگان و فوری است، اولی را نباید تقلید کرد.

آنچه این تبدیل نمی‌کند

این سرویس شبا برمی‌گرداند و نه چیز دیگر. نام صاحب حساب در پاسخ نیست، پس نمی‌دانید شبا به نام چه کسی است. موجودی را هم نمی‌دهد و تضمین نمی‌کند واریز به آن حساب بنشیند. حساب بسته یا غیرفعال، نتیجهٔ مشخصی دارد که با «حساب پیدا نشد» فرق می‌کند؛ این دو را در رابط کاربری یکی نکنید.

اگر پیش از واریز نیاز دارید مطمئن شوید حساب به نام همان آدم است، بعد از تبدیل، مرحلهٔ جداگانهٔ تطابق نام لازم دارید (تطبیق شبا با نام).

یک سناریوی فرضی: فرم ثبت حساب فروشنده

تصور کنید فرم ثبت حساب یک مارکت‌پلیس را طراحی می‌کنید. فروشنده‌ای شماره حسابش را از پیامک بانک کپی می‌کند، یک فاصله در انتها هم چسبیده، و بانک را از فهرست انتخاب می‌کند. چه اتفاقی باید بیفتد؟

  1. فرم ورودی را تمیز می‌کند: ارقام لاتین، حذف فاصله و جداکننده.
  2. اگر نتیجه با IR شروع می‌شود، پیام می‌دهد «این شبا است، نیازی به تبدیل نیست» و همان را به‌عنوان شبا می‌پذیرد، بعد از بررسی ساختاری.
  3. اگر شانزده رقم است و الگوریتم کارت را پاس می‌کند، می‌پرسد «این شماره کارت است؛ شماره حساب را وارد کنید؟» (یا مسیر تبدیل کارت به شبا را پیشنهاد می‌دهد).
  4. در غیر این صورت، سرویس تبدیل حساب به شبا را فرا می‌خوانَد و نتیجه را با شبای برگشتی نشان می‌دهد تا فروشنده تأیید کند.

نکتهٔ آخر مهم است: شبای به‌دست‌آمده را به کاربر نشان بدهید. او اگر حسابش را بشناسد، چهار رقم آخر یا نام بانک را می‌بیند و اگر چیزی عجیب باشد، همان‌جا می‌فهمد. تبدیل بی‌صدا در پشت صحنه این فرصت را از بین می‌برد.

وقتی کاربر بانک را نمی‌داند

کاربر همیشه نمی‌داند «بانک حسابش» چیست، به‌خصوص اگر حساب را سال‌ها پیش، در شعبهٔ یک مؤسسه باز کرده یا حساب شرکتی است. چند توصیه:

  • دو انتخاب‌گر ندهید (بانک، سپس شعبه). فقط بانک لازم است.
  • اگر کاربر هر دو، کارت و حساب را دارد، از کارت بانک را بخوانید و انتخاب‌گر را از پیش پر کنید.
  • اگر هیچ راهی ندارد، گزینهٔ «بانک را نمی‌دانم» را نگذارید که به یک فراخوان بی‌پشتوانه برسد. به او بگویید دفترچه یا برنامهٔ بانکش را ببیند.

آنچه در عمل هنگام خطا پیش می‌آید

پاسخ‌های منفی در این سرویس به دو دسته‌اند. «حساب پیدا نشد» که معمولاً یعنی ورودی غلط است، و «حساب فعال نیست» که یعنی ورودی درست است ولی حساب بسته شده. دسته‌ٔ اول را با «شماره حساب و بانک را بررسی کنید» جواب بدهید، دسته‌ٔ دوم را با «حساب دیگری وارد کنید». این دو را یکی نکنید؛ کاربری که حسابش بسته شده، با ده بار تایپ مجدد به جایی نمی‌رسد.

در یک نگاه

  • ورودی را یک بار تمیز کنید: ارقام لاتین، حذف جداکننده، حذف فاصله.
  • پیش از ارسال، شماره کارت و شبای چسبانده‌شده در فیلد حساب را تشخیص بدهید و به کاربر بگویید.
  • بانک را با مقدار استاندارد بفرستید، نه با متن آزاد.
  • شبای برگشتی را با الگوریتم کنترلی خودتان دوباره بسنجید، بعد ذخیره کنید.
  • کاربر را مجبور نکنید حساب را دوباره تایپ کند؛ نتیجه را نگه دارید.
آخرین بازبینی: تیم تحریریه ملی ای‌پی‌آی

وب‌سرویس مرتبط با این راهنما

API تبدیل حساب به شبا

شبای متناظر با یک شماره حساب بانکی.

مشاهده مشخصات فنی و تعرفه

راهنماهای مرتبط

پرسش و تجربه کاربران

اگر این راهنما جوابتان را نداد، همین‌جا بپرسید. پرسش‌ها را تیمملی ای‌پی‌آی پاسخ می‌دهد و هر نظر پیش از انتشار بررسی می‌شود.

هنوز پرسشی ثبت نشده، اولین نفر باشید.