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

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拦截。
修复操作
  1. 修正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运行终端看到打印的请求体内容。

  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:09:16