仅将一种产品从 Django 传递到 Stripe 结账

Passing only one product to Stripe checkout from Django

我已经将 Django 与 Stripe 集成在一起,看起来工作正常。但是我在条带结帐页面中显示所有产品时遇到问题。我需要告诉 stripe 我们要购买哪些产品。如果我的购物车中有 2 件产品,我在条带结帐中只看到一件产品。

views.py

def payments_stripe(request):
    YOUR_DOMAIN = "http://127.0.0.1:8000/orders"
    print(request.body)
    body = json.loads(request.body)
    cart = Cart.objects.get(cart_id=_cart_id(request))
    cart_items = cartItem.objects.filter(cart=cart, is_active=True)
    print(cart_items)
    order = Order.objects.get(cart=cart, is_ordered=False, order_number=body['orderID'])
    print(order)

    for cart_item in cart_items:
        quantity = cart_item.quantity
        print(quantity)
        name = cart_item.product.name
        print(name)
        
    try:
        checkout_session = stripe.checkout.Session.create(
            customer_email=order.email,
            billing_address_collection='auto',
            payment_method_types=['card'],
            line_items=[
                {
                    'price_data': {
                        'currency': 'eur',
                        'unit_amount': int(order.order_total * 100),
                        'product_data': {
                            'name': name,
                            'images': ['https://i.imgur.com/EHyR2nP.png'],
                        },
                    },
                    'quantity': quantity,
                },
            ],
            metadata={
                'order_number': body['orderID'], 
                'payment_method': body['payment_method'], 
                'cart_id': cart,
            },
            mode='payment',
            success_url=YOUR_DOMAIN + '/success/',
            cancel_url=YOUR_DOMAIN + '/cancel/',
        )

        return JsonResponse({'id': checkout_session.id})
    except Exception as e:
        return JsonResponse(error=str(e)), 403

我遍历购物车项目,迭代给出: 1个 金箭 1个 银心

但是在 Stripe 仪表板中我只看到一个产品 1 Golden Arrow。

我想我需要创建一个新列表。那正确吗?在我的情况下我该怎么做?

谢谢

您实际上需要将每个项目添加到 line_items 数组中,因此您想做更多类似这样的事情:

line_items = []

for cart_item in cart_items:
    # I presume you have something like cart_item.amount, right?
    unit_amount = int(cart_item.amount * 100)

    line_items.add({
        'price_data': {
            'currency': 'eur',
            'unit_amount': unit_amount,
            'product_data': {
                'name': cart_item.product.name,
                'images': ['https://i.imgur.com/EHyR2nP.png'],
            },
        },
        'quantity': cart_item.quantity,
    })
    
try:
    checkout_session = stripe.checkout.Session.create(
        customer_email=order.email,
        billing_address_collection='auto',
        payment_method_types=['card'],
        line_items=line_items,
        metadata={
            'order_number': body['orderID'], 
            'payment_method': body['payment_method'], 
            'cart_id': cart,
        },
        mode='payment',
        success_url=YOUR_DOMAIN + '/success/',
        cancel_url=YOUR_DOMAIN + '/cancel/',
    )