You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

实际遇到的问题:

  1. 支付扣款成功;
  2. Stripe发送支付数据请求时返回400错误。

查阅Stripe文档得知需确保签名密钥与Webhook端点匹配,将签名密钥硬编码到应用中后,问题解决,Stripe请求可被本地正常接收。

已做的检查:

  1. .env文件中设置的密钥与Stripe后台提供的签名密钥完全一致;
  2. 打印输出env.STRIPE_WEBHOOK_SECRET,结果与预期签名密钥一致。

疑问:使用env.STRIPE_WEBHOOK_SECRET时为何出现问题?是否可能因本地服务器响应过慢导致?求排查思路。

排查思路与原因分析
  • 排除响应速度因素:Stripe返回400是签名验证失败触发的错误,和响应速度无关——响应过慢只会导致超时类错误(如504),不会返回400,可直接排除该可能。
  • 检查settings变量加载逻辑:
    • 确认settings中STRIPE_WEBHOOK_SECRET是否正确读取.env值,比如变量名是否存在拼写错误(大小写、下划线差异),加载.env的代码是否在变量定义前执行。
    • 修改.env后重启本地服务器,避免旧配置仍驻留内存未更新。
  • 排查字符串格式问题:
    • 打印settings.STRIPE_WEBHOOK_SECRET的长度,和硬编码密钥的长度对比,确认是否存在隐藏空格、换行符(比如.env中密钥末尾多了换行,或复制时带入空格)。
    • 尝试在代码中对settings.STRIPE_WEBHOOK_SECRET执行.strip()处理后再传入construct_event,验证是否解决问题。
  • 检查环境变量加载方式:
    • 若使用python-dotenv,确认加载时是否设置override=True,防止系统环境变量覆盖.env中的配置值。
    • 确认是否在不同环境(开发/生产)的settings中,错误加载了其他配置文件。
  • 逐字符对比验证:
    • 在代码中同时打印硬编码密钥和settings.STRIPE_WEBHOOK_SECRET,逐字符对比(可转成ASCII码对比),排查肉眼不可见的字符差异。

内容的提问来源于stack exchange,提问作者tzur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:17:42