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 对象中。
一旦 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 对象中。