base of payment gateway

This commit is contained in:
Parsa Nazer
2025-03-13 22:26:17 +03:30
parent e76c0a663f
commit 6009c43345
7 changed files with 121 additions and 62 deletions
+15 -10
View File
@@ -240,15 +240,20 @@ AWS_S3_OBJECT_PARAMETERS = {
# ==============================================================================
AZ_IRANIAN_BANK_GATEWAYS = {
'GATEWAYS': {
'ZARINPAL': {
'MERCHANT_CODE': 'Merchant-Code',
'SANDBOX': True,
}
"GATEWAYS": {
"ZARINPAL": {
"MERCHANT_CODE": "",
"SANDBOX": 0,
},
},
'IS_SAMPLE_FORM_ENABLE': True,
'DEFAULT_BANK': 'ZARINPAL',
'CURRENCY': 'IRR',
'TRACKING_CODE_QUERY_PARAM': 'tc',
'BANK_PRIORITIES': ['ZARINPAL'],
"IS_SAMPLE_FORM_ENABLE": True,
"DEFAULT": "ZARINPAL",
"CURRENCY": "IRT",
"TRACKING_CODE_QUERY_PARAM": "tc",
"TRACKING_CODE_LENGTH": 16,
"SETTING_VALUE_READER_CLASS": "azbankgateways.readers.DefaultReader",
"BANK_PRIORITIES": [
"ZARINPAL",
],
"IS_SAFE_GET_GATEWAY_PAYMENT": False # better to be True
}
+4
View File
@@ -8,6 +8,9 @@ from product import views
from account.views import CustomTokenObtainPairView
from home.views import HomeView
from .views import FakeAdminLoginView
from azbankgateways.urls import az_bank_gateways_urls
admin.autodiscover()
urlpatterns = [
@@ -29,6 +32,7 @@ urlpatterns = [
path('blogs/', include('blog.urls')),
path('order/', include('order.urls')),
path('home/', include('home.urls')),
path("bankgateways/", az_bank_gateways_urls()),
path('', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
]
+24
View File
@@ -0,0 +1,24 @@
# Generated by Django 5.1.2 on 2025-03-13 16:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0014_alter_orderitemmodel_price'),
]
operations = [
migrations.CreateModel(
name='Payment',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount', models.PositiveIntegerField()),
('status', models.CharField(default='Pending', max_length=50)),
('tracking_code', models.CharField(blank=True, max_length=100)),
('bank_type', models.CharField(max_length=100)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
]
@@ -0,0 +1,17 @@
# Generated by Django 5.1.2 on 2025-03-13 16:28
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('order', '0015_payment'),
]
operations = [
migrations.RenameModel(
old_name='Payment',
new_name='PaymentModel',
),
]
+10
View File
@@ -120,3 +120,13 @@ class OrderItemModel(models.Model):
def __str__(self):
return f'({self.product}) - ({self.order.user})'
#TODO complate this shit
class PaymentModel(models.Model):
amount = models.PositiveIntegerField()
status = models.CharField(max_length=50, default='Pending')
tracking_code = models.CharField(max_length=100, blank=True)
bank_type = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return 'payment'
+3 -2
View File
@@ -2,6 +2,7 @@ from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from .views import CartItemViews, CartView, OrderlistView, CartItemClear, ApplyDiscountView
from .views import PaymentView, callback_view
urlpatterns = [
path('all', OrderlistView.as_view(), name='order-list'),
@@ -9,6 +10,6 @@ urlpatterns = [
path('cart/discount', ApplyDiscountView.as_view()),
path('cart/all', CartItemClear.as_view()),
path('cart/item/<int:pk>', CartItemViews.as_view(), name='change-item-cart'),
# path('payment', CartView.as_view()),
# path('', CartView.as_view()),
path('payment', PaymentView.as_view(), name='payment'),
path('callback', callback_view, name='callback-gateway'),
]
+48 -50
View File
@@ -7,13 +7,15 @@ from rest_framework.permissions import IsAuthenticated
from .serializers import *
# from cart.models import
from rest_framework import status
from .models import OrderItemModel, OrderModel, DiscountCode
from .models import OrderItemModel, OrderModel, DiscountCode, PaymentModel
from .permissons import CanDeleteCartItemPermissions
from azbankgateways import bankfactories, models as bank_models
from azbankgateways.exceptions import AZBankGatewaysException
try:
pass
except DiscountNotAvailableError:
pass
from django.urls import reverse
"""
add post
@@ -113,61 +115,57 @@ class OrderlistView(APIView):
# from rest_framework.views import APIView
# from rest_framework.response import Response
# from rest_framework import status
# from azbankgateways import bankfactories, models as bank_models
# class PaymentView(APIView):
# def post(self, request):
# amount = request.data.get('amount')
# user = request.user
class PaymentView(APIView):
def post(self, request):
amount = 10000000
user_mobile_number = request.user.phone
factory = bankfactories.BankFactory()
try:
bank = (
factory.create(bank_models.BankType.ZARINPAL)
)
bank.set_request(request)
bank.set_amount(amount)
# payment = Payment.objects.create(amount=amount, bank_type='ZARINPAL')
bank.set_client_callback_url(request.build_absolute_uri(reverse("callback-gateway")))
bank.set_mobile_number(user_mobile_number)
# factory = bankfactories.ZarinpalBankFactory()
# try:
# bank = factory.create(
# amount=amount,
# user=user,
# callback_url='http://.com/callback/',
# reference_model=payment,
# )
# bank.ready()
# return Response({'gateway_url': bank.redirect_url}, status=status.HTTP_200_OK)
# except Exception as e:
# return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)
bank_record = bank.ready()
return Response(bank.redirect_gateway().url)
except AZBankGatewaysException as e:
print(e)
return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)
return Response({'gateway_url': bank.redirect_url}, status=status.HTTP_200_OK)
# from django.views.decorators.csrf import csrf_exempt
# from rest_framework.decorators import api_view
# from rest_framework.response import Response
# from azbankgateways import bankfactories, models as bank_models
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
from rest_framework.response import Response
from azbankgateways import bankfactories, models as bank_models
# @csrf_exempt
# @api_view(['POST'])
# def callback_view(request):
# tracking_code = request.POST.get('tracking_code')
# payment_id = request.POST.get('payment_id')
@csrf_exempt
@api_view(['POST'])
def callback_view(request):
tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None)
if not tracking_code:
logging.debug("این لینک معتبر نیست.")
raise Http404
# payment = Payment.objects.get(id=payment_id)
# bank_type = payment.bank_type
try:
bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code)
except bank_models.Bank.DoesNotExist:
logging.debug("این لینک معتبر نیست.")
raise Http404
# factory = bankfactories.BankFactory.get_bank(bank_type)
# try:
# result = factory.verify_transaction(tracking_code)
# if result.is_success:
# payment.status = 'Paid'
# payment.tracking_code = tracking_code
# payment.save()
# return Response({'status': 'Payment successful'})
# else:
# payment.status = 'Failed'
# payment.save()
# return Response({'status': 'Payment failed'})
# except Exception as e:
# return Response({'error': str(e)})
if bank_record.is_success:
return HttpResponse("پرداخت با موفقیت انجام شد.")
return HttpResponse(
"پرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت."
)