Stripe Webhooks无法命中DRF端点 触发事件无请求数据打印
问题根因
- 核心问题是Stripe CLI转发配置错误:
--forward-to参数要求传入完整带协议头的URL,你当前写的裸地址127.0.0.1:8000/api/bookings/10/payment-confirmation/缺少http://前缀。这种情况下Stripe CLI不会抛出显性错误,还会正常打印就绪提示,但实际不会把事件请求转发到本地Django服务,请求根本没打到你的接口上,自然看不到任何打印输出,这和你描述的“Postman请求正常、Stripe触发无输出”的现象完全吻合。 - 现有代码存在CSRF豁免失效的隐患:你把
@csrf_exempt装饰器直接加在类视图的post方法上是不生效的。Django CSRF中间件的校验逻辑在视图分发阶段执行,等请求流转到post方法时校验流程已经结束,就算修正了转发地址,这个写法也会导致Stripe的无CSRF令牌请求被403拦截。
修复操作
- 修正Stripe监听命令,给转发地址补上HTTP协议前缀:
stripe listen --events payment_intent.succeeded --format JSON --forward-to http://127.0.0.1:8000/api/bookings/10/payment-confirmation/
重启监听后再执行stripe trigger payment_intent.succeeded触发测试事件,就能在Django运行终端看到打印的请求体内容。
- 修正CSRF豁免的写法,推荐用
method_decorator给类视图的dispatch方法加装饰器,修改后的代码如下:
from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status @method_decorator(csrf_exempt, name='dispatch') class PaymentConfirmation(APIView): def post(self, request, booking, format=None): print(">>>>", request.data) return Response(status=status.HTTP_200_OK)
提示:测试阶段可以暂时只做CSRF豁免,正式上线时必须搭配Stripe CLI返回的webhook签名密钥做请求合法性校验,避免伪造请求篡改支付状态。
内容的提问来源于stack exchange,提问作者Jeet Patel
相关产品推荐
相关产品推荐

