نحوه اتصال به درگاه بانک ملت در فریم ورک جنگو

بسیاری از اپلیکیشن ها و وبسایت ها امروزه برای دریافت مبلغی که در ازای کالا یا خدمات به کاربر ارائه میدهند از درگاه های بانکی استفاده میکنند که این درگاه ها میتوانند از بانک های مختلف باشد.امروز ما در این مقاله قصد داریم نحوه اتصال به درگاه بانک ملت را در فریم ورک جنگو با استفاده از یک پکیج کاربردی و پرسرعت به شما اموزش دهیم.ساخت یک وب سرویس بانک ملتقبل از انجام هر کاری نیاز به ساخت یک وب سرویس در خود وبسایت بانک ملت دارید. برای این منظور میتوانید به آدرس زیر مراجه کنید.درگاه پرداخت بانک ملتنصب پکیجابتدا پکیج را با کمک پکیج منیجر (pip) نصب میکنیم .pip install az-iranian-bank-gatewaysسپس یک پروژه با جنگو ایجاد میکنیم و به فایل setting.py در پروژه رجوع میکنیم.(به دلخواه میتوانید چندین اَپ ایجاد و به دلخواه آنها را نام گذاری کنید.)نحوه ساخت پروژه جنگو در لینک زیر : https://docs.djangoproject.com/en/3.2/intro/tutorial01/ تنظیمات زیر را به فایل setting.py پروژه اضافه میکنیم :INSTALLED_APPS = [ # .... 'azbankgateways', # ... ] AZ_IRANIAN_BANK_GATEWAYS = { 'GATEWAYS': { 'MELLAT': { 'TERMINAL_CODE': '<YOUR TERMINAL CODE>', 'USERNAME': '<YOUR USERNAME>', 'PASSWORD': '<YOUR PASSWORD>', }, }, 'DEFAULT': 'MELLAT', 'CURRENCY': 'IRR', # اختیاری 'TRACKING_CODE_QUERY_PARAM': 'tc', # اختیاری 'TRACKING_CODE_LENGTH': 16, # اختیاری 'SETTING_VALUE_READER_CLASS': 'azbankgateways.readers.DefaultReader', # اختیاری 'BANK_PRIORITIES': [ ], # اختیاری }در مرحله اول پکیج را به عنوان یک اَپ به جنگو معرفی کردیم و سپس درگاه را قرار داریم که در قسمت terminal code و username و password باید اطلاعات دریافتی از بانک را که هنگام ثبت نام برای درگاه گرفته ایم وارد کنیم .توضیحات بیشتر برای تنظیمات :GATEWAYS : تنظیمات مربوط به هر بانک به صورت دیکشنری های جدا در این قسمت وجود دارد. .تنظیماتی مانند کلاس اجرا کننده، کلیدهای امنیتی که توسط بانک در اختیار شما قرار می گیردDEFAULT: در زمانی که به سازنده فکتوری پارامتری ارسال نشود از این تنظیم به عنوان بانک پیش فرض استفاده خواهد شد و ارتباطات با این بانک برقرار می شود.CURRENCY - (IRR, IRT): واحد پولی که نرم افزار با آن کار می کند. این واحد پولی فارغ از واحد پولی درگاه خواهد بود. در صورتی که واحد پولی نرم افزار با واحد پولی درگاه بانک متفاوت باشد تبدیل ریال به تومان یا بالعکس انجام خواهد شد.TRACKING_CODE_QUERY_PARAM : پارامتری که در هنگام بازگشت از درگاه به کال بک یو آر ال تعیین شده تنظیم و ارسال می گردد. به عنوان مثال زمانی که از کاربر از درگاه بانک باز می گردد چه پرداخت موفق داشته باشد و چه نا موفق کاربر به لینکی که در هنگام استفاده از درگاه تنظیم شده است٬ ارجاع داده می شود و در انتهای آن این رشته + کد پیگیری بازگردانده می شود تا بتوان داده ها را از این طریق بازیابی کرد.TRACKING_CODE_LENGTH: طول کد پیگیری تولید شده توسط سیستم است. دقت شود که در برخی درگاه ها مانند درگاه بانک ملی ایران، طول ۲۰ کاراکتر خطای شماره سفارش ارسال نشده است را می دهد.SETTING_VALUE_READER_CLASS: با مقدار دهی به این تنظیم شما می توانید حالت یک متغیر خوان اضافه کنید که قابلیت های دیگری مثل پروایدر و پشتیبانی از یک بانک با چند اکانت و ... را به آن اضافه کنید.حال در اَپی که ساختیم در قسمت urls.py تنظیمات مسیر پکیج را اضافه میکنیم :from django.contrib import admin from django.urls import path from azbankgateways.urls import az_bank_gateways_urls admin.autodiscover() urlpatterns = [ path('admin/', admin.site.urls), path('bankgateways/', az_bank_gateways_urls()), ]حالا دیتابیس رو برای گرفتن اطلاعات درگاه ها اماده میکنیم .python manage.py migrateو در اخر برای استفاده و اتصال به درگاه بانک کافی است یک `BankFactory` ایجاد کنیم و پارامترهای اجباری را تنظیم کنیم. سپس کاربر را می توانیم به درگاه بانک هدایت کنیم. (در فایل views.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 = '+989112221234' # اختیاری 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('callback-gateway')) bank.set_mobile_number(user_mobile_number) # اختیاری bank_record = bank.ready() # هدایت کاربر به درگاه بانک return bank.redirect_gateway()و برای برگشت از درگاه داریم :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(&quotاین لینک معتبر نیست.&quot) raise Http404 try: bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code) except bank_models.Bank.DoesNotExist: logging.debug(&quotاین لینک معتبر نیست.&quot) raise Http404 # در این قسمت باید از طریق داده هایی که در بانک رکورد وجود دارد، رکورد متناظر یا هر اقدام مقتضی دیگر را انجام دهیم if bank_record.is_success: # پرداخت با موفقیت انجام پذیرفته است و بانک تایید کرده است. # می توانید کاربر را به صفحه نتیجه هدایت کنید یا نتیجه را نمایش دهید. return HttpResponse(&quotپرداخت با موفقیت انجام شد.&quot) # پرداخت موفق نبوده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت. return HttpResponse(&quotپرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت.&quot)البته شما میتونین برخی قسمت ها رو با تنظیمات مورد علاقه خودتون بنویسید این تنظیمات رو من به عنوان مثال قرار دادم که فهیدن قضیه راحت تر بشه. آدرس پروژه : https://github.com/ali-zahedi/az-iranian-bank-gateways امیدوارم که از این مقاله خوشتون اومده باشه در پناه الله مهربان باشید.