Python 提交剥离付款时可能出现的原因

Python 提交剥离付款时可能出现的原因,python,django,Python,Django,我正在为我的电子商务项目进行支付试用,它以前工作得非常好,现在突然,当我使用信用卡试用号码时,支付正在进行,订单已下达,但我收到一条消息,消息是发生了一个“严重错误。我们已收到通知。”付款视图中的最后一条消息。我正在试图找出可能导致这种情况的错误 以下是views.py: class PaymentView(View): def get(self, *args, **kwargs): # order order = Order.objects.get(us

我正在为我的电子商务项目进行支付试用,它以前工作得非常好,现在突然,当我使用信用卡试用号码时,支付正在进行,订单已下达,但我收到一条消息,消息是发生了一个
“严重错误。我们已收到通知。”
付款视图中的最后一条消息。我正在试图找出可能导致这种情况的错误

以下是views.py:

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 ! ")
            # Email when order is made
            template = render_to_string("payment_confirmation_email.html", {'first_name': self.request.user.first_name,
                                                                            'last_name': self.request.user.last_name,
                                                                            'order': order})

            msg = EmailMessage('Thanks for Purchasing', template,
                               settings.EMAIL_HOST_USER, [self.request.user.email])
            msg.content_subtype = "html"  # Main content is now text/html
            msg.fail_silently = False
            msg.send()

            # End of the email send
            return render(self.request, "order_completed.html", {'order': order})

        except stripe.error.CardError as e:
            body = e.json_body
            err = body.get('error', {})
            messages.warning(self.request, f"{err.get('message')}")
            # Since it's a decline, stripe.error.CardError will be caught
            return redirect("/")

        except stripe.error.RateLimitError as e:
            # Too many requests made to the API too quickly
            messages.warning(self.request, "Rate Limit Error")
            return redirect("/")

        except stripe.error.InvalidRequestError as e:
            # Invalid parameters were supplied to Stripe's API
            messages.warning(self.request, "Invalid Parameters")
            return redirect("/")

        except stripe.error.AuthenticationError as e:
            # Authentication with Stripe's API failed
            # (maybe you changed API keys recently)
            messages.warning(self.request, "Not Authenticated")
            return redirect("/")

        except stripe.error.APIConnectionError as e:
            # Network communication with Stripe failed
            messages.warning(self.request, "Network Error")
            return redirect("/")

        except stripe.error.StripeError as e:
            # Display a very generic error to the user, and maybe send
            # yourself an email
            messages.warning(
                self.request, "Something went wrong. You were not charged. Please Try Again.")
            return redirect("/")

        except Exception as e:
            # Something else happened, completely unrelated to Stripe
            # send an email to ourselves
            messages.warning(
                self.request, "A serious Error Occured. We have been notified.")
            return redirect("/")
这是模型

class Payment(models.Model):
    stripe_charge_id = models.CharField(max_length=50)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.SET_NULL, blank=True, null=True)
    amount = models.FloatField()
    timestamp = models.DateTimeField(auto_now_add=True)

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

如评论中所述,当出现意外异常时,最好是引发内部服务器错误(500),因为将这些错误分类为bug是合理的,一旦发现它们,就应该进行修复。这样,根据您的日志配置,您可以在服务器日志、给管理员的电子邮件通知或其他地方进行回溯。要实现此目的,只需删除:

except Exception as e:
    ...
除此之外,使用一个长的
try
语句是一种不好的做法,因为它会精确地导致您遇到的问题:当您得到“发生严重错误”时,很难确定错误在哪里。我不知道stripe,但我很确定您可以从
中排除大多数行,请尝试
。我怀疑所有来自条带的异常。错误只能在下面的行中提出:

charge = stripe.Charge.create( ... )
如果是这样,它应该是
try
中的唯一一行

如果情况并非如此,并且不同的行可能会产生不同的错误,请使用多个
try
语句。例如,代替

try:
    calculate_a() # may raise ErrorA
    calculate_b() # may raise ErrorB
except ErrorA:
    ...
except ErrorB:
    ...
写:

try:
    calculate_a() # may raise ErrorA
except ErrorA:
    ...
try:
    calculate_b() # may raise ErrorB
except ErrorB:
    ...

您收到了什么错误?我收到了一条错误消息
“发生了严重错误。我们已收到通知。”
付款视图中的最后一条消息扫描您记录引发的实际错误异常?您正在捕获该块中的所有异常,错误可能不在stripe中,但在您自己的代码中,此全局异常捕获是一个坏主意。如果发生未经处理的异常,最好使用500响应,并发送一封错误电子邮件,这样您就可以在邮件中收到实际问题的通知application@IainShelvington没有引发实际错误,付款后出现两条消息,第一条
“您的订单成功!”
第二条消息警告是“发生了严重错误。我们已收到通知。”
但是从管理员那里,尽管出现了错误消息,但付款显示已通过。