<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Hamidreza Mahmoodi</title>
        <link>https://virgool.io/feed/@hamid2028</link>
        <description>backend developer</description>
        <language>fa</language>
        <pubDate>2026-06-08 00:59:29</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/986345/avatar/Ge0oc0.jpeg?height=120&amp;width=120</url>
            <title>Hamidreza Mahmoodi</title>
            <link>https://virgool.io/@hamid2028</link>
        </image>

                    <item>
                <title>نحوه اتصال به درگاه بانک ملی (BMI) با استفاده از فریمورک جنگو</title>
                <link>https://virgool.io/@hamid2028/%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%AF%D8%B1%DA%AF%D8%A7%D9%87-%D8%A8%D8%A7%D9%86%DA%A9-%D9%85%D9%84%DB%8C-bmi-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%D8%AC%D9%86%DA%AF%D9%88-micozda6sxqi</link>
                <description>        همان طور که میدانید امروزه تمامی سایت های اینترنتی برای دریافت وجه از کاربر خود از یک درگاه پرداخت اینترنتی استفاده میکنند. درگاه پرداخت اینترنتی امکان پرداخت آنلاین وجوه مشتریان وبسایت‌های فروشگاهی عرضه‌کننده کالا و خدمات را فراهم می‌کند. مشتری پس از تکمیل مراحل انتخاب محصول یا خدمت مورد نظر، در مرحله آخر وارد درگاه پرداخت اینترنتی شده و با وارد کردن اطلاعات کارت بانکی خود شامل شماره کارت، رمز دوم، تاریخ انقضا و کد اعتبارسنجی (CVV2) پرداخت خود را به آسانی انجام می‌دهد.اینجاست که اهمیت داشتن یک درگاه پرداخت خوب برای وب سایت به خوبی احساس میشود. برای داشتن یک درگاه اینترنتی میتوانید از درگاه های مختلفی در وب سایت خود نظیر درگاه های بانک ملی، بانک ملت، درگاه پرداخت IDPAY، زیبال، زرین پال و ... استفاده کنید؛ اما سوال اینجاست که چگونه میتوان چنین سیستمی را در وبسایت خود پیاده سازی کرد.امروز قرار است در این مقاله صفر تا صد نحوه اتصال به درگاه بانک ملی را با استفاده از فریمورک قدرتمند جنگو پیاده سازی کنیم. پس با ما همراه باشید. ساخت یک وب سرویس بانک ملیقبل از انجام هر کاری نیاز به ساخت یک وب سرویس در خود وبسایت بانک ملی دارید. برای این منظور میتوانید به آدرس زیر مراجه کنید.درگاه پرداخت بانک ملی ایران(BMI)نصب پکیجخب حالا برای ادامه کار لازم است پکیج زیر را نصب کنید.pip install az-iranian-bank-gatewayssettings.pyبعد از نصب پکیج بالا تنظیمات زیر را در فایل settings.py پروژه خود انجام دهید.INSTALLED_APPS = [
   # ....
   &#039;azbankgateways&#039;,
   # ...
]

AZ_IRANIAN_BANK_GATEWAYS = {
   &#039;GATEWAYS&#039;: {
       &#039;BMI&#039;: {
           &#039;MERCHANT_CODE&#039;: &#039;&lt;YOUR MERCHANT CODE&gt;&#039;,
           &#039;TERMINAL_CODE&#039;: &#039;&lt;YOUR TERMINAL CODE&gt;&#039;,
           &#039;SECRET_KEY&#039;: &#039;&lt;YOUR SECRET CODE&gt;&#039;,
       },
   },
   &#039;DEFAULT&#039;: &#039;BMI&#039;,
   &#039;CURRENCY&#039;: &#039;IRR&#039;, # اختیاری
   &#039;TRACKING_CODE_QUERY_PARAM&#039;: &#039;tc&#039;, # اختیاری
   &#039;TRACKING_CODE_LENGTH&#039;: 16, # اختیاری
   &#039;SETTING_VALUE_READER_CLASS&#039;: &#039;azbankgateways.readers.DefaultReader&#039;, # اختیاری
   &#039;BANK_PRIORITIES&#039;: [
       &#039;BMI&#039;,
       # and so on ...
   ], # اختیاری
}GATEWAYS : تنظیمات مربوط به هر بانک به صورت دیکشنری های جدا در این قسمت وجود دارد. تنظیماتی مانند کلاس اجرا کننده، کلیدهای امنیتی که توسط بانک در اختیار شما قرار می گیرد.DEFAULT: در زمانی که به سازنده فکتوری پارامتری ارسال نشود از این تنظیم به عنوان بانک پیش فرض استفاده خواهد شد و ارتباطات با این بانک برقرار می شود.CURRENCY - (IRR, IRT): واحد پولی که نرم افزار با آن کار می کند. این واحد پولی فارغ از واحد پولی درگاه خواهد بود. در صورتی که واحد پولی نرم افزار با واحد پولی درگاه بانک متفاوت باشد تبدیل ریال به تومان یا بالعکس انجام خواهد شد.TRACKING_CODE_QUERY_PARAM : پارامتری که در هنگام بازگشت از درگاه به کال بک یو آر ال تعیین شده تنظیم و ارسال می گردد. به عنوان مثال زمانی که از کاربر از درگاه بانک باز می گردد چه پرداخت موفق داشته باشد و چه نا موفق کاربر به لینکی که در هنگام استفاده از درگاه تنظیم شده است٬ ارجاع داده می شود و در انتهای آن این رشته + کد پیگیری بازگردانده می شود تا بتوان داده ها را از این طریق بازیابی کرد.TRACKING_CODE_LENGTH: طول کد پیگیری تولید شده توسط سیستم است. دقت شود که در برخی درگاه ها مانند درگاه بانک ملی ایران، طول ۲۰ کاراکتر خطای شماره سفارش ارسال نشده است را می دهد.SETTING_VALUE_READER_CLASS: با مقدار دهی به این تنظیم شما می توانید حالت یک متغیر خوان اضافه کنید که قابلیت های دیگری مثل پروایدر و پشتیبانی از یک بانک با چند اکانت و ... را به آن اضافه کنید.BANK_PRIORITIES: این آرایه اختیاری است. زمانی که وضعیت اتصال به درگاه به صورت خودکار تعیین شده باشد، ابتدا به بانک پیش فرض متصل می شود و سپس بر این اساس شروع به اتصال خواهد کرد، تا به اولین درگاه فعال برسد. در حالت پیش فرض این آرایه خالی است که بعد از اتصال به درگاه مورد نظر در صورت خطا بقیه درگاه ها امتحان نخواهند شد.urls.pyبعد از settings.py نوبت به فایل urls.py میرسد. پس، تنظیمات زیر را به فایل urls.py پروژه خود اضافه کنید.from django.contrib import admin
from django.urls import path

from azbankgateways.urls import az_bank_gateways_urls

admin.autodiscover()

urlpatterns = [
    path(&#039;admin/&#039;, admin.site.urls),
    path(&#039;bankgateways/&#039;, az_bank_gateways_urls()),
]با اضافه کردن آدرس بالا به لیست یو آر ال ها، پرداخت ها پس از درگاه به این مسیر هدایت و اعتبار سنجی می شوند و سپس مجدد به سمت کال بکی که به ازای هر درخواست تنظیم می شود، مسیر یابی خواهد شد. migrateحالا نیاز است پروژه خود را با استفاده از دستور زیر migrate کنید.python manage.py migrateاگر از reverse proxy و https استفاده می کنید برای رفع موارد احتمالی حتما تنظیمات این [لینک](https://stackoverflow.com/questions/62047354/build-absolute-uri-with-https-behind-reverse-proxy/65934202#65934202) انجام دهید.views.pyبرای استفاده و اتصال به درگاه بانک کافی است یک &#x60;BankFactory&#x60; ایجاد کنیم و پارامترهای اجباری را تنظیم کنیم. سپس کاربر را می توانیم به درگاه بانک هدایت کنیم.در فایل view.py نیز ویو زیر را به ویوهای خود اضافه نمایید.from django.urls import reverse
from azbankgateways import bankfactories, models as bank_models, default_settings as settings



def go_to_gateway_view(request):
    # خواندن مبلغ از هر جایی که مد نظر است
    amount = 1000
    # تنظیم شماره موبایل کاربر از هر جایی که مد نظر است
    user_mobile_number = &#039;+989112221234&#039;  # اختیاری

    factory = bankfactories.BankFactory()
    bank = factory.create() # or factory.create(bank_models.BankType.BMI) or set identifier
    bank.set_request(request)
    bank.set_amount(amount)
    # یو آر ال بازگشت به نرم افزار برای ادامه فرآیند
    bank.set_client_callback_url(reverse(&#039;callback-gateway&#039;))
    bank.set_mobile_number(user_mobile_number)  # اختیاری

    # در صورت تمایل اتصال این رکورد به رکورد فاکتور یا هر چیزی که بعدا بتوانید ارتباط بین محصول یا خدمات را با این
    # پرداخت برقرار کنید. 
    bank_record = bank.ready()
    
    # هدایت کاربر به درگاه بانک
    return bank.redirect_gateway()در صورتیکه تمایل دارید به صورت خودکار به اولین درگاه در دسترس متصل شوید. ابتدا از قسمت تنظیمات در بخش &#x60;BANK_PRIORITIES &#x60; اولویت های بانک های مد نظر را وارید کنید. سپس به جای استفاده از متد &#x60;factory.create&#x60; از متد ‍&#x60;factory.auto_create&#x60; در این بخش استفاده کنید. به متد auto_create می توانید مبلغ مد نظر را نیز برای صحت سنجی از حداقل مبلغ نیز ارسال کنید.set_mobile_number متدی است که پارامتر شماره موبایل کاربری که قصد خرید دارد را به آن پاس میدهیم. این شماره موبایل جهت پرداخت و پیگیری آسان تر به درگاه ارسال می شودمیتوانید وجه موردنظر را از دیتابیس دریافت کرده و به amount پاس دهید و به درگاه پرداخت بفرستید:)بازگشت از بانکوضعیت رکورد بانک به شرح ذیل می باشد.WAITING: در انتظار برای انتقال کاربر به درگاه بانکREDIRECT_TO_BANK: کاربر به درگاه بانک منتقل شده است ولی هنوز از درگاه باز نگشته است.RETURN_FROM_BANK: کاربر از درگاه برگشته ولی عملیات صحت سنجی٬ یا تکمیل نشده است یا با خطا درهنگام تایید از سوی بانک مواجه شده است. در این شرایط می توان با فراخوانی مجدد در بازه زمانی کمتر از ۱۵ دقیقه که کاربر بازگشته است٬ عملیات تایید را مجدد درخواست کرد. شرح تایید مجدد در پایین تر آورده شده است.CANCEL_BY_USER: پرداخت توسط کاربر کنسل شده است.EXPIRE_GATEWAY_TOKEN: ارتباط با درگاه بانک برقرار شده ولی کاربر به درگاه هدایت نشده است.EXPIRE_VERIFY_PAYMENT: در بازه زمانی ۱۵ دقیقه پس از بازگشت٬ موفق به تایید اطلاعات پرداخت نشده ایم.COMPLETE: وضعیت پرداخت موفق است.برای این منظور ویو زیر را به ویوهای خود در views.py اضافه کنید.import logging

from django.http import HttpResponse, Http404
from django.urls import reverse

from azbankgateways import bankfactories, models as bank_models, default_settings as settings


def callback_gateway_view(request):
    tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None)
    if not tracking_code:
        logging.debug(&amp;quotاین لینک معتبر نیست.&amp;quot)
        raise Http404

    try:
        bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code)
    except bank_models.Bank.DoesNotExist:
        logging.debug(&amp;quotاین لینک معتبر نیست.&amp;quot)
        raise Http404

    # در این قسمت باید از طریق داده هایی که در بانک رکورد وجود دارد، رکورد متناظر یا هر اقدام مقتضی دیگر را انجام دهیم
    if bank_record.is_success:
        # پرداخت با موفقیت انجام پذیرفته است و بانک تایید کرده است.
        # می توانید کاربر را به صفحه نتیجه هدایت کنید یا نتیجه را نمایش دهید.
        return HttpResponse(&amp;quotپرداخت با موفقیت انجام شد.&amp;quot)

    # پرداخت موفق نبوده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت.
    return HttpResponse(&amp;quotپرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت.&amp;quot)درخواست تایید مجدد از بانکimport logging
from azbankgateways import bankfactories, models as bank_models, default_settings as settings

factory = bankfactories.BankFactory()

# غیر فعال کردن رکورد های قدیمی
bank_models.Bank.objects.update_expire_records()

# مشخص کردن رکوردهایی که باید تعیین وضعیت شوند
for item in bank_models.Bank.objects.filter_return_from_bank():
	bank = factory.create(bank_type=item.bank_type, identifier=item.bank_choose_identifier)
	bank.verify(item.tracking_code)		
	bank_record = bank_models.Bank.objects.get(tracking_code=item.tracking_code)
	if bank_record.is_success:
		logging.debug(&amp;quotThis record is verify now.&amp;quot, extra={&#039;pk&#039;: bank_record.pk})آدرس پروژهاینم از اتصال درگاه بانک ملی با فریمورک جنگو؛ امیدوارم براتون مفید بوده باشه و خوشتون بیاد. موفق باشید و همیشه بدرخشید..</description>
                <category>Hamidreza Mahmoodi</category>
                <author>Hamidreza Mahmoodi</author>
                <pubDate>Tue, 29 Jun 2021 15:37:42 +0430</pubDate>
            </item>
                    <item>
                <title>اعتبارسنجی کارت بانکی، شماره شبا و تبدیل شماره حساب به شماره شبا با فریمورک جنگو</title>
                <link>https://virgool.io/@hamid2028/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%B3%D9%86%D8%AC%DB%8C-%DA%A9%D8%A7%D8%B1%D8%AA-%D8%A8%D8%A7%D9%86%DA%A9%DB%8C-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D8%B4%D8%A8%D8%A7-%D9%88-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D8%AD%D8%B3%D8%A7%D8%A8-%D8%A8%D9%87-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%D8%B4%D8%A8%D8%A7-%D8%A8%D8%A7-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%D8%AC%D9%86%DA%AF%D9%88-w7x0i7ook7vi</link>
                <description>      شاید برای خیلی از توسع دهندگان وب و برنامه نویسان کسب کارهای الکترونیکی در زمینه وب اپلیکیشن های موبایل که از پرداخت آنلاین در سیستم خود استفاده می کنند، این سوال پیش بیاد که چطور متوجه شویم ،شماره کارت یا شماره شبایی که کاربران وارد می کنند معتبر است یا خیر. حتی زمانی که بخواهید از کاربران شماره شبا بگیرید، این امر ممکن است برای کاربران شما به منظور پیدا کردن شماره شبای خود سخت باشد(رفتن به بانک یا جستجو در وب سایت های بانکی و غیره). در حالی که تنها با داشتن یک شماره حساب از کاربران، میتوانید این اطلاعات را بدست آورده یا عملیات اعتبارسنجی را انجام دهید.      ما در این مقاله قرار است با استفاده از وب فریمورک قدرتمند جنگو به معرفی پکیجی بپردازیم که بتوانید این مسائل را به راحتی و درچند ثانیه رفع کنید، بدون اینکه برای حل این مسائل نیاز به ارجاع به سایت های مختلف و  مشکلات آن داشته باشید، که این اعتبارات را بسنجند یا شماره حساب را به شماره شبا تبدیل کنند. جلوتر با وارد کردن چند خط کد در بک اند خود خواهید توانست این مسائل را به راحتی هرچه تمام تر بررسی کنید.موارد استفاده:1.مورد استفاده در اپلیکیشن ها پرداخت انلاین برای اعتبارسنجی کارت بانکی کاربر مورد نظر.2.مورد استفاده در سایت های پرداخت انلاین برای اعتبارسنجی کارت بانکی کاربر مورد نظر.3.تبدیل شماره حساب کاربر به شماره شبا.4.مورد استفاده در سایت هایی با کاربری بین المللی برای اعتبارسنجی شماره شبا.و اما پکیجی که قرار است از آن استفاده کنیمaz-iranian-bank-introبرای شروع کار لازم است این پکیج رو با استفاده از دستور زیر نصب کنید.pip install az-iranian-bank-introنحوه استفادهاعتبار سنجی کارت های بانکیبرای اعتبار سنجی کارت های بانکی کافی است متد اعتبار سنجی را ایمپورت کنیم و شماره کارت مورد نظر را به آن پاس دهیم. در صورتی که شماره کارت مورد نظر معتبر باشد برنامه به کار خود ادامه خواهد داد و در صورتی که نا معتبر باشد exception ارسال خواهد شد.import logging
from azbankintro import card_validate, CardValidationException
try:
    card_validate(&#039;6280992042433333&#039;)
    logging.debug(&#039;bank card is valid&#039;)
except CardValidationException:
    logging.debug(&#039;bank card is not valid&#039;)اعتبار سنجی IBAN یا شماره شبابرای اعتبار سنجی شماره IBAN کافی است متد اعتبار سنجی را ایمپورت کنیم و شماره IBAN مورد نظر را به آن پاس دهیم. در صورتی که شماره مورد نظر معتبر باشد برنامه به کار خود ادامه خواهد داد و در صورتی که نا معتبر باشد exception ارسال خواهد شد.import logging
from azbankintro import iban_validate, IBANValidationException
try:
    iban_validate(&#039;IR062960000000100324200001&#039;)
    logging.debug(&#039;IBAN is valid&#039;)
except IBANValidationException:
    logging.debug(&#039;IBAN is not valid&#039;)تبدیل شماره حساب به شبا یا IBANدر صورتی که تمایل دارید شماره حساب بانک مورد را تبدیل به شماره شبا کنید می توانید از ساختار زیر استفاده کنید.from azbankintro import *
IBAN.calculate_iban(BankEnum.MELLI_BANK, &#039;0338404829005&#039;)در صورتی که نوع بانک مد نظر را ندارید و فقط رشته آن را دارید می توانید از کد زیر جهت دریافت بانک استفاده کنید.from azbankintro import *
s = &#039;BMI&#039;
bank_type = BankEnum(s)
IBAN.calculate_iban(bank_type, &#039;0338404829005&#039;)در صورتی که یک instance از نوع IBAN دارید نیز می توانید عملیات اعتبار سنجی را به گونه زیر انجام دهید.from azbankintro import *
s = &#039;BMI&#039;
bank_type = BankEnum(s)
iban = IBAN.calculate_iban(bank_type, &#039;0338404829005&#039;)
iban.validate()می توانید از فرمتر نیز استفاده کنید.from azbankintro import *
iban = IBAN.calculate_iban(BankEnum.MELLI_BANK, &#039;0338404829005&#039;)
print(iban.__str__())
print(iban.format(&#039;-&#039;))
print(iban.format(&#039; &#039;))
&amp;quot&amp;quot&amp;quot
IR040170000000338404829005
IR04-0170-0000-0033-8404-8290-05
IR04 0170 0000 0033 8404 8290 05
&amp;quot&amp;quot&amp;quotامیدوارم براتون مفید بوده باشه و خوشتون بیاد.</description>
                <category>Hamidreza Mahmoodi</category>
                <author>Hamidreza Mahmoodi</author>
                <pubDate>Tue, 22 Jun 2021 22:28:36 +0430</pubDate>
            </item>
            </channel>
</rss>