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

Stripe Checkout Session自定义税费与折扣集成报错求助

Stripe Checkout Session 自定义税费与折扣问题解决方案

报错原因分析

当前代码中discounts参数格式不符合Stripe API要求:Stripe Checkout Session的discounts数组每个元素需通过coupon字段指定优惠券ID,而非discounts字段,这直接导致了Received unknown parameter: discounts[0][discounts]错误。

修正后的完整代码

class CreateCheckoutSessionOrderView(View):
    def get(self, request, *args, **kwargs):
        order_id = self.kwargs["order_id"]
        DOMAIN: str = 'http://127.0.0.1:8000'
        
        # 处理订单不存在的异常
        try:
            order = Order.objects.get(id=order_id)
        except Order.DoesNotExist:
            return JsonResponse({'error': '订单不存在'}, status=404)
        
        tax_rates = []
        for tax in order.tax.all():
            tax_rate = stripe.TaxRate.create(
                display_name=tax.name,
                description=tax.name,
                percentage=tax.rate,
                jurisdiction="RU",
                inclusive=False,
            )
            tax_rates.append(tax_rate.id)
        
        discounts = []
        for discount in order.discount.all():
            # 将折扣金额转换为分(Stripe要求最小货币单位)
            coupon = stripe.Coupon.create(
                amount_off=int(discount.amount * 100),
                duration='once',
                currency='usd',
                name=discount.name,
            )
            # 修正discounts参数格式
            discounts.append({'coupon': coupon.id})
        
        session = stripe.checkout.Session.create(
            payment_method_types=['card'],
            line_items=[
                {
                    'price_data': {
                        'currency': 'usd',
                        # 确保get_total_cost()返回未包含税费/折扣的金额,避免重复计算
                        'unit_amount': int(order.get_total_cost() * 100),
                        'product_data': {
                            'name': str(order),
                        },
                    },
                    'quantity': 1,
                    'tax_rates': tax_rates,  # 绑定税费率到商品条目
                },
            ],
            payment_intent_data={
                'metadata': {
                    'order_id': order.id,
                },
            },
            mode='payment',
            success_url=f"{DOMAIN}/success/",
            cancel_url=f"{DOMAIN}/cancel/",
            discounts=discounts,
        )
        return JsonResponse({'id': session.id})

代码审查建议

  • 避免重复创建资源:当前每次请求都新建TaxRate和Coupon,会产生大量冗余资源。建议提前创建这些资源并将ID存储到对应的Tax/Discount模型中,请求时直接读取ID即可。
  • 环境配置解耦:DOMAIN硬编码本地地址不利于生产环境切换,建议从环境变量或配置文件读取。
  • 金额逻辑校验:确保order.get_total_cost()返回的是未包含税费和折扣的原始金额,否则需调整unit_amount的计算逻辑,避免重复计费。
  • 异常处理完善:除了订单不存在的情况,还需捕获Stripe API调用可能抛出的异常(如网络错误、参数错误),返回友好的错误响应。
  • 代码可读性优化:可以将创建税费率、优惠券的逻辑封装为独立函数,减少视图函数的复杂度。

内容的提问来源于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.02 14:47:37