@@ -1230,3 +1230,6 @@ msgstr "Ошибка сообщения" msgid "Message errors" msgstr "Ошибки сообщения" + +msgid "The payer does not exist" +msgstr "Плательщик не существует" @@ -0,0 +1,6 @@ +from django.utils.translation import gettext as _ + + +class PayerNotFound(Exception): + def __str__(self) -> str: + return _('The payer does not exist') @@ -9,6 +9,7 @@ from yookassa.domain.models.payment_data.response.payment_data_bank_card import ) from authentication.models import CustomUserModel +from payments.exceptions.payer_not_found import PayerNotFound from payments.models.payment import Payment as PaymentModel from payments.models.payment_plan import PaymentPlan from payments.selectors.payment_method_selector import PaymentMethodSelector @@ -68,7 +69,10 @@ class PaymentService: @classmethod def confirm_payment(cls, payment_id: UUID): payment = YookassaPayment.find_one(str(payment_id)) - user = CustomUserModel.objects.get(uid=payment.description) + try: + user = CustomUserModel.objects.get(uid=payment.description) + except CustomUserModel.DoesNotExist: + raise PayerNotFound if payment.status == 'waiting_for_capture': YookassaPayment.capture(str(payment_id)) elif payment.status == 'succeeded': @@ -21,6 +21,7 @@ from rest_framework.views import APIView from authentication.permissions import IsAnonymous, IsTelegramAirBot from authentication.selectors.user_selector import UserSelector from payments.exceptions.PlanIsFree import PlanIsFree +from payments.exceptions.payer_not_found import PayerNotFound from payments.models import Invoice from payments.models.payment import Payment, PaymentPlan from payments.permissions import IsAllowedToPay @@ -166,10 +167,12 @@ class PaymentConfirmationAPIView(APIView): permission_classes = (IsAnonymous,) def post(self, request, *args, **kwargs): - """Endpoint for payment service (Yookassa) WebHook. Hook happens after sucessful payment.""" + """Endpoint for payment service (Yookassa) WebHook. Hook happens after successful payment.""" try: PaymentPlanService.handle_success_payment(self.request) return Response(status=status.HTTP_200_OK) + except PayerNotFound as err: + return Response({'detail': str(err)}, status=status.HTTP_400_BAD_REQUEST) except Exception as err: logger.exception(err) return Response({'detail': {str(err)}}, status=status.HTTP_400_BAD_REQUEST)