165 lines
5.8 KiB
Python
165 lines
5.8 KiB
Python
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) |