Django集成Stripe Webhooks:Stripe CLI无法触发但Postman正常
Django集成Stripe Webhooks排查方案
1. 盯紧Stripe CLI的配置与日志
- 确认CLI转发命令的地址和Django运行地址完全匹配:比如Django跑在
127.0.0.1:8000,CLI命令必须是stripe listen --forward-to 127.0.0.1:8000/你的webhook路径/,注意端口、路径拼写,尤其是末尾的斜杠别漏。 - 运行CLI后,先看控制台有没有输出
Ready! Your webhook signing secret is whsec_xxx,这说明CLI正常启动。支付完成后,看CLI有没有打印[INFO] Forwarded event to ...的日志——如果没有,说明CLI根本没捕获到Stripe事件,大概率是CLI登录的Stripe账号和你测试支付的账号不是同一个,重新用stripe login切换账号试试。
2. 检查Django Webhook视图的核心逻辑
- 你用的签名密钥必须是Stripe CLI生成的那个
whsec_xxx,别和生产环境的密钥搞混了。 - 重点排查
request.body是否被篡改:DRF默认的解析器会提前解析请求体,导致Stripe验证签名时拿到的不是原始字节流。解决方法是给Webhook视图禁用DRF解析器,同时加上CSRF豁免:from rest_framework.decorators import api_view, parser_classes from rest_framework.parsers import ParseNone from django.views.decorators.csrf import csrf_exempt import stripe @csrf_exempt @api_view(['POST']) @parser_classes([ParseNone]) def stripe_webhook(request): stripe_secret = "你的CLI签名密钥" try: event = stripe.Webhook.construct_event( request.body, request.META['HTTP_STRIPE_SIGNATURE'], stripe_secret ) except ValueError as e: # 请求体格式错误 return HttpResponse(status=400) except stripe.error.SignatureVerificationError as e: # 签名验证失败 return HttpResponse(status=400) # 处理事件逻辑 return HttpResponse(status=200)
3. 本地服务器绑定的小细节
- 试试把Django绑定到
0.0.0.0启动:python manage.py runserver 0.0.0.0:8000,然后CLI转发命令改成stripe listen --forward-to 0.0.0.0:8000/你的webhook路径/,Windows下有时候localhost的解析会有小问题。
4. Stripe事件的订阅与状态排查
- 用
stripe listen时,默认监听所有事件,但如果你加了--events参数指定了特定事件,确认你测试的支付触发的事件(比如payment_intent.succeeded)在列表里。 - 去Stripe后台的「Events」页面,找到你测试支付对应的事件,看状态是「Sent」还是「Failed」:如果是Failed,点击进去看错误详情,比如“Connection refused”或者“Signature mismatch”,直接定位问题。
内容的提问来源于stack exchange,提问作者Mark Gemesi
相关产品推荐
相关产品推荐

