Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unable to show success page after completion of payment

i am using razorpay payment gateway web integration for my learning eccomerce project everyhing work fine payment can be done all i want is to store some information after payment done in my order model using test mode

my views.py for checkout

 class Checkout_Pre(View):
        def post (self, request,):
            user = request.user
            address = Address.objects.filter(default=True, user=request.user)
            cart = request.session.get('cart')
            items = Item.get_items_by_id(list(cart.keys()))
            prefer = request.POST.get('payment')
            total_price = request.POST.get('paying_price')
            total_item_price = json.loads(total_price)
            with transaction.atomic():
                order = Order.objects.create(
                        user=user,
                        total_price=total_item_price,
                        address=address.first(),
                        method = prefer,
                        )
                for item in items:
                    item_order = OrderItem.objects.create(
                        order=order,
                        item=item,
                        size=cart.get(str(item.id)),
                        price=item.price,
                        )
                request.session['cart'] = {}   
            order_currency = 'INR'
    
            callback_url = 'http://'+ str(get_current_site(request))+"/handlerequest/"
            print(callback_url)
            notes = {'order-type': "Basic order from the coolbuy website", 'key':'value'}
            razorpay_order = razorpay_client.order.create(dict(amount=total_item_price*100, currency=order_currency, notes = notes, receipt=order.order_id, payment_capture='0'))
            print(razorpay_order['id'])
            order.razorpay_order_id = razorpay_order['id']
            order.save()
               
            return render(request, 'payment/razorpaypaymentsummary.html', {'order':order, 'order_id': razorpay_order['id'], 'orderId':order.order_id, 'final_price':total_item_price, 'razorpay_merchant_id':settings.razorpay_id, 'callback_url':callback_url,})

so what the error is after payment completion i want to show html page and change sttus in db but after payment completion the handlerequest throwinh me http 505 error

@csrf_exempt
def handlerequest(request):
    if request.method == "POST":
        try:
            payment_id = request.POST.get('razorpay_payment_id', '')
            order_id = request.POST.get('razorpay_order_id','')
            signature = request.POST.get('razorpay_signature','')
            params_dict = { 
            'razorpay_order_id': order_id, 
            'razorpay_payment_id': payment_id,
            'razorpay_signature': signature
            }
            try:
                order_db = Order.objects.get(razorpay_order_id=order_id)
            except:
                return HttpResponse("505 Not Found")
            order_db.razorpay_payment_id = payment_id
            order_db.razorpay_signature = signature
            order_db.save()
            result = razorpay_client.utility.verify_payment_signature(params_dict)
            if result==None:
                amount = order_db.total_amount * 100   #we have to pass in paisa
                try:
                    razorpay_client.payment.capture(payment_id, amount)
                    order_db.payment_status = 1
                    order_db.save()
                    return render(request, 'firstapp/payment/paymentsuccess.html',{'id':order_db.id})
                except:
                    order_db.payment_status = 2
                    order_db.save()
                    return render(request, 'firstapp/payment/paymentfailed.html')
            else:
                order_db.payment_status = 2
                order_db.save()
                return render(request, 'firstapp/payment/paymentfailed.html')
        except:
            return HttpResponse("505 not found") 

any idea what i am doing wrong here in my handlre request view

order model

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,)
    address = models.ForeignKey(Address, default= True, on_delete=models.CASCADE)
    status = models.IntegerField(choices = status_choices, default=1)
    method = models.CharField(max_length=50, blank=False,)
    total_price = models.FloatField(blank=False, default=0)
    payment_status = models.IntegerField(choices = payment_status_choices, default=3)
    order_id = models.CharField(unique=True, max_length=200, null=True, default=None) 
    datetime_of_payment = models.DateTimeField(default=timezone.now)
    created_at = models.TimeField(auto_now=True, editable=False)
    razorpay_order_id = models.CharField(max_length=1000, null=True, blank=True)
    razorpay_payment_id = models.CharField(max_length=1000, null=True, blank=True)
    razorpay_signature = models.CharField(max_length=1000, null=True, blank=True)

    def __str__(self):
        return self.user.username + " " + str(self.order_id)

    def save(self, *args, **kwargs):
            if self.order_id is None and self.datetime_of_payment:
                self.order_id = self.datetime_of_payment.strftime('ORDER%Y%m%dODR') 
                return super(Order,self).save(*args, **kwargs)
            
like image 612
Shreyash mishra Avatar asked Sep 03 '25 16:09

Shreyash mishra


1 Answers

The problem is not with your view but with the save method of your model. in the else part you are doing nothing. You should call the super generally.

Please modify the save function as below and then try :

def save(self, *args, **kwargs):
    if self.order_id is None and self.datetime_of_payment:
        self.order_id = self.datetime_of_payment.strftime('ORDER%Y%m%dODR') 
    return super(Order,self).save(*args, **kwargs)
like image 129
Sukhpreet Singh Avatar answered Sep 05 '25 07:09

Sukhpreet Singh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!