Stripe with Django -从Session中检索产品/价格



我正在整合我的django网站Stripe Checkout。我有2个产品,每次PaymentIntent成功时,我想获取与价格相关的(购买的产品)。

我有两个结帐,每个产品一个,还有一个webhook来听。

views.py-创建一个购买会话(为产品1 &2)

@csrf_exempt
def create_checkout_session_product1(request):
if request.method == 'GET':
domain_url = 'example.com'
checkout_session = stripe.checkout.Session.create(
success_url=domain_url + 'paiement_ok/',
cancel_url=domain_url + 'paiement_ko/',
payment_method_types=['card'],  
line_items=[
{
"price" : "price_1...",     <----- What I want to fetch
"quantity": 1,
},
],
mode='payment',
customer_email=request.user.get_username(),
)
return JsonResponse({'sessionId': checkout_session['id']})

views.pyWebhook在购买后触发一个进程

@csrf_exempt
def webhook(request):
payload = request.body
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
event = None
try:
event = stripe.Webhook.construct_event(
payload, sig_header, endpoint_secret
)
except ValueError as e:
# Invalid payload
return HttpResponse(status=400)
except stripe.error.SignatureVerificationError as e:
# Invalid signature
return HttpResponse(status=400)
# Handle the checkout.session.completed event
if event['type'] == 'checkout.session.completed':
session = event['data']['object']
#then I'd want to do something like :
line_items = stripe.checkout.Session.list_line_items(session.id)
price = line_items.data.price.id
if price == product1:
activate_process_product1(session.customer_email)
elif price == product2:
activate_process_product2(session.customer_email)

# Passed signature verification
return HttpResponse(status=200)

所以自从我拿到钱后,webhook就起作用了。

但是我不知道购买完成后如何取回产品?

如果您有一个从Checkout会话创建的Payment Intent,您需要返回并检索关联的Checkout会话以获取价格/产品信息。

  1. 获取支付意图ID
  2. 设置payment_intent并扩展data.line_items[1]时,请求列出Checkout Sessions[0]。python中的调用应该是这样的:sessions = stripe.checkout.Session.list(payment_intent='pi_xxx', expand=['data.line_items'])
  3. 如果调用成功并返回Checkout Sessions的非空列表,则取第一个并检查line_items以获取有关价格和产品的信息。

[0] https://stripe.com/docs/api/checkout/sessions/list list_checkout_sessions-payment_intent

[1] https://stripe.com/docs/expand列表

我发现从Session中获取它的一种方法是使用stripe.checkout.Session。list_line_items方法。

if event['type'] == 'checkout.session.completed':
session = event['data']['object']
line_items = stripe.checkout.Session.list_line_items(session.id)
price_id = line_items.data[0]['price']['id']

给了我价格号。

来源:Stripe doc

最新更新