Django电商集成Stripe支付:无法传递购物车总额至charge函数
Django电商Stripe支付金额传递问题解决方法
问题根源
你的charge函数存在三个核心问题:
- 硬编码了扣款金额
amount=50000000,未使用购物车实际总金额 - 重定向到success页面时引用的
amount变量未定义 - 未处理Stripe的金额单位要求(Stripe要求传入最小货币单位的整数,比如PKR需将金额乘以100,因为1PKR=100派沙)
修复步骤
1. 修正charge函数逻辑
修改views.py中的charge函数,替换硬编码金额,正确获取购物车总金额并转换单位,同时定义重定向所需变量:
def charge(request): data = cartData(request) order = data['order'] # 转换为Stripe要求的最小货币单位整数(PKR需乘以100) stripe_amount = int(order.get_cart_total * 100) # 用于前端显示的格式化金额 display_amount = round(order.get_cart_total, 2) if request.method == 'POST': print('Data:', request.POST, 'amount: ', order.get_cart_total) try: customer = stripe.Customer.create( email=request.POST['email'], name=request.POST['nickname'], source=request.POST['stripeToken'], ) charges = stripe.Charge.create( customer=customer, amount=stripe_amount, # 使用转换后的正确金额 currency='pkr', description='cardPayment' ) # 支付成功后标记订单为完成 order.complete = True order.save() except stripe.error.StripeError as e: # 处理支付错误,返回错误页面 return render(request, 'payment_error.html', {'error_msg': str(e)}) # 重定向到成功页面并传递金额 return redirect(reverse('success', args=[display_amount]))
2. 确保cartData正确获取未完成订单
检查utils.py中的cartData函数,确保它能为登录用户和访客正确返回未完成订单(complete=False),这是获取正确购物车金额的前提:
# utils.py核心逻辑示例 def cartData(request): if request.user.is_authenticated: customer = request.user.customer order, created = Order.objects.get_or_create(customer=customer, complete=False) items = order.orderitem_set.all() cartItems = order.get_cart_items else: # 处理访客购物车,从cookie读取数据 cookie_data = cookieCart(request) cartItems = cookie_data['cartItems'] order = cookie_data['order'] items = cookie_data['items'] return {'cartItems': cartItems, 'order': order, 'items': items}
3. 修复success页面金额显示
调整successMsg函数,确保金额显示格式正确:
def successMsg(request, args): amount = float(args) # 格式化为两位小数的金额字符串 formatted_amount = f"{amount:.2f}" return render(request, 'success.html', {'amount': formatted_amount})
4. 前端表单安全提示(重要)
不要依赖前端传递金额,所有金额计算都在后端完成,避免用户篡改前端数据。支付表单只需收集Stripe令牌、邮箱和用户名即可,金额完全从后端订单中获取。
额外注意事项
- 测试时使用Stripe官方测试卡号(如
4242 4242 4242 4242)验证流程 - 支付失败时需给用户明确的错误提示
- 确保订单支付完成后标记为
complete=True,防止重复扣款
内容的提问来源于stack exchange,提问作者Talha Noor
相关产品推荐
相关产品推荐

