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

Django中Stripe元数据解析及订单处理问题求助

解决Stripe Metadata字符串转回可遍历格式的问题

核心问题出在你直接把购物车列表转成普通字符串存入Stripe Metadata,而Stripe会将所有Metadata值统一存储为字符串类型。取回后自然无法直接遍历,解决思路是用JSON序列化/反序列化来保留数据结构,具体步骤如下:

1. 存入Stripe前:将购物车列表序列化为JSON字符串

不要直接用Python的str()或repr()转换列表,改用标准JSON格式序列化,确保数据结构能完整保留。

示例代码(创建Stripe Checkout Session时):

import json
import stripe
from django.conf import settings

# 你的购物车列表(从Cookie中取出的可遍历数据)
cart_items = [
    {"product_id": 101, "name": "纯棉T恤", "quantity": 2, "price": 99.99},
    {"product_id": 102, "name": "休闲牛仔裤", "quantity": 1, "price": 199.99}
]

# 创建Checkout Session时,将列表转为JSON字符串存入metadata
stripe.api_key = settings.STRIPE_SECRET_KEY
checkout_session = stripe.checkout.Session.create(
    payment_method_types=['card'],
    line_items=[
        # 这里是Stripe要求的line_items格式,和你的购物车数据对应
        {
            'price_data': {
                'currency': 'cny',
                'product_data': {'name': item['name']},
                'unit_amount': int(item['price'] * 100),
            },
            'quantity': item['quantity'],
        } for item in cart_items
    ],
    mode='payment',
    success_url=settings.STRIPE_SUCCESS_URL,
    cancel_url=settings.STRIPE_CANCEL_URL,
    # 关键:用json.dumps把购物车列表转为标准JSON字符串
    metadata={'cart_items': json.dumps(cart_items)}
)

2. Webhook取回时:反序列化JSON字符串回可遍历列表

在Stripe Webhook的处理函数中,把取回的字符串用json.loads()转回列表,就能正常遍历处理订单了。

示例代码(Webhook处理函数):

import json
import stripe
from django.http import HttpResponse
from django.conf import settings
from .models import Order, OrderItem

def stripe_webhook(request):
    payload = request.body
    sig_header = request.META['HTTP_STRIPE_SIGNATURE']
    event = None

    try:
        event = stripe.Webhook.construct_event(
            payload, sig_header, settings.STRIPE_WEBHOOK_SECRET
        )
    except ValueError as e:
        # 无效payload
        return HttpResponse(status=400)
    except stripe.error.SignatureVerificationError as e:
        # 签名验证失败
        return HttpResponse(status=400)

    # 处理结账完成事件
    if event['type'] == 'checkout.session.completed':
        session = event['data']['object']
        # 取出metadata中的JSON字符串
        cart_items_str = session['metadata'].get('cart_items')
        
        if cart_items_str:
            try:
                # 反序列化回可遍历的列表
                cart_items = json.loads(cart_items_str)
                
                # 遍历列表创建订单记录
                order = Order.objects.create(
                    stripe_session_id=session['id'],
                    total_amount=session['amount_total'] / 100,
                    # 其他订单字段...
                )
                for item in cart_items:
                    OrderItem.objects.create(
                        order=order,
                        product_id=item['product_id'],
                        quantity=item['quantity'],
                        price=item['price']
                    )
            except json.JSONDecodeError:
                # 处理解析失败的情况,比如记录日志
                print("购物车数据解析失败:", cart_items_str)

    return HttpResponse(status=200)

关键注意事项

  • 绝对不要用Python原生的str(cart_items)来转换列表,这种格式不是标准JSON,无法正常反序列化
  • 必须捕获JSONDecodeError异常,避免因数据损坏导致Webhook报错
  • 如果购物车数据包含特殊字符(比如中文、 emoji),JSON序列化会自动处理,兼容性远优于普通字符串转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:25:22