【问题标题】:Django Session Variables Don't Work In Stripe Webhook?Django 会话变量在 Stripe Webhook 中不起作用?
【发布时间】:2023-03-12 21:18:01
【问题描述】:

一旦 webhook 确认 'checkout.session.completed',我正在尝试使用保存在 django session variables 中的数据来运行函数,但我总是遇到关键错误。我 100% 确定密钥存在于会话变量中。

这是我的网络钩子:

@csrf_exempt
def stripe_webhook(request):

    # You can find your endpoint's secret in your webhook settings
    endpoint_secret = 'secret'

    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']
        fulfull_order(session)


    return HttpResponse(status=200)

这是我的履行订单功能:

def fulfull_order(session):

 generator = PlanMaker(goal=request.session['goal'], gender=request.session['gender'])

  /// send email code.

这一行generator = PlanMaker(goal=request.session['goal'], gender=request.session['gender'])

总是在request.session['goal'] 上给出密钥错误该密钥确实存在,只是似乎无法从 webhook 视图中访问。

如何解决?

【问题讨论】:

    标签: django stripe-payments


    【解决方案1】:

    您应该在创建checkout.Session 时将您想要的信息保存到metadata 字段中。

    def checkout(request):
        session = stripe.checkout.Session.create(
            payment_method_types=['card'],
            line_items=[{
                'price': 'price_key',
                'quantity': 1,
            }],
            mode='payment',
            success_url=request.build_absolute_uri(reverse('success_url')) + '?session_id={CHECKOUT_SESSION_ID}',
            cancel_url=request.build_absolute_uri(reverse('cancel_url')),
            metadata={'someKeyHere': 'your session variable data'}
        )
    
        return JsonResponse({
            'session_id' : session.id,
            'stripe_public_key' : settings.STRIPE_PUBLISHABLE_KEY
        })
    

    然后您可以访问session['metadata']['someKeyHere']等信息

    【讨论】:

      【解决方案2】:

      webhook 事件是直接来自 Stripe 的单独请求,与任何 Django 会话无关,因此缺少会话数据似乎是意料之中的。正如@Anthony 建议的那样,您可以在创建会话时将此信息存储在 Checkout Session 元数据中。 metadata 将包含在 webhook 对象中。

      【讨论】:

        猜你喜欢
        • 2019-11-13
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 2015-09-30
        • 2013-04-12
        • 2012-08-17
        相关资源
        最近更新 更多