【问题标题】:unable to show success page after completion of payment支付完成后无法显示成功页面
【发布时间】:2021-10-11 01:22:18
【问题描述】:

我正在为我的学习电子商务项目使用 razorpay 支付网关 Web 集成,一切正常支付都可以完成我想要的只是在使用测试模式在我的订单模型中完成支付后存储一些信息

我的views.py 用于结帐

 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,})

所以付款完成后的错误是什么,我想显示 html 页面并更改 db 中的状态,但付款完成后,handlerequest throwinh me http 505 错误

@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") 

知道我在处理请求视图中做错了什么

订购型号

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)
            

【问题讨论】:

    标签: python django django-models django-class-based-views razorpay


    【解决方案1】:

    问题不在于您的视图,而在于您的模型的保存方法。 在其他部分你什么都不做。你应该打电话给super。

    请修改保存功能,然后尝试:

    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)
    

    【讨论】:

    • 现在抛出错误我什至无法保存数据
    • 不允许的方法 (POST):/PlaceInstantly 不允许的方法:/PlaceInstantly [18/Aug/2021 19:03:32] "POST /PlaceInstantly HTTP/1.1" 405 0
    • 不允许的方法 (POST):/PlaceInstantly 不允许的方法:/PlaceInstantly [18/Aug/2021 19:03:32] "POST /PlaceInstantly HTTP/1.1" 405 0
    • 你能发布完整的堆栈跟踪吗?
    • 我不能 此页面无法正常工作如果问题仍然存在,请联系网站所有者。 HTTP ERROR 405 仅通过我添加我的 html 和 url 的方式向我显示此页面
    【解决方案2】:

    在你的 post 方法中,在你分配之后

    order.razorpay_order_id = razorpay_order['id']

    你需要保存它。好像没了。

    【讨论】:

    • 我试过 order.save() 但没有保存
    • 你检查过order和orderitem是否在db中创建了吗?简而言之,atomic_transaction 区块成功了吗?
    • 但是所有 razorpay 的东西都变成了空白
    • 奇怪!您可以在order.razorpay_order_id = razorpay_order['id'] 行之前打印订单的值吗? order_id 在您的模型中是唯一的,但我对您的保存方法有疑问。你也可以把你的原子事务代码放在一个 try catch 块中。
    • 你会建议什么
    【解决方案3】:

    在您的结帐视图中

    def get(self, request, *args, **kwargs):
            order = Order.objects.get(pk = self.kwargs['order'])
            settings = SiteSettings.objects.all().first()
    
    
            # Razorpay client auth
            client = razorpay.Client(auth = (settings.razorpay_client_id, settings.razorpay_secret))
            
            if order.razorpay_order_id is None:    
                order_amount = order.total*100
                order_currency = settings.currency
                order_receipt = 'Reciept'
                notes = {'id': order.id, 'email': order.email_id, 'date':str(datetime.now()), 'amount': order.total, 'is_ios': order.is_ios, 'is_android': order.is_android}   # OPTIONAL
                data = {"amount":order_amount, "currency":order_currency, "receipt":order_receipt, "notes":notes, "payment_capture":'0'}
                razorpay_order = client.order.create(data = data)
    
                # Razorpay order inserted into database order
                order.razorpay_order_id = razorpay_order["id"]
                order.save()
    
            else:
                razorpay_order = client.order.fetch(order.razorpay_order_id)
    
    
            return render(request, self.template_name, {'settings':settings, 'order':order, 'razorpay_order': razorpay_order})
    
        def post(self, request, *args, **kwargs):
            o = self.kwargs['order']+ ' POST'
            
            settings = SiteSettings.objects.all().first()
            return render(request, self.template_name, {'settings':settings, 'order':o})
    

    在你的处理程序中

        settings    = SiteSettings.objects.all().first()
        order       = Order.objects.get(id=request.POST.get('order_id'))
    
        #Razorpay authentication
        client = razorpay.Client(auth = (settings.razorpay_client_id, settings.razorpay_secret))
        
        #Razorpay transaction details
        razorpay_transaction_details = { 
            'razorpay_order_id':    request.POST.get('razorpay_order_id'),
            'razorpay_payment_id':  request.POST.get('razorpay_payment_id'),
            'razorpay_signature':   request.POST.get('razorpay_signature')
        }
    
        #Razorpay payment verification
        client.utility.verify_payment_signature(razorpay_transaction_details)
            
        #Razorpay capture payment Make sure you change this accordingly.
        payment_transaction_details = client.payment.capture(razorpay_transaction_details['razorpay_payment_id'], order.total*100, {"currency":"payment_currency"})
        order.order_description     = payment_transaction_details
        order.status                = 'paid'
        order.save()
    
    
        context = {'request': request.POST, 'order': order, 'settings':settings, 'UserData':UserData, 'Password': Password}
    
        return render(request, 'web/rpay-success.html', context)
    

    您可以在其中包装一个 try except 块以呈现失败。

    【讨论】:

    • 我想你没有注意到我也在我的模型中发布了一些数据,那么我如何在我的模型中发布这些数据
    • 请问我正在寻找错误代码中的问题是什么
    • 我不想复制别人的代码希望你能理解
    • 您好,我非常感谢您选择不公然复制粘贴,但我发送的代码是一个关于如何做到这一点的千篇一律的示例,发布的代码本身不会起作用,它只会跟随razorpay 提供的文档,你需要根据自己的业务逻辑进行调整。
    猜你喜欢
    • 2013-01-24
    • 2021-10-07
    • 2013-03-21
    • 2021-03-31
    • 1970-01-01
    • 2013-07-28
    • 2022-01-11
    • 2013-05-14
    • 2019-02-24
    相关资源
    最近更新 更多