You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django电商集成Stripe支付:无法传递购物车总额至charge函数

Django电商Stripe支付金额传递问题解决方法

问题根源

你的charge函数存在三个核心问题:

  1. 硬编码了扣款金额amount=50000000,未使用购物车实际总金额
  2. 重定向到success页面时引用的amount变量未定义
  3. 未处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:45:55