如何在Stripe中通过循环动态生成checkout的多个line_items参数
Stripe Checkout动态生成多个line_items的实现方法
你之前操作报错的核心原因有两个:一是stripe.checkout.Session.create()是同步接口,调用时就会直接把参数提交给Stripe服务器,调用完成后再修改参数完全不会生效,还会触发参数校验错误;二是直接在方法参数的列表内部写循环语法不符合Python的语法规则,无法生成你要的结构。
正确的操作方式是在调用接口前,提前构造完整的line_items列表,再将构造好的列表直接传入参数即可,修改后的参考代码如下:
def create_checkout_session(request): if request.method == "GET": try: cart = Cart.objects.get(order_user=request.user) # 初始化空的line_items列表 line_items = [] # 遍历你的业务数据源生成对应条目,此处以购物车关联的商品条目为例 for item in cart.cartitem_set.all(): # 替换为你实际的购物车商品关联字段名 current_item = { 'price_data': { 'currency': 'eur', 'product_data': { 'name': item.product.name, # 替换为你实际的商品名称字段 # 可按需添加描述、图片等可选字段 # 'description': item.product.description, # 'images': [item.product.cover_image_url] }, # Stripe要求金额为货币最小单位的整数,欧元最小单位为分,所以需乘以100后转整数 'unit_amount': int(item.product.price * 100), }, 'quantity': item.buy_count, # 替换为你实际的商品购买数量字段 } line_items.append(current_item) # 将构造完成的line_items直接传入接口 checkout_session = stripe.checkout.Session.create( payment_method_types=['card', 'p24'], line_items=line_items, # 补全你原本需要的其他参数,例如: success_url="https://你的域名/payment/success?session_id={CHECKOUT_SESSION_ID}", cancel_url="https://你的域名/payment/cancel", mode="payment" ) # 此处保留你原本的后续业务逻辑
注意事项
- 单位转换:务必确认
unit_amount的单位是对应货币的最小单位,除了欧元外,美元、人民币等也遵循同样规则,避免金额错误 - 数据类型:不需要手动把line_items转换成JSON字符串,直接传入Python原生的字典列表即可,Stripe SDK会自动完成序列化
- 适配业务:如果你的业务不需要关联购物车商品,只需把for循环的遍历数据源换成你自己的动态对象列表即可,构造条目的逻辑通用
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

