Django:在PayPal上执行支付后,如何通过Ajax将网站重定向到另一个页面

2024-05-16 13:55:20 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的电子商务项目中,当用户向购物车添加项目并通过PayPal执行付款时,PayPal窗口将打开,提交付款后窗口将关闭,但网站页面仍保留到付款页面,其中购物车中仍有项目,因为页面未刷新

因此,我的问题是如何设置ajax javascript以将网站页面重定向到另一个名为“order_completed.html”的链接,该链接是我使用已执行订单详细信息设置的,而不是从脚本向买家显示成功消息

再详细一点,更清楚一点

我试着添加

                // similar behavior as an HTTP redirect
                window.location.replace("/");

这就是所发生的事情,它将我返回到主页而不刷新,但这仍然不是我试图做的,我试图做的是在视图中呈现以下内容:

return render(request, "order_completed.html", {'order': order})

这样我就可以为成功购买添加订单参考号

我不知道如何做到这一点

以下是views.html:

def payment_complete(request):
    body = json.loads(request.body)
    order = Order.objects.get(
        user=request.user, ordered=False, id=body['orderID'])
    payment = Payment(
        user=request.user,
        stripe_charge_id=body['payID'],
        amount=order.grand_total()
    )
    payment.save()

    # assign the payment to order
    order.payment = payment
    order.ordered = True
    order.ref_code = create_ref_code()
    order.save()
    messages.success(request, "Your Order was Successful ! ")
    return render(request, "order_completed.html", {'order': order})


class PaymentView(View):
    def get(self, *args, **kwargs):
        # order
        order = Order.objects.get(user=self.request.user, ordered=False)
        if order.billing_address:
            context = {
                'order': order,
                'DISPLAY_COUPON_FORM': False
            }
            return render(self.request, "payment.html", context)
        else:
            messages.warning(
                self.request, "You have not added a billing address")
            return redirect("core:checkout")

    # `source` is obtained with Stripe.js; see https://stripe.com/docs/payments/accept-a-payment-charges#web-create
    # -token
    def post(self, *args, **kwargs):
        order = Order.objects.get(user=self.request.user, ordered=False)
        token = self.request.POST.get('stripeToken')
        amount = int(order.grand_total() * 100)

        try:
            charge = stripe.Charge.create(
                amount=amount,  # cents
                currency="usd",
                source=token,
            )
            # create payment
            payment = Payment()
            payment.stripe_charge_id = charge['id']
            payment.user = self.request.user
            payment.amount = order.grand_total()
            payment.save()

            # assign the payment to the order

            order_items = order.items.all()
            order_items.update(ordered=True)
            for item in order_items:
                item.save()

            order.ordered = True
            order.payment = payment
            order.ref_code = create_ref_code()
            order.save()

            messages.success(self.request, "Your Order was Successful ! ")
            return render(self.request, "order_completed.html", {'order': order})

以下是PayPal脚本:

  <!--Paypal Script-->
  <script>
    // Render the PayPal button into #paypal-button-container
    function getCookie(name) {
      var cookieValue = null;
      if (document.cookie && document.cookie !== "") {
        var cookies = document.cookie.split(";");
        for (var i = 0; i < cookies.length; i++) {
          var cookie = cookies[i].trim();
          // Does this cookie string begin with the name we want?
          if (cookie.substring(0, name.length + 1) === name + "=") {
            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
            break;
          }
        }
      }
      return cookieValue;
    }

    var csrftoken = getCookie("csrftoken");
    var orderID = "{{order.id}}";
    var amount = "{{order.grand_total|floatformat:2}}";
    var url = "{% url 'core:payment_complete' %}";

    paypal.Buttons({
      style: {
        color: "blue",
        shape: "pill",
        label: "pay",
        height: 40,
      },
        // Set up the transaction
        createOrder: function(data, actions) {
            return actions.order.create({
                purchase_units: [{
                    amount: {
                        value: amount,
                    }
                }]
            });
        },

        // Finalize the transaction
        onApprove: function(data, actions) {
            return actions.order.capture().then(function(details) {
                console.log(details);
                sendData();
                function sendData() {
                  fetch(url, {
                    method: "POST",
                    headers: {
                      "Content-type": "application/json",
                      "X-CSRFToken": csrftoken,
                    },
                    body: JSON.stringify({ orderID: orderID, payID: details.id }),
                  });
                }
                // Show a success message to the buyer
                alert('Transaction completed by ' + details.payer.name.given_name + '!');
            });
        }


    }).render('#paypal-button-container');
  </script>
  <!--Paypal Script-->

Tags: thenameselfidreturncookierequestvar