Django+Stripe项目订单支付接口404错误排查求助
订单购买404错误排查与修复
直接原因:URL路径不匹配
你的404错误核心原因是路由定义与请求路径的尾斜杠不匹配:
- 在
urls.py中,订单结算路由定义为:
该路径不带尾斜杠(示例:path('order_checkout/<int:order_id>', CreateCheckoutSessionOrderView.as_view(), name='order_checkout'),/order_checkout/1)。 - 但模板JS中的请求路径是带尾斜杠的:
实际请求地址为fetch('/order_checkout/' + orderId)/order_checkout/1/,与路由规则不匹配,导致404。
修复方法(二选一,推荐第一种)
- 给路由规则添加尾斜杠,与请求路径统一:
path('order_checkout/<int:order_id>/', CreateCheckoutSessionOrderView.as_view(), name='order_checkout'), - 修改模板中的fetch路径,去掉尾斜杠:
fetch('/order_checkout' + orderId)
其他潜在问题修复
除了404,代码还有几处细节需要修正,避免后续功能异常:
1. Stripe会话订单名称错误
CreateCheckoutSessionOrderView中,product_data.name赋值的是函数对象而非字符串,需调用__str__方法:
'name': str(order), # 或 order.__str__()
2. 订单总价计算逻辑错误
当前Order.get_total_cost()未考虑OrderItem中的购买数量,应改为基于OrderItem的总价计算:
def get_total_cost(self): return sum(item.get_cost() for item in self.order_items.all())
3. 避免数据库查询异常
CreateCheckoutSessionOrderView中用Order.objects.get(id=order_id)会在订单不存在时抛出异常,替换为get_object_or_404更安全:
from django.shortcuts import get_object_or_404 # ... order = get_object_or_404(Order, id=order_id)
内容的提问来源于stack exchange,提问作者Alan Dzheliev
相关产品推荐
相关产品推荐

