在结账文件中通过链接传递查询时获取客户ID值时出现值错误,我正在使用Razorpay支付网关

-1 投票
0 回答
21 浏览
提问于 2025-04-12 02:06

我在使用Django框架的时候,遇到了一个值错误,特别是在使用Razorpay支付网关的时候。这里有个图片说明

这是模型部分

class Payment(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    amount = models.FloatField()
    razorpay_order_id = models.CharField(max_length=100,blank = True , null = True)
    razorpay_payment_status = models.CharField(max_length=100,blank = True , null = True)
    razorpay_payment_id = models.CharField(max_length=100,blank = True , null = True)
    paid = models.BooleanField(default = False)

class OrderPlaced(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    #cid = models.ForeignKey(Payment,on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer,on_delete=models.CASCADE)
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    ordered_date = models.DateField(auto_now_add = True)
    status = models.CharField(max_length = 50,choices = STATUS_CHOICES,default = 'Pending')
    payment = models.ForeignKey(Payment, on_delete=models.CASCADE,default ="")
    @property
    def total_cost(self):
        return self.quantity*self.product.discounted_price

这是HTML代码

{% extends 'app/base.html' %}
{% load static %}
{% block title %}
  Buy Now
{% endblock %}
{% block main-content %}

<div class="container">
    {% if messages %}
        {% for msg in messages %}
            <div class="alert alert-denger" role="alert">
                {{msg}}
            </div>
        {% endfor %} 
    {% endif %}
    <div class="row mt-5">
        <div class="col-sm-6">
            <h4> Order Summery </h4>
            <hr>
            {% for item in cart_items  %}
                <div class="card mb-2">
                    <div class="card-body">
                        <h5> Product: {{item.product.title}}</h5>
                        <p>Quantity: {{item.quantity}} </p> 
                        <p class="fw-bold">Price: {{item.product.discounted_price}}</p>
                    </div>
                </div>
            {% endfor %}
            <p class="fw-bold"> Total Cost + Rs. 40 = {{totalamount}}</p>
            <small>Term and Conditions: Lorem ipsum dolor sit amet consectetur.</small>
        </div>
        <div class="col-sm-4 offset-sm-1">
            <h4>Select Shipping Address </h4>
            <hr>
            <form method="post" id="myform">
                {% csrf_token %}
                {% for ad in add %}
                    <div class="card">
                        <div class="card-body">
                            <h5>{{ad.name}}</h5>
                            <p> Mobile No.: {{ad.mobile}}</p>
                            <p>{{ad.locality}} {{ad.city}} {{ad.state}} - {{ad.zipcode}}</p>
                        </div>
                    </div>
                    <div class="form-check mt-2 mb-5">
                        <input class="form-check-input" type="radio" name="custid" id="custadd{{forloop.counter}}" value="{{ad.id}}">
                        <label class="form-check-label fw-bold" for="custadd{{forloop.counter}}">
                        Address:{{forloop.counter}}</label>
                    </div>
                {% endfor %}
                <div class="form-check mb-3">
                    <label for="totanount" class="form-label"> Total Amount</label>
                    <input type="number" class="form-control" name="totamount" value={{totalamount}} readonly>
                </div>
                <div class="text-end">
                     {% comment "" %} <button type="submit" class="btn btn-warning mt-3 px-5 fw-bold"> Continue </button>{% endcomment %}
                    <!--<div id="paypal-button-container"> </div>-->
                    <button id="rzp-button1" type="submit" class="btn btn-warning mt-3 ox-5 fw-bold" > Payment </button>
                    <br> <br> <br>
                </div>
            </form>
        </div>
    </div>
</div>

{% endblock main-content %}

{% block payment-gateway %}

<script>
    var options = {
        "key": "rzp_test_Xjdfwh2QHqbpcz",
        "amount": "50000",
        "currency": "INR",
        "name": "Raju General Shop",
        "description": "Get Best And Fresh Products",
        "order_id": "{{order_id}}",
        "handler": function (response){
            console.log("Success")
            var form = document.getElementById("myform");
            alert(response.razorpay_payment_id);
            alert(response.razorpay_order_id);
            alert(response.razorpay_signature);
            window.location.href = ' http://127.0.0.1:8000/paymentdone?order_id=${response.razorpay_order_id}&payment_id=${response.razorpay_payment_id}&cust_id=${form.elements["custid"].value}'

        },
        "theme": {
            "color": "#3399cc"
        }
    };
    var rzp1 = new Razorpay(options);
    rzp1.on('payment.failed', function (response){
           alert(response.error.code);
           alert(response.error.description);
           alert(response.error.source);
           alert(response.error.step);
           alert(response.error.reason);
           alert(response.error.metadata.order_id);
           alert(response.error.metadata.payment_id);
    });
    document.getElementById('rzp-button1').onclick = function(e){
        rzp1.open();
        e.preventDefault();
    }
    </script>


{% endblock payment-gateway %}


这是视图函数

class checkout(View):
    def get(self,request):
        user = request.user
        add = Customer.objects.filter(user=user)
        cart_items = Cart.objects.filter(user=user)
        amount=0
        for p in cart_items:
            value = p.quantity*p.product.discounted_price
            amount = amount + value
        totalamount = amount + 40
        razoramount = int(totalamount * 100)
        client = razorpay.Client(auth=(settings.RAZOR_KEY_ID, settings.RAZOR_KEY_SECRET))
        data = { "amount": razoramount, "currency": "INR", "receipt": "order_rcptid_12",  'payment_capture': 1 }
        payment_response = client.order.create(data=data)
        print(payment_response)
        order_id = payment_response['id']
        order_status = payment_response['status']
        print(order_id)
        if order_status == 'created':
            payment = Payment(
                user=user,
                amount=totalamount,
                razorpay_order_id=order_id,
                razorpay_payment_status=order_status
            )
            payment.save()
        return render(request,'app/checkout.html',locals())
    
def payment_done(request):
    order_id = request.GET.get('order_id')
    payment_id = request.GET.get('payment_id')
    cust_id = str(request.GET.get('cust_id'))
    user = request.user
    print("pid=",payment_id,"oid=",order_id)
    #Payment.objects.create(razorpay_order_id=order_id, razorpay_payment_id=payment_id, cust_id=cust_id)
    customer = Customer.objects.get(id=cust_id)
    payment = Payment.objects.get(razorpay_order_id=order_id)
    payment.paid = True
    payment.razorpay_payment_id = payment_id
    cart = Cart.objects.filter(user=user)
    payment.save()
    for c in cart:
        OrderPlaced(user=user,customer=customer,product=c.product,quantity=c.quantity,payment=payment).save()
        c.delete()
    return redirect('orders')


我想通过GET方法获取订单ID、客户ID、支付ID等信息,并在完成支付后把这些信息存储到数据库里。

请帮我解决这个错误。

0 个回答

暂无回答

撰写回答