【问题标题】:Stripe with Django - Retrieve product / price from SessionStripe with Django - 从 Session 中检索产品/价格
【发布时间】:2021-05-19 18:58:03
【问题描述】:

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

我有 2 个结帐,每个产品一个,还有一个要收听的 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.py - 购买后触发流程的 Webhook

@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.session.completed 事件在购买完成并且您将产品信息拉到那里后已经触发。
  • 或者您的问题是如何从 Payment Intent 对象中获取产品?
  • 感谢 karbi,理想情况下,当付款意图的状态成功时,我想获取产品。不确定如何,我想应该从 Webhook 视图中完成,但它似乎不起作用
  • 在下方留下答案 - 当付款意图成功时,您应该会收到一个 payment_intent.succeeded 事件。您可以提取付款意图并使用以下步骤获取价格产品。或者,您可以依靠付款成功后发出checkout.session.completed 的事实,直接使用 Checkout Session。

标签: django stripe-payments


【解决方案1】:

如果您有一个从结帐会话创建的付款意图,您需要返回并检索相关的结帐会话以获取价格/产品信息。

  1. 获取付款意图的 ID。
  2. 在设置payment_intent 并扩展data.line_items [1] 时请求列出结帐会话[0]。 python 中的调用应如下所示:sessions = stripe.checkout.Session.list(payment_intent='pi_xxx', expand=['data.line_items'])
  3. 如果调用成功并返回非空的结帐会话列表,请获取第一个并查看line_items 以获取有关价格和产品的信息。

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

[1]https://stripe.com/docs/expand#lists

【讨论】:

  • 很棒的卡比,非常感谢!!我找到了一个解决方法,我将在下面发布,那是在我看到你的答案之前,它看起来更干净。
【解决方案2】:

我发现从 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']

给我价格ID。

来源:Stripe doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2013-05-18
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多