DoesNotExist в /buy_now_paid_done/ Запрос на сопоставление платежей не существует ⇐ Python
-
Anonymous
DoesNotExist в /buy_now_paid_done/ Запрос на сопоставление платежей не существует
Я реализовал веб-сайт электронной коммерции с интеграцией платежей razorpay, и когда я перехожу на страницу оформления заказа с товарами в корзине, вся логика работает правильно, но когда я нажимаю кнопку «Купить сейчас», а затем перенаправляю ее на «buynow_checkout.html» после этого я совершаю платеж, и платеж также проходит успешно, но после этого я получаю сообщение об ошибке:
Не существует в /buy_now_paying_done/ Запрос на сопоставление платежей не существует.
как это решить?
вот мой код: Кнопка «Купить сейчас» Купить
urls.py
path('buy_now/', login_required(views.BuyNow.as_view()), name='buy_now'), path("buy_now_pay_done/",views.buynow_pay_done, name='buynow_paid_done'), path('checkout/', login_required(views.checkout.as_view()), name='checkout'), path("Payment_done/",views.Payment_done, name='Payment_done'), view.py
импортировать uuid из django.shortcuts импорт рендеринга, перенаправления, get_object_or_404 из django.views импортировать Просмотр из сообщений импорта django.contrib из django.http импорт HttpResponseRedirect, JsonResponse, HttpResponse из настроек импорта django.conf из django.core.mail импорт send_mail из django.contrib.auth импорт аутентификации, входа в систему, выхода из системы из django.urls обратный импорт из django.contrib.auth.decorators импортировать login_required из django.utils.decorators импорт метод_декоратор из django.db.models импорт Q из импорта .forms * из импорта .models * импортная бритва проверка класса (Просмотр): защита get(сам,запрос): пользователь = запрос.пользователь add = Customer.objects.filter(пользователь=пользователь) cart_items = Cart.objects.filter(пользователь=пользователь) сумма = 0 для p в cart_items: значение = p.количество * p.продукт.цена со скидкой famount = famount+значение общая сумма = сумма + 40 razorpay_amount = int (общая сумма * 100) client = razorpay.Client(auth=("rzp_test_NqHIxmro5EHkHO", "PVE3M1msR3vfdwEcVlFuMWVX")) данные = {'сумма': razorpay_amount, 'валюта': 'INR', 'квитанция': 'order_rcptid_12', 'pay_capture': '1'} Payment_response = client.order.create(данные=данные) печать (платеж_ответ) # {'id': 'order_N4iaQ69zoA5v5s', 'entity': 'order', 'amount': 8900, 'amount_paid': 0, 'amount_due': 8900, 'currency': 'INR', 'receipt': 'order_rcptid_12 ', 'offer_id': нет, 'статус': 'создано', 'попытки': 0, 'примечания': [], 'created_at': 1700917770} order_id = Payment_response['id'] статус_заказа = ответ_платежа['статус'] если order_status == 'создано': оплата = оплата( пользователь = пользователь, сумма = общая сумма, razorpay_order_id=order_id, razorpay_pay_status=order_status, ) оплата.сохранить() если request.user.is_authenticated: total_item_in_cart = len(Cart.objects.filter(user=request.user)) вернуть рендер (запрос, 'app/checkout.html', locals()) @login_required защита Payment_done (запрос): # бритва order_id = request.GET.get('order_id') Payment_id = request.GET.get('Payment_id') custid = request.GET.get('custid') print(order_id, pay_id, custid) пользователь = запрос.пользователь клиент = Customer.objects.get(id=custid) платеж = Payment.objects.get(razorpay_order_id=order_id) платеж.оплата = Истина платеж.razorpay_pay_id = идентификатор_платежа оплата.сохранить() корзина = Cart.objects.filter(пользователь=пользователь) для cart_item в корзине: заказ = OrderPlaced(пользователь=пользователь, клиент=клиент, продукт=cart_item.product, количество=cart_item.quantity, оплата=оплата) заказ.сохранить() корзину_item.delete() messages.success(request, f'Платеж успешен, ваш заказ размещен.') # возвращаем HttpResponseRedirect(redirect_url) вернуть перенаправление («заказы») класс BuyNow(Просмотр): def get(сам, запрос): Product_id = request.GET.get('prod_id') продукт = get_object_or_404 (Продукт, идентификатор = Product_id) пользователь = запрос.пользователь адрес = Customer.objects.filter(пользователь=пользователь) # Выполните расчеты или получите дополнительную информацию, если это необходимо. # Например: скидка_цена = товар.скидка_цена доставка_сумма = 40,00 общая_сумма = цена_со скидкой + сумма_доставки razorpay_amount = int(total_amount * 100) client = razorpay.Client(auth=("rzp_test_NqHIxmro5EHkHO", "PVE3M1msR3vfdwEcVlFuMWVX")) данные = {'сумма': razorpay_amount, 'валюта': 'INR', 'квитанция': 'order_rcptid_12', 'pay_capture': '1'} Payment_response = client.order.create(данные=данные) печать (платеж_ответ) order_id = Payment_response['id'] статус_заказа = ответ_платежа['статус'] если order_status == 'создано': оплата = оплата( пользователь = пользователь, сумма = общая_сумма, razorpay_order_id=order_id, razorpay_pay_status=order_status, ) оплата.сохранить() если request.user.is_authenticated: total_item_in_cart = len(Cart.objects.filter(user=request.user)) return render(request, 'app/buynow_checkout.html', { «продукт»: продукт, 'скидка_цена': скидка_цена, 'сумма_доставки': сумма_доставки, 'Общая сумма': Общая сумма, 'razorpay_amount':razorpay_amount, 'адрес': адрес, 'total_item_in_cart':total_item_in_cart, «платеж»: Payment.id }) # возвращаем рендер(запрос, 'app/buynow.html') @login_required защита buynow_paynow_done (запрос): # бритва order_id = request.GET.get('order_id') Payment_id = request.GET.get('Payment_id') custid = request.GET.get('custid') print(order_id, pay_id, custid) пользователь = запрос.пользователь клиент = Customer.objects.get(id=custid) # платеж = get_object_or_404(Платеж, razorpay_order_id=order_id) платеж = Payment.objects.get(razorpay_order_id=order_id) платеж.оплата = Истина платеж.razorpay_pay_id = идентификатор_платежа оплата.сохранить() Product_id = request.GET.get('prod_id') продукт = get_object_or_404 (Продукт, идентификатор = Product_id) заказ = OrderPlaced(пользователь=пользователь, клиент=клиент, продукт=продукт, оплата=платеж) заказ.сохранить() messages.success(request, f'Платеж успешен, ваш заказ размещен.') # возвращаем HttpResponseRedirect(redirect_url) вернуть перенаправление («заказы») checkout.html
Оплатить с помощью Razorpay {% блокирует платежный шлюз %} {% комментарий %} razorpay{% endcomment %} варианты вар = { "key": 'rzp_test_NqHIxmro5EHkHO', // Введите идентификатор ключа, сгенерированный на панели мониторинга. "amount": "{{ razorpay_amount }}", // Сумма указана в денежных единицах. Валюта по умолчанию – INR. Следовательно, 50 000 означает 50 000 пайсов. "валюта": "индийская рупия", "name": "Tech - Store Ecomm", "description": "Тестовая транзакция", "order_id": "{{order_id}}", //Это пример идентификатора заказа. Передайте идентификатор, полученный в ответе на шаге 1. "обработчик": функция (ответ){ var form = document.getElementById('Payment_form') window.location.href = `http://127.0.0.1:8000/Payment_done?orde ... m.elements["custid"].value} ` }, "тема": { "цвет": "#1f19e0" } }; вар rzp1 = новый Razorpay (варианты); rzp1.on('pay.failed', функция (ответ){ предупреждение(ответ.ошибка.описание); }); document.getElementById('rzp-button1').onclick = function(e){ рзп1.открыть(); е.preventDefault(); } {% платежный шлюз endblock %} buynow_checkout.html
Оплатить с помощью Razorpay {% блокирует платежный шлюз %} {% комментарий %} razorpay{% endcomment %} варианты вар = { "key": 'rzp_test_NqHIxmro5EHkHO', // Введите идентификатор ключа, сгенерированный на панели мониторинга. "amount": "{{ razorpay_amount }}", // Сумма указана в денежных единицах. Валюта по умолчанию – INR. Следовательно, 50 000 означает 50 000 пайсов. "валюта": "индийская рупия", "name": "Tech - Store Ecomm", "description": "Тестовая транзакция", "order_id": "{{order_id}}", //Это пример идентификатора заказа. Передайте идентификатор, полученный в ответе на шаге 1. "обработчик": функция (ответ){ var form = document.getElementById('buynow_paid_form') console.log(response.razorpay_order_id); window.location.href = `http://127.0.0.1:8000/buy_now_pay_done? ... m.elements["custid"].value} ` }, "тема": { "цвет": "#1f19e0" } }; вар rzp1 = новый Razorpay (варианты); rzp1.on('pay.failed', функция (ответ){ предупреждение(ответ.ошибка.описание); }); document.getElementById('rzp-button2').onclick = function(e){ рзп1.открыть(); е.preventDefault(); } {% платежный шлюз endblock %} models.py
# Создайте здесь свои модели. Профиль класса (модели.Модель): пользователь = модели.OneToOneField(Пользователь, on_delete=models.CASCADE) is_email_verified = models.BooleanField(по умолчанию=False) email_token = models.CharField(max_length=100, null=True, пусто=True) ignore_password_token = models.CharField(max_length=100, default="") созданный_at = models.DateTimeField(auto_now_add=True) защита __str__(сам): вернуть self.user.username класс Клиент(модели.Модель): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) имя = модели.CharField(max_length=200) locality = models.CharField(max_length=200) город = модели.CharField(max_length=50) телефон = модели.IntegerField() почтовый индекс = модели.IntegerField() состояние = модели.CharField(выбор=STATE_CHOICES, max_length=50) защита __str__(сам): вернуть ул (self.id) CATEGORY_CHOICES = ( («М», «Мобильный»), («Л», «Ноутбук»), («ТВ», «ТВ»), («W», «Смотри»), («ФГ», «Холодильник»), («EP», «Наушник»), («ПР», «Принтер»), («TW», «Верхняя одежда»), («ЧБ», «Нижняя одежда»), ) класс Продукт(модели.Модель): title = models.CharField(max_length=100) продажа_цена = модели.FloatField() Discounted_price = models.FloatField() описание = модели.TextField() бренд = models.CharField(max_length=100) категория = модели.CharField(выбор=CATEGORY_CHOICES, max_length=12) Product_image = models.ImageField(upload_to='productimg') защита __str__(сам): вернуть ул (self.id) Корзина класса (модели.Модель): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) продукт = модели.ForeignKey(Продукт, on_delete=models.CASCADE) количество = модели.PositiveIntegerField(по умолчанию=1) защита __str__(сам): вернуть ул (self.id) @свойство защита total_cost(self): вернуть self.quantity * self.product.discounted_price STATUS_CHOICES = ( («Принято», «Принято»), («Упакованный», «Упакованный»), («В пути», «В пути»), («Доставлено», «Доставлено»), («Отмена», «Отмена»), ) # для платежного шлюза razorpay класс Оплата(модели.Модель): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) сумма = модели.FloatField() razorpay_order_id = models.CharField(max_length=100,blank=True,null=True) razorpay_pay_status = models.CharField(max_length=100,blank=True,null=True) razorpay_pay_id = models.CharField(max_length=100,blank=True,null=True) оплачено = models.BooleanField(по умолчанию=False) класс OrderPlaced(models.Model): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) клиент = модели.ForeignKey(Клиент, on_delete=models.CASCADE) продукт = модели.ForeignKey(Продукт, on_delete=models.CASCADE) количество = модели.PositiveIntegerField(по умолчанию=1) order_date = models.DateTimeField(auto_now_add=True) status = models.CharField(max_length=50, choice=STATUS_CHOICES, default='Заказ размещен') платеж = models.ForeignKey(Payment, on_delete=models.CASCADE, default="") @свойство защита total_cost(self): вернуть self.quantity * self.product.discounted_price
Я реализовал веб-сайт электронной коммерции с интеграцией платежей razorpay, и когда я перехожу на страницу оформления заказа с товарами в корзине, вся логика работает правильно, но когда я нажимаю кнопку «Купить сейчас», а затем перенаправляю ее на «buynow_checkout.html» после этого я совершаю платеж, и платеж также проходит успешно, но после этого я получаю сообщение об ошибке:
Не существует в /buy_now_paying_done/ Запрос на сопоставление платежей не существует.
как это решить?
вот мой код: Кнопка «Купить сейчас» Купить
urls.py
path('buy_now/', login_required(views.BuyNow.as_view()), name='buy_now'), path("buy_now_pay_done/",views.buynow_pay_done, name='buynow_paid_done'), path('checkout/', login_required(views.checkout.as_view()), name='checkout'), path("Payment_done/",views.Payment_done, name='Payment_done'), view.py
импортировать uuid из django.shortcuts импорт рендеринга, перенаправления, get_object_or_404 из django.views импортировать Просмотр из сообщений импорта django.contrib из django.http импорт HttpResponseRedirect, JsonResponse, HttpResponse из настроек импорта django.conf из django.core.mail импорт send_mail из django.contrib.auth импорт аутентификации, входа в систему, выхода из системы из django.urls обратный импорт из django.contrib.auth.decorators импортировать login_required из django.utils.decorators импорт метод_декоратор из django.db.models импорт Q из импорта .forms * из импорта .models * импортная бритва проверка класса (Просмотр): защита get(сам,запрос): пользователь = запрос.пользователь add = Customer.objects.filter(пользователь=пользователь) cart_items = Cart.objects.filter(пользователь=пользователь) сумма = 0 для p в cart_items: значение = p.количество * p.продукт.цена со скидкой famount = famount+значение общая сумма = сумма + 40 razorpay_amount = int (общая сумма * 100) client = razorpay.Client(auth=("rzp_test_NqHIxmro5EHkHO", "PVE3M1msR3vfdwEcVlFuMWVX")) данные = {'сумма': razorpay_amount, 'валюта': 'INR', 'квитанция': 'order_rcptid_12', 'pay_capture': '1'} Payment_response = client.order.create(данные=данные) печать (платеж_ответ) # {'id': 'order_N4iaQ69zoA5v5s', 'entity': 'order', 'amount': 8900, 'amount_paid': 0, 'amount_due': 8900, 'currency': 'INR', 'receipt': 'order_rcptid_12 ', 'offer_id': нет, 'статус': 'создано', 'попытки': 0, 'примечания': [], 'created_at': 1700917770} order_id = Payment_response['id'] статус_заказа = ответ_платежа['статус'] если order_status == 'создано': оплата = оплата( пользователь = пользователь, сумма = общая сумма, razorpay_order_id=order_id, razorpay_pay_status=order_status, ) оплата.сохранить() если request.user.is_authenticated: total_item_in_cart = len(Cart.objects.filter(user=request.user)) вернуть рендер (запрос, 'app/checkout.html', locals()) @login_required защита Payment_done (запрос): # бритва order_id = request.GET.get('order_id') Payment_id = request.GET.get('Payment_id') custid = request.GET.get('custid') print(order_id, pay_id, custid) пользователь = запрос.пользователь клиент = Customer.objects.get(id=custid) платеж = Payment.objects.get(razorpay_order_id=order_id) платеж.оплата = Истина платеж.razorpay_pay_id = идентификатор_платежа оплата.сохранить() корзина = Cart.objects.filter(пользователь=пользователь) для cart_item в корзине: заказ = OrderPlaced(пользователь=пользователь, клиент=клиент, продукт=cart_item.product, количество=cart_item.quantity, оплата=оплата) заказ.сохранить() корзину_item.delete() messages.success(request, f'Платеж успешен, ваш заказ размещен.') # возвращаем HttpResponseRedirect(redirect_url) вернуть перенаправление («заказы») класс BuyNow(Просмотр): def get(сам, запрос): Product_id = request.GET.get('prod_id') продукт = get_object_or_404 (Продукт, идентификатор = Product_id) пользователь = запрос.пользователь адрес = Customer.objects.filter(пользователь=пользователь) # Выполните расчеты или получите дополнительную информацию, если это необходимо. # Например: скидка_цена = товар.скидка_цена доставка_сумма = 40,00 общая_сумма = цена_со скидкой + сумма_доставки razorpay_amount = int(total_amount * 100) client = razorpay.Client(auth=("rzp_test_NqHIxmro5EHkHO", "PVE3M1msR3vfdwEcVlFuMWVX")) данные = {'сумма': razorpay_amount, 'валюта': 'INR', 'квитанция': 'order_rcptid_12', 'pay_capture': '1'} Payment_response = client.order.create(данные=данные) печать (платеж_ответ) order_id = Payment_response['id'] статус_заказа = ответ_платежа['статус'] если order_status == 'создано': оплата = оплата( пользователь = пользователь, сумма = общая_сумма, razorpay_order_id=order_id, razorpay_pay_status=order_status, ) оплата.сохранить() если request.user.is_authenticated: total_item_in_cart = len(Cart.objects.filter(user=request.user)) return render(request, 'app/buynow_checkout.html', { «продукт»: продукт, 'скидка_цена': скидка_цена, 'сумма_доставки': сумма_доставки, 'Общая сумма': Общая сумма, 'razorpay_amount':razorpay_amount, 'адрес': адрес, 'total_item_in_cart':total_item_in_cart, «платеж»: Payment.id }) # возвращаем рендер(запрос, 'app/buynow.html') @login_required защита buynow_paynow_done (запрос): # бритва order_id = request.GET.get('order_id') Payment_id = request.GET.get('Payment_id') custid = request.GET.get('custid') print(order_id, pay_id, custid) пользователь = запрос.пользователь клиент = Customer.objects.get(id=custid) # платеж = get_object_or_404(Платеж, razorpay_order_id=order_id) платеж = Payment.objects.get(razorpay_order_id=order_id) платеж.оплата = Истина платеж.razorpay_pay_id = идентификатор_платежа оплата.сохранить() Product_id = request.GET.get('prod_id') продукт = get_object_or_404 (Продукт, идентификатор = Product_id) заказ = OrderPlaced(пользователь=пользователь, клиент=клиент, продукт=продукт, оплата=платеж) заказ.сохранить() messages.success(request, f'Платеж успешен, ваш заказ размещен.') # возвращаем HttpResponseRedirect(redirect_url) вернуть перенаправление («заказы») checkout.html
Оплатить с помощью Razorpay {% блокирует платежный шлюз %} {% комментарий %} razorpay{% endcomment %} варианты вар = { "key": 'rzp_test_NqHIxmro5EHkHO', // Введите идентификатор ключа, сгенерированный на панели мониторинга. "amount": "{{ razorpay_amount }}", // Сумма указана в денежных единицах. Валюта по умолчанию – INR. Следовательно, 50 000 означает 50 000 пайсов. "валюта": "индийская рупия", "name": "Tech - Store Ecomm", "description": "Тестовая транзакция", "order_id": "{{order_id}}", //Это пример идентификатора заказа. Передайте идентификатор, полученный в ответе на шаге 1. "обработчик": функция (ответ){ var form = document.getElementById('Payment_form') window.location.href = `http://127.0.0.1:8000/Payment_done?orde ... m.elements["custid"].value} ` }, "тема": { "цвет": "#1f19e0" } }; вар rzp1 = новый Razorpay (варианты); rzp1.on('pay.failed', функция (ответ){ предупреждение(ответ.ошибка.описание); }); document.getElementById('rzp-button1').onclick = function(e){ рзп1.открыть(); е.preventDefault(); } {% платежный шлюз endblock %} buynow_checkout.html
Оплатить с помощью Razorpay {% блокирует платежный шлюз %} {% комментарий %} razorpay{% endcomment %} варианты вар = { "key": 'rzp_test_NqHIxmro5EHkHO', // Введите идентификатор ключа, сгенерированный на панели мониторинга. "amount": "{{ razorpay_amount }}", // Сумма указана в денежных единицах. Валюта по умолчанию – INR. Следовательно, 50 000 означает 50 000 пайсов. "валюта": "индийская рупия", "name": "Tech - Store Ecomm", "description": "Тестовая транзакция", "order_id": "{{order_id}}", //Это пример идентификатора заказа. Передайте идентификатор, полученный в ответе на шаге 1. "обработчик": функция (ответ){ var form = document.getElementById('buynow_paid_form') console.log(response.razorpay_order_id); window.location.href = `http://127.0.0.1:8000/buy_now_pay_done? ... m.elements["custid"].value} ` }, "тема": { "цвет": "#1f19e0" } }; вар rzp1 = новый Razorpay (варианты); rzp1.on('pay.failed', функция (ответ){ предупреждение(ответ.ошибка.описание); }); document.getElementById('rzp-button2').onclick = function(e){ рзп1.открыть(); е.preventDefault(); } {% платежный шлюз endblock %} models.py
# Создайте здесь свои модели. Профиль класса (модели.Модель): пользователь = модели.OneToOneField(Пользователь, on_delete=models.CASCADE) is_email_verified = models.BooleanField(по умолчанию=False) email_token = models.CharField(max_length=100, null=True, пусто=True) ignore_password_token = models.CharField(max_length=100, default="") созданный_at = models.DateTimeField(auto_now_add=True) защита __str__(сам): вернуть self.user.username класс Клиент(модели.Модель): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) имя = модели.CharField(max_length=200) locality = models.CharField(max_length=200) город = модели.CharField(max_length=50) телефон = модели.IntegerField() почтовый индекс = модели.IntegerField() состояние = модели.CharField(выбор=STATE_CHOICES, max_length=50) защита __str__(сам): вернуть ул (self.id) CATEGORY_CHOICES = ( («М», «Мобильный»), («Л», «Ноутбук»), («ТВ», «ТВ»), («W», «Смотри»), («ФГ», «Холодильник»), («EP», «Наушник»), («ПР», «Принтер»), («TW», «Верхняя одежда»), («ЧБ», «Нижняя одежда»), ) класс Продукт(модели.Модель): title = models.CharField(max_length=100) продажа_цена = модели.FloatField() Discounted_price = models.FloatField() описание = модели.TextField() бренд = models.CharField(max_length=100) категория = модели.CharField(выбор=CATEGORY_CHOICES, max_length=12) Product_image = models.ImageField(upload_to='productimg') защита __str__(сам): вернуть ул (self.id) Корзина класса (модели.Модель): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) продукт = модели.ForeignKey(Продукт, on_delete=models.CASCADE) количество = модели.PositiveIntegerField(по умолчанию=1) защита __str__(сам): вернуть ул (self.id) @свойство защита total_cost(self): вернуть self.quantity * self.product.discounted_price STATUS_CHOICES = ( («Принято», «Принято»), («Упакованный», «Упакованный»), («В пути», «В пути»), («Доставлено», «Доставлено»), («Отмена», «Отмена»), ) # для платежного шлюза razorpay класс Оплата(модели.Модель): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) сумма = модели.FloatField() razorpay_order_id = models.CharField(max_length=100,blank=True,null=True) razorpay_pay_status = models.CharField(max_length=100,blank=True,null=True) razorpay_pay_id = models.CharField(max_length=100,blank=True,null=True) оплачено = models.BooleanField(по умолчанию=False) класс OrderPlaced(models.Model): пользователь = модели.ForeignKey(Пользователь, on_delete=models.CASCADE) клиент = модели.ForeignKey(Клиент, on_delete=models.CASCADE) продукт = модели.ForeignKey(Продукт, on_delete=models.CASCADE) количество = модели.PositiveIntegerField(по умолчанию=1) order_date = models.DateTimeField(auto_now_add=True) status = models.CharField(max_length=50, choice=STATUS_CHOICES, default='Заказ размещен') платеж = models.ForeignKey(Payment, on_delete=models.CASCADE, default="") @свойство защита total_cost(self): вернуть self.quantity * self.product.discounted_price