All Projects → ali-zahedi → az-iranian-bank-gateways

ali-zahedi / az-iranian-bank-gateways

Licence: MIT license
درگاه اتصال به بانک های ایرانی ( درگاه پرداخت بانک ملی ایران،بانک سامان، بانک ملت، درگاه پرداخت زرین پال و ... ) با استفاده از پایتون

Programming Languages

python
139335 projects - #7 most used programming language
HTML
75241 projects

Projects that are alternatives of or similar to az-iranian-bank-gateways

iran-payment
a Laravel package to handle Internet Payment Gateways for Iran Banking System
Stars: ✭ 16 (-94.81%)
Mutual labels:  sep, iran, zarinpal, payment-gateway, saman, iran-payment, iranian-bank, payping
sep-pay
Pay.ir Payment Package for Laravel 5.3+
Stars: ✭ 17 (-94.48%)
Mutual labels:  sep, iran, payment-gateway, saman, iran-payment, iranian-bank
BankPayment
Persian Bank Payment Server
Stars: ✭ 37 (-87.99%)
Mutual labels:  mellat, behpardakht, saman
php-ipg-ir
IPG (Internet Payment Gateway) manager for Iran Banking System
Stars: ✭ 26 (-91.56%)
Mutual labels:  iran, mellat, saman
laravel-multi-payment
Laravel online gateway payment package with multi driver support
Stars: ✭ 22 (-92.86%)
Mutual labels:  zarinpal, behpardakht
LaravelSms
package for send sms with laravel (All gatways in Iran)
Stars: ✭ 14 (-95.45%)
Mutual labels:  iran
Leakfa.com
A simple way to know if you are on the list of major security breaches like "HIBP", but it is specific for Iran.
Stars: ✭ 106 (-65.58%)
Mutual labels:  iran
typhoon-iran-cities
A Laravel package for importing regions of Iran such as provinces, counties, sectors, cities, city districts, rural districts, and villages of Iran into your database accurately. پکیج لاراول برای افزودن شهرها و استان ها و تمام مناطق روستایی و بخش های ایران
Stars: ✭ 31 (-89.94%)
Mutual labels:  iran
Far-From-Home
A cross-platform mobile developed using Flutter and Firestore for House Rental Application with integrated payment module
Stars: ✭ 27 (-91.23%)
Mutual labels:  payment-gateway
SEPparser
Script for parsing Symantec Endpoint Protection logs, VBNs, and ccSubSDK database.
Stars: ✭ 40 (-87.01%)
Mutual labels:  sep
CheGhadr
دوست داری بدونی چند ساعت واسه خرید یه چیز باید کار کنی؟
Stars: ✭ 21 (-93.18%)
Mutual labels:  iran
DNTPersianComponents.Blazor
A collection of Persian components for Blazor
Stars: ✭ 27 (-91.23%)
Mutual labels:  iran
iran-hosted-domains
"Iran Hosted Domains" is a comprehensive list of Iranian domains and services that are hosted within the country.
Stars: ✭ 182 (-40.91%)
Mutual labels:  iran
PersianTools.Core
Persian Tools for .Net and .Net Core
Stars: ✭ 25 (-91.88%)
Mutual labels:  iran
cryptopay-web
A payment gateway like Stripe for cryptocurrencies
Stars: ✭ 7 (-97.73%)
Mutual labels:  payment-gateway
IR-Map
Iran map in Scalable Vector Graphics (SVG).
Stars: ✭ 23 (-92.53%)
Mutual labels:  iran
go-bmi
Body Mass Index(BMI) application developed by go-chassis microservice framwork
Stars: ✭ 14 (-95.45%)
Mutual labels:  bmi
Github Do Not Ban Us
GitHub do not ban us from open source world 🇮🇷
Stars: ✭ 11,950 (+3779.87%)
Mutual labels:  iran
adyen-hybris
Adyen Payment plugin for Hybris
Stars: ✭ 23 (-92.53%)
Mutual labels:  payment-gateway
ccashcow
💰 Accept cards & crypto. Payments so easy a cow could do it.
Stars: ✭ 40 (-87.01%)
Mutual labels:  payment-gateway

AZ Iranian Bank Gateway Framework config

GitHub GitHub GitHub GitHub Join the chat at https://gitter.im/az-iranian-bank-gateways/community

کدهای آزاد و متن باز به زبان پایتون (python) که برای ارتباط با درگاه های بانکهای ایرانی در جنگو (Django) توسعه داده شده است.

در حال حاضر درگاه های با درگاه های زیر می توانید پرداخت کنید.

  1. درگاه پرداخت بانک ملی ایران (BMI)

  2. درگاه پرداخت بانک سامان (SEP)

  3. درگاه پرداخت زرین پال

  4. درگاه پرداخت آی دی پی (IDPay)

  5. درگاه پرداخت زیبال

  6. درگاه پرداخت باهمتا

  7. درگاه به پرداخت

  8. درگاه پی ورژن ۱

[[TOC]]

آموزشی

  1. یوتیوب
  2. آپارات
  3. آکادمی ژاک

نصب

نصب از طریق پکیج منیجر

pip install az-iranian-bank-gateways

تنظیمات

settings.py

در فایل `settings.py` تنظیمات زیر را انجام میدهیم.

INSTALLED_APPS = [
   # ....
   'azbankgateways',
   # ...
]
AZ_IRANIAN_BANK_GATEWAYS = {
   'GATEWAYS': {
       'BMI': {
           'MERCHANT_CODE': '<YOUR MERCHANT CODE>',
           'TERMINAL_CODE': '<YOUR TERMINAL CODE>',
           'SECRET_KEY': '<YOUR SECRET CODE>',
       },
       'SEP': {
           'MERCHANT_CODE': '<YOUR MERCHANT CODE>',
           'TERMINAL_CODE': '<YOUR TERMINAL CODE>',
       },
       'ZARINPAL': {
           'MERCHANT_CODE': '<YOUR MERCHANT CODE>',
           'SANDBOX': 0,  # 0 disable, 1 active
       },
       'IDPAY': {
           'MERCHANT_CODE': '<YOUR MERCHANT CODE>',
           'METHOD': 'POST',  # GET or POST
           'X_SANDBOX': 0,  # 0 disable, 1 active
       },
       'ZIBAL': {
           'MERCHANT_CODE': '<YOUR MERCHANT CODE>',
       },
       'BAHAMTA': {
           'MERCHANT_CODE': '<YOUR MERCHANT CODE>',
       },
       'MELLAT': {
           'TERMINAL_CODE': '<YOUR TERMINAL CODE>',
           'USERNAME': '<YOUR USERNAME>',
           'PASSWORD': '<YOUR PASSWORD>',
       },
       'PAYV1': {
           'MERCHANT_CODE': '<YOUR MERCHANT CODE>',
           'X_SANDBOX': 0,  # 0 disable, 1 active
       },
   },
   'IS_SAMPLE_FORM_ENABLE': True, # اختیاری و پیش فرض غیر فعال است
   'DEFAULT': 'BMI',
   'CURRENCY': 'IRR', # اختیاری
   'TRACKING_CODE_QUERY_PARAM': 'tc', # اختیاری
   'TRACKING_CODE_LENGTH': 16, # اختیاری
   'SETTING_VALUE_READER_CLASS': 'azbankgateways.readers.DefaultReader', # اختیاری
   'BANK_PRIORITIES': [
       'BMI',
       'SEP',
       # and so on ...
   ], # اختیاری
}
  1. GATEWAYS : تنظیمات مربوط به هر بانک به صورت دیکشنری های جدا در این قسمت وجود دارد. تنظیماتی مانند کلاس اجرا کننده، کلیدهای امنیتی که توسط بانک در اختیار شما قرار می گیرد.

  2. DEFAULT: در زمانی که به سازنده فکتوری پارامتری ارسال نشود از این تنظیم به عنوان بانک پیش فرض استفاده خواهد شد و ارتباطات با این بانک برقرار می شود.

  3. CURRENCY - (IRR, IRT): واحد پولی که نرم افزار با آن کار می کند. این واحد پولی فارغ از واحد پولی درگاه خواهد بود. در صورتی که واحد پولی نرم افزار با واحد پولی درگاه بانک متفاوت باشد تبدیل ریال به تومان یا بالعکس انجام خواهد شد.

  4. TRACKING_CODE_QUERY_PARAM : پارامتری که در هنگام بازگشت از درگاه به کال بک یو آر ال تعیین شده تنظیم و ارسال می گردد. به عنوان مثال زمانی که از کاربر از درگاه بانک باز می گردد چه پرداخت موفق داشته باشد و چه نا موفق کاربر به لینکی که در هنگام استفاده از درگاه تنظیم شده است٬ ارجاع داده می شود و در انتهای آن این رشته + کد پیگیری بازگردانده می شود تا بتوان داده ها را از این طریق بازیابی کرد.

  5. TRACKING_CODE_LENGTH: طول کد پیگیری تولید شده توسط سیستم است. دقت شود که در برخی درگاه ها مانند درگاه بانک ملی ایران، طول ۲۰ کاراکتر خطای شماره سفارش ارسال نشده است را می دهد.

  6. SETTING_VALUE_READER_CLASS: با مقدار دهی به این تنظیم شما می توانید حالت یک متغیر خوان اضافه کنید که قابلیت های دیگری مثل پروایدر و پشتیبانی از یک بانک با چند اکانت و ... را به آن اضافه کنید.

  7. BANK_PRIORITIES: این آرایه اختیاری است. زمانی که وضعیت اتصال به درگاه به صورت خودکار تعیین شده باشد، ابتدا به بانک پیش فرض متصل می شود و سپس بر این اساس شروع به اتصال خواهد کرد، تا به اولین درگاه فعال برسد. در حالت پیش فرض این آرایه خالی است که بعد از اتصال به درگاه مورد نظر در صورت خطا بقیه درگاه ها امتحان نخواهند شد.

  8. IS_SAMPLE_FORM_ENABLE: یو آر ال های مربوط به تست درگاه بانک را فعال و یا غیر فعال می کند. در صورت فعال بودن می توانید از طریق آدرس زیر درگاه پرداخت را امتحان کنید.

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('admin/', admin.site.urls),
    path('bankgateways/', az_bank_gateways_urls()),
]

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

Migrate

بعد از انجام تنظیمات دستور زیر را اجرا می کنیم.

python manage.py migrate

اگر از reverse proxy و https استفاده می کنید برای رفع موارد احتمالی حتما تنظیمات این لینک را انجام دهید.

نحوه استفاده

ارسال به بانک

برای استفاده و اتصال به درگاه بانک کافی است یک `BankFactory` ایجاد کنیم و پارامترهای اجباری را تنظیم کنیم. سپس کاربر را می توانیم به درگاه بانک هدایت کنیم.

import logging
from django.urls import reverse
from azbankgateways import bankfactories, models as bank_models, default_settings as settings
from azbankgateways.exceptions import AZBankGatewaysException


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

    factory = bankfactories.BankFactory()
    try:
        bank = factory.auto_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()
    except AZBankGatewaysException as e:
        logging.critical(e)
        # TODO: redirect to failed page.
        raise e

در صورتیکه تمایل دارید به صورت خودکار به اولین درگاه در دسترس متصل شوید. ابتدا از قسمت تنظیمات در بخش `BANK_PRIORITIES ` اولویت های بانک های مد نظر را وارید کنید. سپس به جای استفاده از متد `factory.create` از متد ‍`factory.auto_create` در این بخش استفاده کنید. به متد auto_create می توانید مبلغ مد نظر را نیز برای صحت سنجی از حداقل مبلغ نیز ارسال کنید.

set_mobile_number متدی است که پارامتر شماره موبایل کاربری که قصد خرید دارد را به آن پاس میدهیم. این شماره موبایل جهت پرداخت و پیگیری آسان تر به درگاه ارسال می شود

بازگشت از بانک

وضعیت رکورد بانک به شرح ذیل می باشد.

  1. WAITING: در انتظار برای انتقال کاربر به درگاه بانک

  2. REDIRECT_TO_BANK: کاربر به درگاه بانک منتقل شده است ولی هنوز از درگاه باز نگشته است.

  3. RETURN_FROM_BANK: کاربر از درگاه برگشته ولی عملیات صحت سنجی٬ یا تکمیل نشده است یا با خطا درهنگام تایید از سوی بانک مواجه شده است. در این شرایط می توان با فراخوانی مجدد در بازه زمانی کمتر از ۱۵ دقیقه که کاربر بازگشته است٬ عملیات تایید را مجدد درخواست کرد. شرح تایید مجدد در پایین تر آورده شده است.

  4. CANCEL_BY_USER: پرداخت توسط کاربر کنسل شده است.

  5. EXPIRE_GATEWAY_TOKEN: ارتباط با درگاه بانک برقرار شده ولی کاربر به درگاه هدایت نشده است.

  6. EXPIRE_VERIFY_PAYMENT: در بازه زمانی ۱۵ دقیقه پس از بازگشت٬ موفق به تایید اطلاعات پرداخت نشده ایم.

  7. COMPLETE: وضعیت پرداخت موفق است.

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("این لینک معتبر نیست.")
        raise Http404

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

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

    # پرداخت موفق نبوده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت.
    return HttpResponse("پرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت.")

درخواست تایید مجدد از بانک

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("This record is verify now.", extra={'pk': bank_record.pk})

TODO

  • Add BMI support
  • Add SEP support
  • Add Zarinpal support
  • Add IDPay support
  • Add Zibal support
  • Add Bahamta support
  • Add BehPardakht support
  • Add Pay.ir V1 support
  • Add Pay.ir V2 support
  • Add nextpay-ir support (need MERCHANT_CODE & etc.)
  • Add Paystar support (need MERCHANT_CODE & etc.)
  • Add Sepah Bank support (need MERCHANT_CODE & etc.)
  • Managing verification Process when Gateway Not Available
  • Add celery beat for when Gateway Not Available

توسعه

اگر از این بسته استفاده می کنید و خوشتون اومده با دادن ستاره به ما دلگرمی بدید.البته که اگر زمان بگذارید و گسترش بدید خیلی استقبال می کنیم و خوشحال میشیم. البته که در هیچ کدوم از این موارد اصراری نیست.

برای نصب وابستگی ها از طریق زیر اقدام کنید و بعد از انجام تغییرات مرج ریکوئست ارسال کنید.

pip install -e ".[dev]"
pre-commit install

بیشتر بخوانیم:

شاد باشید و خندون

با تشکر از

  • erfanmosaddeghi برای اصلاح حداقل مبلغ زرین پال
  • sina-am اضافه کردن درگاه بانک ملت
  • joejoe-am برای رفع مشکل اولویت بندی در اتصال خودکار
  • mash5026 برای رفع مشکل unmarshalling ERROR: For input string
  • hypy13 برای آپدیت به ورژن های بالاتر از جنگو ۳.۲
  • jam4li برای اضافه کردن سندباکس زرین پال
  • ravexina رفع مشکل تسویه حساب بانک ملت
  • nimaes80 اضافه کردن درگاه pay.ir ورژن یک
  • khademmilad پشتیبانی از پایتون ۳.۱۰ و ۳.۱۱
  • Saman-Zand-H رفع مشکل اتصال pay.ir در برخی موارد

License

The MIT License (MIT). Please see License File for more information.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].