Django 会话变量在 Stripe Webhook 中不起作用?

Django Session Variables Don't Work In Stripe Webhook?

一旦 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 视图访问它。

如何解决?

创建 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']

等信息

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