ali-zahedi / az-iranian-bank-gateways Goto Github PK
View Code? Open in Web Editor NEWدرگاه اتصال به بانک های ایرانی ( درگاه پرداخت بانک ملی ایران،بانک سامان، بانک ملت، درگاه پرداخت زرین پال و ... ) با استفاده از پایتون
License: MIT License
درگاه اتصال به بانک های ایرانی ( درگاه پرداخت بانک ملی ایران،بانک سامان، بانک ملت، درگاه پرداخت زرین پال و ... ) با استفاده از پایتون
License: MIT License
بعد از ست کردن یوآرالها و بقیه تنطیمات مربوطه در سمت سرور(جنگو) این کدهارو در سمت فرانتآند(ریاکت) نوشتم:
<Button onClick={handleSubmit}>پرداخت</Button>
const handleSubmit = ({ history }) => { axios .post("/go-to-gateway/") .then((response) => { console.log(response); }) .catch((error) => { console.log(error); }); };
درواقع با استفاده از اکسیوس، میخام برم به پیچ آیدیپی که مبلغ هم با خودش ببره.
اما ارور ۴۰۳ میگیرم
البته باید هدر هم ست بشه و فرستاده بشه سمت بانک
سلام روزتون بخیر.
def go_to_gateway_view(request):
amount = 100000
factory = bankfactories.BankFactory()
try:
bank = factory.auto_create()
bank.set_request(request)
bank.set_amount(amount)
bank.set_client_callback_url(request.build_absolute_uri(reverse("payment:callback_gateway")))
bank_record = bank.ready()
# Log the parameters being sent to the bank gateway for debugging
print(bank.get_pay_data())
print("verify: ", bank.get_verify_data())
print(bank.get_transaction_status_text())
# Redirect the user to the bank gateway
return bank.redirect_gateway()
except AZBankGatewaysException as e:
logging.critical(e)
# TODO: Redirect to a failed page or handle the error appropriately
raise e
def callback_gateway_view(request):
tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM)
if not tracking_code:
logging.debug('Valid referral address not received.')
raise Http404
try:
bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code)
except bank_models.Bank.DoesNotExist:
logging.debug('Valid referral address not received.')
raise Http404
# Process the bank record and handle the transaction result accordingly
if bank_record.is_success:
return HttpResponse('Transaction successful.')
else:
return HttpResponse('Transaction failed.')
من به این شکل دارم درخواستمو برای بانک سامان میفرستم.
تنظیمات هم به این شکله:
AZ_IRANIAN_BANK_GATEWAYS = {
'GATEWAYS': {
'SEP': {
'MERCHANT_CODE': '',
'TERMINAL_CODE': '',
},
},
'DEFAULT': 'SEP',
'BANK_PRIORITIES': [
'SEP',
],
}
ولی با این خطا مواجه میشم: آدرس ارجاع دهنده دریافت نشد. (پارامترهای ارسال شده نامعتبر است.)
دیتای ارسالی هم به شکل زیره:
{'Action': 'Token', 'Amount': 100000, 'Wage': 0, 'TerminalId': '****', 'ResNum': 8726260414971983, 'RedirectURL': 'https://app.safirmall.com/bankgateways/callback/?bank_type=SEP&identifier=1', 'CellNumber': None}
ممنون میشم راهنمایی کنید مشکل از کجاس
سلام خوبید؟
ببخشید مزاحم میشم من وقتی که از درگاه پرداخت بانک ملی استفاده میکنم این ارور را میدهد Invalid format string
response = get_response(request)
response = wrapped_callback(request, *callback_args, **callback_kwargs)
bank_record = bank.ready()
self.pay()
data = self.get_pay_data()
time_now = datetime.datetime.now().strftime('%m/%d/%Y %H:%M:%S %P')
مشکل چیست
ممنون
سلام
من وقتی از درخواست پست "از سمت فرانت" میفرستم، این خروجی رو میگیرم توی بکاند(به سمت درگاه نمیره توی مرورگر، اما ارور هم نمیده):
"POST /idpay/ HTTP/1.1" 302 0
"OPTIONS /bankgateways/go-to-bank-gateway/?url=https ......... &method=GET HTTP/1.1" 200 0
"GET /bankgateways/go-to-bank-gateway/?url=https ......... &method=GET HTTP/1.1" 200 561
اما اگر همین درخواست رو با "پستمن" بفرستم این خروجی میاد و درگاه رو هم باز میکنه :
"POST /idpay/ HTTP/1.1" 302 0
"GET /bankgateways/go-to-bank-gateway/?url=https .......... &method=GET HTTP/1.1" 200 561
به نظرتون کجای کار ایراد داره که درگاه رو باز نمیکنه؟
با سلام
چرا پس از زدن دگمه ؛برگشت به سایت پذیرنده ؛این ارور را میده
AttributeError at /bankgateways/callback/
'NoneType' object has no attribute 'callback_url'
Request Method: GET
Request URL: http://127.0.0.1:8000/bankgateways/callback/?bank_type=IDPAY&identifier=1&status=1&track_id=392426&id=545c7e3792bbdb1242a18798a2bb0b37&order_id=2899648918853678
Django Version: 3.1.7
Exception Type: AttributeError
Exception Value:
'NoneType' object has no attribute 'callback_url'
ممنون میشوم کمکم کنید
سلام خسته نباشید. برای استفاده از لاگین به جای استفاده از خود loggin بهتر است یک logger کانفیگ شود.
با سلام
موقع برگشت از درگاه تو حالت دیباگ با این خطا مواجه شدم یک پروژه خالی دیگه هم ران کردم و قدم به قدم با توضیحات ویدیویی جلو رفتم و باز هم این خطا وجود داشت ممنون میشم راهنمایی بفرمایید
AttributeError at /bankgateways/callback/
"NoneType" object has no attribute "callback_url"
برای بانک تجارت این پکیج کار نمی کنه ؟
ممنون میشم در این مورد راهنمایم کنید.
سلام جناب زاهدی ، بنده میخواستم بدونم که چطور باید یوزری که پرداخت رو انجام داده در رکورد نمایش داد و همیچنین چطور میتونم از دستورات شرطی استفاده کنم ؟ برای مثال
if status == complete:
< button > form < button >
که اگر کاربر پرداخت کرده مبلغ رو یک دکمه در پروفایلش مشخص بشه ، ممنون میشم کمکم کنید با تشکر
وهمچنین چطور میتونم کوئری ست ایجاد کنم ازش ؟
اضافه کردن آپشنال celery beat برای وریفای کردن پرداخت هایی که از درگاه بر میگردند و به هر دلیلی در هنگام وریفای کردن با خطا مواجه میشوند
از درگاه سداد وقتی از خرید برمیگرده
با سلام
امکان این که Merchant Code به صورت یک پارامتر هنگام اتصال کاربر به درگاه تنظیم بشه وجود داره؟ (به جای قرارگیری در فایل settings.py) که از این طریق به درگاههای گوناگون (حساب های جداگانهای از زرین پال مثلا) متصل شد.
سلام و وقت بخیر
ظاهرا در مدل تغییراتی اعمال شده و پس از اعمال این تغییرات migration تولید نشده. در نتیجه در محیط توسعه زمانی که کاربر برای تولید migrationهای Applicationهای موجود در پروژه از دستور makemigrations استفاده کند، برای این تغییرات جدید در بسته az-iranian-bank-gateways فایل migration جدیدی ایجاد شده و پروژه کاربر به این فایل وابسته خواهد شد:
0005_alter_bank_bank_type_alter_bank_created_at_and_more.py
حال اگر کاربر قصد داشته باشد در یک محیط جدید عملیات پایگاهداده را migrate کرده یا از دستور runserver استفاده نماید، پروژه به یک فایل migration که وجود ندارد وابسته بوده و غیر قابل استفاده خواهد بود.
حتی استفاده از دستور زیر برای تولید فایل migration بسته az-iranian-bank-gateways:
./manage.py makemigrations azbankgateways
با خطای عدم وجود فایل: 0005_alter_bank_bank_type_alter_bank_created_at_and_more
مواجه خواهد شد.
برای صحت سنجی این مسئله:
$ virtualenv venv
$ source venv/bin/activate
$ pip install django
$ pip install az-iranian-bank-gateways
$ django-admin startproject myproject
سپس app را به settings.py اضافه کنید.
$ ./manage.py makemigrations --dry-run
Migrations for 'azbankgateways':
/home/username/venv/lib/python3.11/site-packages/azbankgateways/migrations/0005_alter_bank_bank_type_alter_bank_created_at_and_more.py
- Alter field bank_type on bank
- Alter field created_at on bank
- Alter field status on bank
- Alter field update_at on bank
در حال حاضر بنده برای اینکه این مسئله رو به نحوی مدیریت کنم فایلهای migration که بر روی 0005_alter_bank_bank_type_alter_bank_created_at_and_more
وابسته شده اند را به صورت دستی به این شکل تغییر دادم:
dependencies = [
("azbankgateways", "__first__"),
]
سلام
این خطا رو وقتی از درگاه پرداخت بر میگردم میخورم
مشکل از اینجاست که callback_url توی دیتابیس ذخیره نمیشه
کد درگاه پرداخت هم این هست
def create_factor(self, subscription):
factory = bankfactories.BankFactory()
bank = factory.create()
bank.set_request(self.request)
bank.set_amount(subscription.price)
bank.set_client_callback_url(reverse('subscription-gateway'))
bank.set_mobile_number(self.request.user.phone_number)
bank_obj = bank.ready()
return Response({
"payment_url": bank.get_gateway_payment_url(),
})
تا اینجا همه چی درسته
حتی bank.get_client_callback_url()
این رو هم پرینت میگیرم مقدار درستی رو نمایش میده
ولی بعد پرداخت url درست نیست و فقط همین رو برمیگردونه '?tc=5075716874649973'
مشکل از کجاست؟
سلام وقت بخیر
در صورت امکان ارور زیر که توی stackoverflow ثبت شده رو پاسخ بدید
https://stackoverflow.com/questions/75297057/python-banktype-cannot-be-converted-to-a-mysql-type-error-in-django
با تشکر
با عرض سلام!
این ارور موقع رفتن به به اندپوینت go-to-getways نشون داده میشه !
No exception message supplied
Request Method: GET
Request URL http://127.0.0.1:8000/go-to-getway
Django Version:4.1.1
Exception Type:BankGatewayAutoConnectionFailed
Exception Location:Desktop\paydjango\env\lib\site-packages\azbankgateways\bankfactories.py, line 60, in auto_create
Python Version:3.10.6
سلام. من توی استفاده از این کتابخونه در یک پروژه با rest framework به مشکل خودم.
مشکل اینه که قراره قسمت ریدایرکت شدن کاربر به درگاه بانک در فرانت انجام بشه و در بکاند یک api برای اماده کردن درگاه بانکی و فرستادن اطلاعات لازم برای وصل شدن به درگاه بانکی به فرانت ارسال بشه. اما تابعی که برای اینکار وجود داره (redirect_gateway) هم کار ست کردن PaymentStatus رو انجام میده و هم اینکه برنامه رو به یک تابع دیگه برای گرفتن اطلاعات درگاه بانکی ریدایرکت میکنه.
که این ریدایرکت کردن باعث میشه نشه توی یک ایپیای responseای رو به کاربر برگردوند.
گفتم بپرسم آیا راهی برای انجام اینکار بدون تغییر کدها وجود داره؟
روشی که به ذهنم رسید برای حلش این بود که توی تابع redirect _gateway قسمت چک کردن و ست کردن PaymentStatus رو از قسمت ریدایرکت جدا کنم
و یک تابع فقط برای نشون دادن اطلاعات درگاه(به جای ریدایرکت کردن) به وجود بیارم
کدی شبیه به این:
`
def _prepare_redirect(self):
if (timezone.now() - self._bank.created_at).seconds > 120:
self._set_payment_status(PaymentStatus.EXPIRE_GATEWAY_TOKEN)
logging.debug("Redirect to bank expire!")
raise BankGatewayTokenExpired()
logging.debug("Redirect to bank")
self._set_payment_status(PaymentStatus.REDIRECT_TO_BANK)
def redirect_gateway(self):
"""کاربر را به درگاه بانک هدایت می کند"""
self._prepare_redirect()
return redirect(self.get_gateway_payment_url())
def create_gateway_payment(self):
self._prepare_redirect()
params = self._get_gateway_payment_parameter()
params.update({
'url': self._get_gateway_payment_url_parameter(),
'method': self._get_gateway_payment_method_parameter(),
})
return params
سلام وقت به خیر, بنده در حال استفاده از این پکیج هستم که در هنگام برگشت از درگاه ( IDPay ) با ارور زیر مواجه میشم
AttributeError at /bankgateways/callback/
"NoneType" object has no attribute "callback_url"
داخل بخش ادمین تمامی status ها به حالت Redirect To Bank هستند
ورژون جنگو پروژه من = 3.2.5
ورژن azbankgateways = 1.6.11
نکته: تمامی کدهای برنامهی من، حاصل کپی پیست کردن کد های قرار داده شده داخل صفحه ی این ماژول هست(و ترکیب با فیلم اموزشی)
سلا و خسته نباشید , مرسی از زحمات شما برای این پکیج عالی .
آیا راهی هست که urlهایی که پکیج به بانک میزنن رو تغییر داد ؟
برای ساخت اپ خودم نیاز هست که درگاه رو داشته باشم و از اونجایی برای گرفتن درگاه داستان های زیادی هست (مثل ای نماد, بالا آوردن روی سرور, و آی پی) میخوام پکیج شما رو روی banktest.ir تست بگیرم که یجورایی شبیه ساز هست برای درگاه ها .
و یا اگر راه دیگری هم میدونید خیلی کمک بزرگی میکنید مرسی از شما.
سلام وقتت بخیر خدا قوت من با جنگو یه فروشگاه آوردم بالا که درگاه بانک ملت رو بهش وصل کنم. همه چی اوکی هست اما وقتی تراکنش انجام میشه و میره تو تکمیل فرآیند خرید و برگشت به سایت خطای : Unmarshalling Error: For input string: "" رو میده و پولی که کسر شده به حساب برگشت می خوره.
از خود بانک ملت هم پرسیدم چیزی دستگیرم نشد.
@ali-zahedi
با سلام
آیا امکان استفاده از درگاه و مستندات nextpay.org هم موجود هست؟ اگر خیر، امکان افزوده شدنش هست؟ :(
*مدیریت پروسه وریفای شدن از درگاه ( به هر دلیلی ممکن است پروایدر در دسترس نباشد و پروسه با شکست و خطای ۵۰۰ مواجه شود)
اگر امکانی فراهم میشد که یکسری اطلاعات اضافه به اون ویو که به یوآرال که از سمت بانک برمیگردد ارسال کرد خیلی خوب میشد .
منظورم اینه مثلا وقتی ما داریم یه سبد خریدو پرداخت میکنیم، اون کاربر رو بعد بازگشت از پرداخت به یه صفحه دیگه میخوایم هدایت کنیم که بعد کلیک یه گزینه ای دوباره بتونه برگرده به همون سبد خرید
اگه بشه این امکان خیلی خوب میشه
سلام. من میخام یه درگاه پرداخت IDPay ایجاد کنم. قسمت فرانت با ریاکت نوشته شده و قسمت بکاند با جنگو رست. لینک نسخه کوچیک شده رو برای حالت تست پایین گذاشتم.
ابتدا url های جنگو رو به اینصورت نوشتم(دقیقا همونایی که توی داکیومنتیشن هست):
...
path('go-to-gateway/', views.go_to_gateway_view),
...
و به view ها دست نزدم(فقط مبلغ رو از سمت فرانت میخونه)
توی قسمت فرانت، در خواست رو به صورت زیر به url بالا میفرستم(یه button گذاشتم، که submit میشه):
const data = {
order_id: 1010,
amount: 321000,
callback: "https://google.com",
};
const response = await axios.post("go-to-gateway/", data)
بعد url نهایی پرداخت رو از خروجی response میگیرم:
url = response.request.responseURL
که مثلا همچین چیزی هست:
https://idpay.ir/p/ws-sandbox/7c6a31ca872446e24a55506dab57a134
و بعد میفرستمش به درگاه پرداخت نهایی:
window.location.replace(url)
ظاهرا که درست کار میکنه لااقل در حالت آزمایشی(sandbox=1). هنوز با حالت واقعی امتحان نکردم. لینک گیتلب پروژه هم اینجا گذاشتم(اخیرا دیگه فیلتر نیست!):
https://gitlab.com/dotdjango/payment.git
خواستم بدون که این روش درسته؟ لطفا کدها رو چک کنین چون ممکنه خیلیا بخوان اینجوری استفاده کنن.
سپاس
سلام من دارم یه پلتفرم آموزشی با جنگو می نویسم و می خواهم با خرید دوره توسط کاربر و پرداخت توسط یک بار پرداخت درصدی مشخصی از همان یک پرداخت به حساب صاحب پلتفرم آموزشی بره و بقیش به حساب مدرس مورد نظر بره چطور می توانم این رو پیاده سازی کنم لطفاً راهنمایی بفرمایید حتی کوچک از شما ممنون می شوم
درود وقت بخیر
گاهی اوقات زمان ساخت لینک درگاه به این ارور میخورم, قسمتی هست که بتونم timeout درخواستو بیشتر کنم؟
HTTPSConnectionPool(host='[www.zarinpal.com](http://www.zarinpal.com/)', port=443): Read timed out. (read timeout=5)
Traceback (most recent call last):
File "/project/app/payment/views.py", line 60, in request_payment
factory.auto_create()
File "/usr/local/lib/python3.12/site-packages/azbankgateways/bankfactories.py", line 63, in auto_create
raise BankGatewayAutoConnectionFailed(errors_msg)
azbankgateways.exceptions.exceptions.BankGatewayAutoConnectionFailed: HTTPSConnectionPool(host='[www.zarinpal.com](http://www.zarinpal.com/)', port=443): Read timed out. (read timeout=5)
سلام،
با خوندن کد برام یکم ابهام پیش اومده...
توی مرحله اولیه وقتی که کاربر رو به درگاه بانک هدایت میکنیم وضعیت تراکنش در حالت "Redirect to bank"
قرار میگیره...
توی مرحله بعد کاربر از درگاه بانک برمیگرده و ریدایرکت میشه به بکند و طبق کدی که خودتون قرار دادید
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("پرداخت با موفقیت انجام شد.")
بررسی میکنیم که آیا وضعیت این تراکنش در دیتابیس is_success
یا همون Completed
هست یا نه...
حالا سوال من اینه که دقیقا کی وضعیت تراکنش رو Completed
قرار میدیم و روی دیتابیس کوعری میزنیم و آپدیت میکنیم؟؟؟؟
سلام و عرض خستهنباشید!
معذرت میخوام آقای زاهدی @ali-zahedi امکانش هست راهنمایی کنید؟
ارور با کد ۲۴ برای درگاه پرداخت بانک ملت در پکیج شما پوشش داده نشده.
اطلاعات مربوط به فایل و کد مورد نظرم رو براتون مشخص کردم.
path: /azbankgateways/banks/mellat.py
hello mr.zahedi @ali-zahedi and thanks for you package!
sir, the response with code 24 is not covered in your mellat.py file. can you pleaes help me how to fix this?
best wishes for you...
version using:
az-iranian-bank-gateways==1.9.0
سلام
خیلی عالی بود!
فقط اگر امکان داره بانک سپه رو هم اضافه کنید!!
باتشکر...
سلام، خسته نباشید.
من طبق آموزش برای بانک ملی تا مرحله ارسال به بانک پیش رفتم ولی وقتی ادرس پرداخت وارد میکنم به بانک منتقل میشم و خطای آدرس هدایت شده برای پرداخت ، در محدوده آدرس های اعلام شده از طرف پذیرنده نمی باشد . دریافت میکنم
ادرس آی پی و دامنه اعلام شده به بانک هم تغییر نکرده، به نظر شما مشکل از کجا میتونه باشه
من همه کار هارو کردم طبق مستندات و فیلم خودتون پیش رفتم اما
Reverse for '/callback-gateway/' not found. '/callback-gateway/' is not a valid view function or pattern name.
این ارور رو میکنم و به هر روشی امتحان میکنم باز ارور کالبک دارم چه کار باید بکنم؟
در قسمت ادد کردن بانک ارور داره. مشکل داره یا کار دیگه ای باید انجام بشه ممنون میشم راهنمایی کنید
سلام
دمتون گرم
اگه امکانش هست درگاه نکست پی رو هم بهش اضافه کنید
nextpay-ir
باتشکر
با سلام و خسته نباشید
لایبری خیلی عالی ای نوشتید و بسیار ازتون ممنونیم
من میخواستم که ابجکت های پرداخت ام به سبد خرید و یوزر ام متصل باشه و ForeignKey داشته باشه ولی کد رو که بررسی کردم دیدم در حال حاضر امکان پذیر نیست
میخواستم درخواست کنم اگر امکان اش هست کد مربوط به BankFactory , Bank رو به گونه ای تغیر بدیم که بشه مدل کاستوم شده نوشت و به factory.create()
پاس داد تا در زمان factory.ready()
از اون مدل استفاده کنه و بتونیم دیتاهای دیگه ای که نیاز داریم وابسته به پروژه رو توی مدل پرداخت نگه داریم
باتشکر
باسلام. تشکر بابت پکیج بسیار خوبتون. چگونه باید کاربر رو به درگاه پرداخت sandbox زرین پال هدایت کنیم؟ (برای تست درگاه پرداخت)
برای IDPAY کانفیگ X_SANDBOX در تنظیمات وجود داره ولی برای زرین پال چیزی ندیدم. ممنون میشم راهنمایی کنید.
BankGatewayStateInvalid
You change the status bank record before/after this record change status from redirect to bank. current status is تکمیل شده
هنگام خرید موفق این برخی مواقع خطای 400 برمیگردونه و این اروری هست که برمیگردونه.
سلام وقت بخیر اگر میشه درگاه paystarرو به کتابخونتون اضافه کنید اگر اطلاعاتی در مورد این درگاه خواستین من براتون میفرستم باتشکر
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.