Django对接Stripe Webhook签名验证失败:环境变量配置异常排查
问题
我正在使用Stripe,尝试通过Django将Webhook连接到本地电脑,接收支付成功通知。以下是接收Stripe Webhook请求的代码:
@csrf_exempt def StripeWebhookView(request): CHECKOUT_SESSION_COMPLETED = "checkout.session.completed" # Listen for success payment payload = request.body sig_header = request.META["HTTP_STRIPE_SIGNATURE"] endpoint_secret=settings.STRIPE_WEBHOOK_SECRET try: event = stripe.Webhook.construct_event( payload, sig_header, endpoint_secret ) except ValueError as e: print(e) return HttpResponse(status=400) except SignatureVerificationError as e: print(e) return HttpResponse(status=400) if event["type"] == CHECKOUT_SESSION_COMPLETED: print(event)
实际遇到的问题:
- 支付扣款成功;
- Stripe发送支付数据请求时返回400错误。
查阅Stripe文档得知需确保签名密钥与Webhook端点匹配,将签名密钥硬编码到应用中后,问题解决,Stripe请求可被本地正常接收。
已做的检查:
- .env文件中设置的密钥与Stripe后台提供的签名密钥完全一致;
- 打印输出
env.STRIPE_WEBHOOK_SECRET,结果与预期签名密钥一致。
疑问:使用env.STRIPE_WEBHOOK_SECRET时为何出现问题?是否可能因本地服务器响应过慢导致?求排查思路。
排查思路与原因分析
- 排除响应速度因素:Stripe返回400是签名验证失败触发的错误,和响应速度无关——响应过慢只会导致超时类错误(如504),不会返回400,可直接排除该可能。
- 检查settings变量加载逻辑:
- 确认settings中
STRIPE_WEBHOOK_SECRET是否正确读取.env值,比如变量名是否存在拼写错误(大小写、下划线差异),加载.env的代码是否在变量定义前执行。 - 修改.env后重启本地服务器,避免旧配置仍驻留内存未更新。
- 确认settings中
- 排查字符串格式问题:
- 打印
settings.STRIPE_WEBHOOK_SECRET的长度,和硬编码密钥的长度对比,确认是否存在隐藏空格、换行符(比如.env中密钥末尾多了换行,或复制时带入空格)。 - 尝试在代码中对
settings.STRIPE_WEBHOOK_SECRET执行.strip()处理后再传入construct_event,验证是否解决问题。
- 打印
- 检查环境变量加载方式:
- 若使用python-dotenv,确认加载时是否设置
override=True,防止系统环境变量覆盖.env中的配置值。 - 确认是否在不同环境(开发/生产)的settings中,错误加载了其他配置文件。
- 若使用python-dotenv,确认加载时是否设置
- 逐字符对比验证:
- 在代码中同时打印硬编码密钥和
settings.STRIPE_WEBHOOK_SECRET,逐字符对比(可转成ASCII码对比),排查肉眼不可见的字符差异。
- 在代码中同时打印硬编码密钥和
内容的提问来源于stack exchange,提问作者tzur
相关产品推荐
相关产品推荐

