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 = { AZ_IRANIAN_BANK_GATEWAYS = {
'GATEWAYS': { "GATEWAYS": {
'ZARINPAL': { "ZARINPAL": {
'MERCHANT_CODE': 'Merchant-Code', "MERCHANT_CODE": "",
'SANDBOX': True, "SANDBOX": 0,
} },
}, },
'IS_SAMPLE_FORM_ENABLE': True, "IS_SAMPLE_FORM_ENABLE": True,
'DEFAULT_BANK': 'ZARINPAL', "DEFAULT": "ZARINPAL",
'CURRENCY': 'IRR', "CURRENCY": "IRT",
'TRACKING_CODE_QUERY_PARAM': 'tc', "TRACKING_CODE_QUERY_PARAM": "tc",
'BANK_PRIORITIES': ['ZARINPAL'], "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 account.views import CustomTokenObtainPairView
from home.views import HomeView from home.views import HomeView
from .views import FakeAdminLoginView from .views import FakeAdminLoginView
from azbankgateways.urls import az_bank_gateways_urls
admin.autodiscover()
urlpatterns = [ urlpatterns = [
@@ -29,6 +32,7 @@ urlpatterns = [
path('blogs/', include('blog.urls')), path('blogs/', include('blog.urls')),
path('order/', include('order.urls')), path('order/', include('order.urls')),
path('home/', include('home.urls')), path('home/', include('home.urls')),
path("bankgateways/", az_bank_gateways_urls()),
path('', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), 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): def __str__(self):
return f'({self.product}) - ({self.order.user})' 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.contrib import admin
from django.urls import path, include from django.urls import path, include
from .views import CartItemViews, CartView, OrderlistView, CartItemClear, ApplyDiscountView from .views import CartItemViews, CartView, OrderlistView, CartItemClear, ApplyDiscountView
from .views import PaymentView, callback_view
urlpatterns = [ urlpatterns = [
path('all', OrderlistView.as_view(), name='order-list'), path('all', OrderlistView.as_view(), name='order-list'),
@@ -9,6 +10,6 @@ urlpatterns = [
path('cart/discount', ApplyDiscountView.as_view()), path('cart/discount', ApplyDiscountView.as_view()),
path('cart/all', CartItemClear.as_view()), path('cart/all', CartItemClear.as_view()),
path('cart/item/<int:pk>', CartItemViews.as_view(), name='change-item-cart'), path('cart/item/<int:pk>', CartItemViews.as_view(), name='change-item-cart'),
# path('payment', CartView.as_view()), path('payment', PaymentView.as_view(), name='payment'),
# path('', CartView.as_view()), path('callback', callback_view, name='callback-gateway'),
] ]
+49 -51
View File
@@ -7,13 +7,15 @@ from rest_framework.permissions import IsAuthenticated
from .serializers import * from .serializers import *
# from cart.models import # from cart.models import
from rest_framework import status from rest_framework import status
from .models import OrderItemModel, OrderModel, DiscountCode from .models import OrderItemModel, OrderModel, DiscountCode, PaymentModel
from .permissons import CanDeleteCartItemPermissions from .permissons import CanDeleteCartItemPermissions
from azbankgateways import bankfactories, models as bank_models
from azbankgateways.exceptions import AZBankGatewaysException
try: try:
pass pass
except DiscountNotAvailableError: except DiscountNotAvailableError:
pass pass
from django.urls import reverse
""" """
add post 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): class PaymentView(APIView):
# def post(self, request): def post(self, request):
# amount = request.data.get('amount') amount = 10000000
# user = request.user 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)
bank_record = bank.ready()
# factory = bankfactories.ZarinpalBankFactory() return Response(bank.redirect_gateway().url)
# try: except AZBankGatewaysException as e:
# bank = factory.create( print(e)
# amount=amount, return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)
# user=user, return Response({'gateway_url': bank.redirect_url}, status=status.HTTP_200_OK)
# 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)
# 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')
# payment = Payment.objects.get(id=payment_id)
# bank_type = payment.bank_type
# factory = bankfactories.BankFactory.get_bank(bank_type) from django.views.decorators.csrf import csrf_exempt
# try: from rest_framework.decorators import api_view
# result = factory.verify_transaction(tracking_code) from rest_framework.response import Response
# if result.is_success: from azbankgateways import bankfactories, models as bank_models
# payment.status = 'Paid'
# payment.tracking_code = tracking_code @csrf_exempt
# payment.save() @api_view(['POST'])
# return Response({'status': 'Payment successful'}) def callback_view(request):
# else: tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None)
# payment.status = 'Failed' if not tracking_code:
# payment.save() logging.debug("این لینک معتبر نیست.")
# return Response({'status': 'Payment failed'}) raise Http404
# except Exception as e:
# return Response({'error': str(e)}) 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(
"پرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت."
)