Skip to main content

Iranian Bank Gateways for django

Project description

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. درگاه پرداخت زیبال - وبسایت | مستندات
  5. درگاه پرداخت باهمتا - وبسایت | مستندات
  6. درگاه به پرداخت - وبسایت | مستندات
  7. درگاه ایران درگاه - وبسایت | مستندات
  8. درگاه آسان پرداخت - وبسایت | مستندات

آموزشی

  1. یوتیوب
  2. آپارات

نصب

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

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
        },
        "ZIBAL": {
            "MERCHANT_CODE": "<YOUR MERCHANT CODE>",
        },
        "BAHAMTA": {
            "MERCHANT_CODE": "<YOUR MERCHANT CODE>",
        },
        "MELLAT": {
            "TERMINAL_CODE": "<YOUR TERMINAL CODE>",
            "USERNAME": "<YOUR USERNAME>",
            "PASSWORD": "<YOUR PASSWORD>",
        },
        "IRANDARGAH": {
            "MERCHANT_CODE": "<YOUR MERCHANT CODE>",
            "SANDBOX": 0,  # 0 disable, 1 active
        },
        "ASANPARDAKHT": {
            "MERCHANT_CONFIGURATION_ID": "<YOUR MERCHANT CONFIGURATION ID>",
            "USERNAME": "<YOUR USERNAME>",
            "PASSWORD": "<YOUR PASSWORD>",
        },
    },
    "IS_SAMPLE_FORM_ENABLE": True,  # اختیاری و پیش فرض غیر فعال است
    "DEFAULT": "BMI",
    "CURRENCY": "IRR",  # اختیاری
    "BANK_TIMEOUT": 5,  # اختیاری - تنظیم کردن تایم اوت
    "TRACKING_CODE_QUERY_PARAM": "tc",  # اختیاری
    "TRACKING_CODE_LENGTH": 16,  # اختیاری
    "SETTING_VALUE_READER_CLASS": "azbankgateways.readers.DefaultReader",  # اختیاری
    "BANK_PRIORITIES": [
        "BMI",
        "SEP",
        # and so on ...
    ],  # اختیاری
    "IS_SAFE_GET_GATEWAY_PAYMENT": False,  # اختیاری، بهتر است True بگذارید.
    "CUSTOM_APP": None,  # اختیاری
}
  1. GATEWAYS : تنظیمات مربوط به هر بانک به صورت دیکشنری های جدا در این قسمت وجود دارد. تنظیماتی مانند کلاس اجرا کننده، کلیدهای امنیتی که توسط بانک در اختیار شما قرار می گیرد.

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

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

  4. BANK_TIMEOUT: با استفاده از این پارامتر میتوانید تایم اوت پیش فرض اتصال به بانک را تغییر دهید

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

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

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

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

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

  10. CALLBACK_NAMESPACE: اگر میخواهید تابع کال بک داخلی را اورراید کنید یا پروژه دارای اپ های مختلفی است و قسمت پرداخت در اپ جداگانه ای قرار دارد می‌توانید محل قرار گیری یو آر ال های پیشفرض را تغییر دهید برای مثال:

    'CALLBACK_NAMESPACE': 'api:payment:callback',
    
  11. GO_TO_BANK_GATEWAY_NAMESPACE: اگر میخواهید تابع رفتن به درگاه بانک داخلی را اورراید کنید یا پروژه دارای اپ های مختلفی است وقسمت پرداخت در اپ جداگانه ای قرار دارد می‌توانید محل قرار گیری یو آر ال های پیشفرض را تغییر دهید برای مثال:

     'GO_TO_BANK_GATEWAY_NAMESPACE': 'api:payment:go-to-bank-gateway',
    
  12. SAMPLE_RESULT_NAMESPACE: اگر میخواهید صفحه نمونه داخلی را اورراید کنید یا پروژه دارای اپ های مختلفی است وقسمت پرداخت در اپ جداگانه ای قرار دارد می‌توانید محل قرار گیری یو آر ال های پیشفرض را تغییر دهید برای مثال:

     'SAMPLE_RESULT_NAMESPACE': 'api:payment:sample-result',
    
  13. IS_SAFE_GET_GATEWAY_PAYMENT:

    'IS_SAFE_GET_GATEWAY_PAYMENT': True,
    

    توصیه میشه True باشه.

    درصورتی که مقدار برابر با True قرار بگیرد تابع redirect_gateway از دسترس خارج میشودو باید از تابع get_gateway استفاده شود.

  14. CUSTOM_APP :

    CUSTOM_APP : 'api:payment',
    

    اگر نیاز ندارید توابع داخلی را اورراید کنیدو فقط به این نیاز دارید که مسیر یو ار ال های داخلی را در اپ جداگانه ای قرار گیرد می‌توانید از این گزینه برای ادرسی دهی محل قرار گیری اپ استفاده کنید

فعال‌سازی Django Sites و تعیین پروتکل/دامنه

اگر می‌خواهید از قابلیت auto_connect استفاده کنید باید آدرس های کامل (به‌همراه دامنه) بسازیم، فریم‌ورک django.contrib.sites را فعال کنید و پروتکل پیش‌فرض را مشخص کنید.

INSTALLED_APPS = [
    # ...
    "django.contrib.sites",  # برای مدیریت دامنهٔ فعلی
    "azbankgateways",
    # ...
]


# شناسه سایت فعلی (معمولاً 1)
SITE_ID = 1

# پروتکل پیش‌فرض برای ساخت URL کامل
DEFAULT_PROTOCOL = "https"  # در صورت نیاز می‌توانید "http" بگذارید

سپس مایگریت‌ها را اجرا کنید:

python manage.py migrate

حالا از مسیر Admin → Sites → Sites رکورد با شناسه ۱ (یا رکورد موردنظر) را باز کنید و:

Name: نام سایت (دلخواه)

Domain name: دامنهٔ سایت بدون پروتکل و بدون اسلش پایانی (مثلاً example.com)

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 استفاده می کنید برای رفع موارد احتمالی حتما تنظیمات این لینک را انجام دهید.

نحوه استفاده

ارسال به بانک

برای وقتی که تنظیمات IS_SAFE_GET_GATEWAY_PAYMENT': False'

برای استفاده و اتصال به درگاه بانک کافی است یک `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_custom_data({"foo": "bar"})

        # یو آر ال بازگشت به نرم افزار برای ادامه فرآیند
        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

برای وقتی که تنظیمات IS_SAFE_GET_GATEWAY_PAYMENT': True'

در این قسمت مثل مثال قبل عمل میکنیم تنها تفاوت این است که از تابع get_gateway بجای redirect_gateway استفاده میکنیم دلیل این کار افزایش امنیت و تغییر صفحهٔ redirect می‌باشد.

import logging
from django.urls import reverse
from django.shortcuts import render
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()

        # هدایت کاربر به درگاه بانک
        context = bank.get_gateway()
        return render(request, "redirect_to_bank.html", context=context)
    except AZBankGatewaysException as e:
        logging.critical(e)
        return render(request, "redirect_to_bank.html")

تنظیم SECURE_REFERRER_POLICY برای درگاه بانک ملی و سامان

برای استفاده از درگاه بانک ملی و سامان تنظیم SECURE_REFERRER_POLICY در setting جنگو به صورت زیر الزامیست

SECURE_REFERRER_POLICY = "strict-origin-when-cross-origin"

انتخاب خودکار درگاه

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

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

هم‌چنین می‌توانید عملیات auto create کردن factory را از طریق interface انجام دهید:

from azbankgateways.bankfactories_interface import BankFactory
from azbankgateways.exceptions import AZBankGatewaysException


def go_to_gateway_view(request):
    try:
        factory = BankFactory()
        bank = factory.auto_create(
            request=request,
            amount=amount,
            callback_url=callback_url,
            mobile_number=mobile_number,
        )

        # در صورت تمایل اتصال این رکورد به رکورد فاکتور یا هر چیزی که بعدا بتوانید ارتباط بین محصول یا خدمات را با این
        # پرداخت برقرار کنید.
        bank_record = bank.ready()

        # هدایت کاربر به درگاه بانک
        return bank.redirect_gateway()
    except AZBankGatewaysException as e:
        raise e

عملیات create کردن factory از طریق interface :

from azbankgateways.bankfactories_interface import BankFactory
from azbankgateways.exceptions import AZBankGatewaysException


def go_to_gateway_view(request):
    try:
        factory = BankFactory()
        bank = factory.create(
            request=request,
            amount=amount,
            callback_url=callback_url,
            mobile_number=mobile_number,
            bank_type=bank_type,
        )

        # در صورت تمایل اتصال این رکورد به رکورد فاکتور یا هر چیزی که بعدا بتوانید ارتباط بین محصول یا خدمات را با این
        # پرداخت برقرار کنید.
        bank_record = bank.ready()

        # هدایت کاربر به درگاه بانک
        return bank.redirect_gateway()
    except AZBankGatewaysException as e:
        raise e

ساخت صفحه redirect_to_bank.html

این صفحه درصورتی کار می‌کند که IS_SAFE_GET_GATEWAY_PAYMENT': True' و view مربوطه تنظیم شود.
برای این کار در پوشه templates پروژه فایل redirect_to_bank.html را ایجاد کرده و محتوای زیر را در آن قرار میدیم (می‌توانید با سلیقهٔ خودتان سفارشی‌سازی کنید)

<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <title>انتقال به درگاه پرداخت</title>
</head>
<body>

   {% if url %}
     <h5>در حال اتصال به درگاه پرداخت ...</h5>
   {% else %}
     <h5>خطا در ارتباط با درگاه</h5>
   {% endif %}

   {% if url %}
      <form id='id_form' action="{{ url }}" method="{{ method }}">
          {% csrf_token %}
          {% for key, value in params.items %}
              <input type="hidden" name="{{ key }}" value="{{ value }}">
          {% endfor %}
      </form>

      <script type="text/javascript">
          window.onload = function () {

              function submitForm() {
                  document.forms['id_form'].submit();
              }

              submitForm();
          }
      </script>
   {% endif %}
</body>
</html>

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

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

  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 Zibal support
  • Add Bahamta support
  • Add BehPardakht 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 در برخی موارد
  • MrMRM1 بابت رفع مشکل امنیتی
  • MrMRM1 اضافه شدن قابلیت اورراید یا تغییر ادرس یو آر ال های پیشفرض
  • shiani error occurs when the main language of site is Persian and it has to use gettext_lazy translation.
  • amirreza8002 رفع مشکل ترجمه
  • ahmadrezanavaie رفع مشکل ترجمه
  • zamoosh اضافه کردن وضعیت های تراکنش در بانک ملت
  • birddevelper الزامی کردن وجود referrer برای درگاه های بانک ملی و سامان و رفع مشکل توکن درگاه بانک ملی
  • apidemy ریفکتور _is_strict_origin_policy_enabled و پیروی از DRY
  • TinyPuff رفع مشکل Pay.ir
  • mojtabaakbari221b اضافه کردن اینترفیس برای bankfactory
  • MrMRM1 برای درگاه زرین پال ورژن4
  • mmfarahmand برای حل مشکل نوع ارز در درگاه زرین پال
  • mahdizolqadr برای اضافه کردن تایم اوت به تنظیمات پروژه
  • saber-be برای اضافه کردن درگاه ایران درگاه
  • miladkoohi برای اضافه کردن درگاه آسان پرداخت
  • zamoosh رفع مشکل circular import در ماژول banks
  • mahdishirvani79 رفع warning مربوط به default app config
  • Rayiumir حذف idpay و payV1

Star History

Star History Chart

License

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

Project details


Release history Release notifications | RSS feed

This version

2.3.4

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

az_iranian_bank_gateways-2.3.4.tar.gz (42.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

az_iranian_bank_gateways-2.3.4-py3-none-any.whl (52.9 kB view details)

Uploaded Python 3

File details

Details for the file az_iranian_bank_gateways-2.3.4.tar.gz.

File metadata

  • Download URL: az_iranian_bank_gateways-2.3.4.tar.gz
  • Upload date:
  • Size: 42.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for az_iranian_bank_gateways-2.3.4.tar.gz
Algorithm Hash digest
SHA256 578d2297a34573e1f9ea1fc024e90de68ec8f69c24896be9fe8e4e715a347a39
MD5 a54703fdeb19ec68300f261a283cf460
BLAKE2b-256 b2018e1c70040c62d8768095eb3d52101621d079473d9c1cb4778bf5bd420144

See more details on using hashes here.

Provenance

The following attestation bundles were made for az_iranian_bank_gateways-2.3.4.tar.gz:

Publisher: release.yaml on ali-zahedi/az-iranian-bank-gateways

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file az_iranian_bank_gateways-2.3.4-py3-none-any.whl.

File metadata

File hashes

Hashes for az_iranian_bank_gateways-2.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 24137c542ec613d47faa81745f70d812eced4578a49d29d283622599289888da
MD5 9373d234afdb69af04b33204508844ee
BLAKE2b-256 4e12fe44ca80c814d5b909e251fab3823ae1a689881619b32389b9ea196a2c36

See more details on using hashes here.

Provenance

The following attestation bundles were made for az_iranian_bank_gateways-2.3.4-py3-none-any.whl:

Publisher: release.yaml on ali-zahedi/az-iranian-bank-gateways

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page