【问题标题】:In Razorpay Payment Gateway, the order_amount is not been fetched. How can I get the amount?在 Razorpay 支付网关中,未获取 order_amount。我怎样才能得到金额?
【发布时间】:2021-11-15 14:24:27
【问题描述】:

当我使用 Razorpay 支付网关进行支付集成时,未从模型中获取 order_amount。 正如在 models.py 中看到的,有两种方法可以获得订单的总金额,但是尝试其中任何一种,order_amount 都没有发送任何正确的值,因此我被困在这里好几天了。

请帮忙。谢谢你

以下是错误的回溯:

Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\blink\myblink\onlineshopping\views.py", line 243, in payment
    order_amount = order.get_total * 100

Exception Type: TypeError at /shoppe/payment/
Exception Value: unsupported operand type(s) for *: 'method' and 'int'

Views.py:

#Payment Integration - Razorpay
@login_required
def payment(request):
    add = Address.objects.filter(default=True)
    order = Order.objects.filter(user=request.user).first()
    print(order) #order=admin
    client = razorpay.Client(auth=("XXX", "YYY"))
    if order.razorpay_order_id is None:
        order_id = order.order_id
        print(order_id) #order_id=1
        order_amount = order.get_total * 100
        print(order_amount)
        order_currency = 'INR'
        order_receipt = 'Rcpt'
        data = {"id": order_id, "amount": order_amount, "currency": order_currency, "receipt": order_receipt, "payment_capture": '1'}
        razorpay_order = client.order.create(data=data)

        # Razorpay order inserted into database order
        order.razorpay_order_id = razorpay_order["order_id"]
        order.save()

    else:
        razorpay_order = client.order.fetch(order.razorpay_order_id)
    return render(request, 'payment.html', {'razorpay_order': razorpay_order, 'add': add, 'order': order})

模型.py:

class Order(models.Model):
    order_id = models.IntegerField(primary_key=True, null=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField(default=timezone.now)
    ordered = models.BooleanField(default=False)
    # shipping_address = models.ForeignKey(Address, on_delete=models.CASCADE)
    # total_amount = models.FloatField(null=True)
    #Related to Razorpay
    razorpay_order_id = models.CharField(max_length=500, null=True, blank=True)
    razorpay_payment_id = models.CharField(max_length=500, null=True, blank=True)
    razorpay_signature = models.CharField(max_length=500, null=True, blank=True)

    objects = models.Manager()

    def __str__(self):
        return self.user.username

    def get_total(self):
        total = 0
        for order_item in self.items.all():
            total += order_item.get_final_price()
        return total

    def get_amount(self):
        return self.get_total()

【问题讨论】:

  • 这一行 ( order_amount = order.get_total * 100 ) 不正确,因为 order.get_total 是一种方法而不是它的返回值,因此出现了错误。所以你可以先得到像“x=order.get_total()”这样的返回值,然后是“order_amount=x*100”
  • 我已经做到了,按照你的要求,我不需要将金额乘以 100,它已经给出了实际值。
  • 但是,现在排队,razorpay_order = client.order.create(data=data);它抛出一个错误:Object of type Decimal is not JSON serializable
  • client.order.create(amount=order_amount,currency=order_currency,receipt=order_receipt, notes=notes)
  • @PavanKumarTS 现在,弹出窗口显示错误,Oops! Something went wrong. Invalid amount (should be passed in integer paise. Minimum value is 100 paise, i.e. ₹ 1)。窗户没有打开。而 order_amount=824350

标签: python django razorpay


【解决方案1】:

您必须将总价格字段更改为像这样的整数字段

total_amount = models.IntegerField(null=True)

或在您的视图中将其更改为整数字段,然后将其乘以 100

total_price = request.POST.get('paying_price')
total_item_price = json.loads(total_price)#for changing float field into integers

然后

amount=total_item_price*100

因为 razorpay 无法将浮点字段理解为值,所以您必须根据需要更改它,这可能会有所帮助

【讨论】:

  • 实际上,在 models 中,我已经注释掉了 total_amount 字段。我没有使用它。我如何使用 request.POST,因为我没有考虑表单值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2021-05-04
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2011-06-04
相关资源
最近更新 更多