Files
avto-cargo--wisdom--backend/core/apps/payment/views.py
2025-09-16 21:30:23 +05:00

165 lines
5.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import hashlib
import uuid
from payme.views import PaymeWebHookAPIView, PaymeTransactions
from payme import Payme
from django.conf import settings
from rest_framework.generics import GenericAPIView
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, permissions
from core.apps.orders.models import Order
from core.apps.payment.serializers import PaymentSerializer, VisaPaymentSerializer, PaymeSerializer
from core.services.payment import Atmos
payme = Payme(settings.PAYME_ID)
# def get_client_ip(request):
# x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
# if x_forwarded_for:
# ip = x_forwarded_for.split(",")[0]
# else:
# ip = request.META.get("REMOTE_ADDR")
# return ip
class AtmosCallbackApiView(APIView):
authentication_classes = []
permission_classes = []
def post(self, request):
# client_ip = get_client_ip(request)
# if client_ip not in settings.ALLOWED_ATMOS_IPS:
# return Response({"status": 0, "message": "IP ruxsat etilmagan"}, status=403)
data = request.data
if not data:
return Response(
{'success': 0, "message": "Request body required"},
status=status.HTTP_200_OK
)
store_id = data.get("store_id")
transaction_id = data.get("transaction_id")
invoice = data.get("invoice")
amount = data.get("amount")
sign = data.get("sign")
check_string = f"{store_id}{transaction_id}{invoice}{amount}{settings.API_KEY}"
generated_sign = hashlib.md5(check_string.encode()).hexdigest()
if generated_sign != sign:
return Response(
{"status": 0, "message": f"Инвойс с номером {invoice} отсутствует в системе"},
status=status.HTTP_200_OK
)
try:
order = Order.objects.get(order_number=invoice)
except Order.DoesNotExist:
return Response(
{"status": 0, "message": f"Инвойс с номером {invoice} отсутствует в системе"},
status=status.HTTP_200_OK
)
order.is_paid = True
order.save()
return Response(
{"status": 1, "message": "Успешно"},
status=status.HTTP_200_OK
)
class PaymentGenerateLinkApiView(GenericAPIView):
serializer_class = PaymentSerializer
queryset = None
permission_classes = [permissions.IsAuthenticated]
def post(self, request):
serializer = self.serializer_class(data=request.data)
if not serializer.is_valid():
return Response({'success': False, 'message': serializer.errors}, status=400)
data = serializer.validated_data
service = Atmos()
res = service.create_transaction(data['price'], data['order_number'])
link = service.generate_url(res['transaction_id'], 'https://wisdom.uz')
return Response(
{"success": True, "url": link},
status=200
)
class VisaMastercardPaymentApiView(GenericAPIView):
queryset = None
permission_classes = [permissions.IsAuthenticated]
serializer_class = VisaPaymentSerializer
def post(self, request):
serializer = self.serializer_class(data=request.data)
if not serializer.is_valid():
return Response({'success': False, 'message': serializer.errors}, status=400)
data = serializer.validated_data
service = Atmos()
res = service.global_payment(
account=data.get('order_number'),
request_id=str(uuid.uuid4()),
amount=data.get('amount'),
)
return Response({'success': True, 'link': res})
class PaymeCallBackAPIView(PaymeWebHookAPIView):
def handle_created_payment(self, params, result, *args, **kwargs):
"""
Handle the successful payment. You can override this method
"""
print(f"Transaction created for this params: {params} and cr_result: {result}")
def handle_successfully_payment(self, params, result, *args, **kwargs):
"""
Handle the successful payment. You can override this method
"""
transaction = PaymeTransactions.get_by_transaction_id(
transaction_id=params['id']
)
order = Order.objects.get(id=transaction.id)
order.is_paid = True
order.save()
print(f"Transaction successfully performed for this params: {params} and performed_result: {result}")
def handle_cancelled_payment(self, params, result, *args, **kwargs):
"""
Handle the cancelled payment. You can override this method
"""
transaction = PaymeTransactions.get_by_transaction_id(
transaction_id=params['id']
)
if transaction.state == PaymeTransactions.CANCELED:
order = Order.objects.get(id=transaction.id)
order.is_paid = False
order.save()
print(f"Transaction cancelled for this params: {params} and cancelled_result: {result}")
class PayPaymeApiView(GenericAPIView):
serializer_class = PaymeSerializer
permission_classes = [permissions.IsAuthenticated]
queryset = Order.objects.all()
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
order_id = serializer.validated_data.get('order_id')
order = Order.objects.get(id=order_id)
payment_link = payme.initializer.generate_pay_link(
id=order_id,
amount=order.total_price * 100,
return_url="https://wisdom.uz",
)
return Response({'success': True, 'link': payment_link}, status=200)