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
相关产品推荐
相关产品推荐

