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

如何在Django的Stripe结账会话中展示折扣与税费并修复报错

问题解决与实现方案

首先解决你遇到的TypeError错误,再实现Stripe结账表单中折扣与税费的可视化展示:

一、修复TypeError错误

错误原因是你在循环遍历多对多字段时,错误地使用了order.tax作为循环变量名,这被Python解析为试图直接赋值给order的tax多对多字段,违反了Django的多对多字段操作规则。

修正后的代码行:

# 计算总税率
total_tax_rate = sum(tax.rate for tax in order.tax.all()) if order.tax.exists() else 0
# 计算总折扣金额
total_discount_amount = sum(discount.amount for discount in order.discount.all()) if order.discount.exists() else 0

二、实现Stripe结账表单的折扣与税费可视化

要在Stripe结账页面可视化展示这些信息,不能仅依赖metadata(仅后台可见),需要利用Stripe官方支持的tax_rates和discounts参数,将订单的税费、折扣同步到Checkout Session中。

完整修改后的视图代码

class CreateCheckoutSessionOrderView(View):
    def get(self, request, *args, **kwargs):
        order_id = self.kwargs["order_id"]
        DOMAIN: str = 'http://127.0.0.1:8000'
        order = Order.objects.get(id=order_id)
        
        # 计算总税率和总折扣金额(已修正变量名)
        total_tax_rate = sum(tax.rate for tax in order.tax.all()) if order.tax.exists() else 0
        total_discount_amount = sum(discount.amount for discount in order.discount.all()) if order.discount.exists() else 0

        # 初始化Stripe会话参数
        session_params = {
            'payment_method_types': ['card'],
            'line_items': [],
            'payment_intent_data': {
                'metadata': {
                    'order_id': order.id,
                },
            },
            'mode': 'payment',
            'success_url': DOMAIN + '/success/',
            'cancel_url': DOMAIN + '/cancel/',
        }

        # 计算商品基础金额(转Stripe分单位)
        base_amount = sum(item.price for item in order.items.all()) * 100
        # 计算折扣后的金额
        discounted_amount = base_amount - int(total_discount_amount * 100) if total_discount_amount > 0 else base_amount

        # 构建主商品line item
        line_item = {
            'price_data': {
                'currency': 'usd',
                'unit_amount': discounted_amount,
                'product_data': {
                    'name': str(order),
                },
            },
            'quantity': 1,
        }

        # 添加税费配置(若有税费)
        if total_tax_rate > 0:
            # 创建Stripe税率对象(频繁使用的话建议提前在Stripe后台创建并复用ID)
            tax_rate = stripe.TaxRate.create(
                display_name="订单税费",
                description="订单适用税费",
                jurisdiction="US",  # 根据实际地区修改
                percentage=total_tax_rate,
                inclusive=False,  # 税费不包含在商品价格中,与你的计算逻辑匹配
            )
            line_item['tax_rates'] = [tax_rate.id]
            # 同步税费信息到metadata
            session_params['payment_intent_data']['metadata'].update({
                'tax_rate': total_tax_rate,
                'tax_name': "订单税费"
            })

        session_params['line_items'].append(line_item)

        # 添加折扣配置(若有折扣)
        if total_discount_amount > 0:
            # 创建Stripe固定金额优惠券
            coupon = stripe.Coupon.create(
                amount_off=int(total_discount_amount * 100),
                currency="usd",
                name="订单折扣",
            )
            session_params['discounts'] = [{"coupon": coupon.id}]
            # 同步折扣信息到metadata
            session_params['payment_intent_data']['metadata'].update({
                'discount_amount': total_discount_amount,
                'discount_name': "订单折扣"
            })

        # 创建Stripe结账会话
        session = stripe.checkout.Session.create(**session_params)

        return JsonResponse({'id': session.id})

关键说明

  1. 税费展示逻辑:

    • 通过Stripe的TaxRate对象定义税率,关联到line item后,结账页面会自动计算并显示税费金额、税率信息。
    • 设置inclusive=False确保税费在商品价格外额外添加,与你get_total_cost()的计算逻辑一致。
  2. 折扣展示逻辑:

    • 通过Stripe的Coupon对象创建固定金额折扣,添加到会话的discounts参数后,结账页面会显示折扣金额和优惠券名称。
  3. 金额一致性:

    • 先计算折扣后的商品金额,再应用税费,完全匹配你订单模型中的成本计算逻辑,避免金额偏差。

优化建议

  • 如果订单包含多个商品,建议循环遍历OrderItem添加单独的line item,这样结账页面会展示每个商品的明细,更直观。
  • 常用税率可提前在Stripe后台创建,直接复用其ID,避免每次请求都创建新的TaxRate对象。
  • 若你的Discount模型支持百分比折扣,可修改Coupon创建逻辑为percent_off参数实现。

内容的提问来源于stack exchange,提问作者Alan Dzheliev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:22:05