Django部署后Stripe Webhook返回301错误,本地测试正常
问题描述
在Django REST framework应用中实现了Stripe Webhook处理支付事件,本地测试时Webhook可正常接收并处理事件,但部署后Stripe返回301错误,控制台显示Webhook调用无响应。Webhook URL可正常访问,但服务器日志无报错,说明post函数未执行。
相关代码
Webhook URL配置
urlpatterns = [ path('stripe-webhook', stripe_webhook.as_view()), ]
Webhook处理函数
class stripe_webhook(APIView): def post(self, request): #verify webhook request print(request.body) payload = request.body sig_header = request.headers['STRIPE_SIGNATURE'] event = None try: event = stripe.Webhook.construct_event( payload, sig_header, endpoint_secret ) except ValueError as e: # Invalid payload raise e except stripe.error.SignatureVerificationError as e: # Invalid signature raise e # Handle the event if event['type'] == 'payment_intent.succeeded': payment_intent = event['data']['object'] print(payment_intent) else: print('Unhandled event type {}'.format(event['type'])) return HttpResponse(status=200)
排查与修复方案
核心原因:URL重定向触发301错误
Django默认开启APPEND_SLASH(值为True),当请求URL末尾无斜杠时,会返回301重定向到带斜杠的版本。但Stripe发送Webhook请求时不会自动跟随重定向,导致原请求失败,post函数根本没被执行。修复步骤
- 修改URL配置,添加末尾斜杠
把URL配置里的path('stripe-webhook', ...)改成带斜杠的形式:urlpatterns = [ path('stripe-webhook/', stripe_webhook.as_view()), ] - 更新Stripe控制台的Webhook地址
登录Stripe后台,将Webhook的URL更新为带末尾斜杠的版本,比如https://你的域名.com/stripe-webhook/。 - 验证修复效果
触发一次支付事件,查看Stripe控制台是否显示Webhook调用成功,同时检查服务器日志是否有请求体和事件相关的打印内容。
- 修改URL配置,添加末尾斜杠
额外提醒
- 如果不想改URL的斜杠,可以在项目
settings.py里设置APPEND_SLASH = False,但这会影响整个项目的URL重定向逻辑,不建议这么做。 - 确认部署后的服务器防火墙/安全组没有拦截Stripe的IP地址,保证请求能正常到达。
- 如果不想改URL的斜杠,可以在项目
内容的提问来源于stack exchange,提问作者Guo Yang
相关产品推荐
相关产品推荐

