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

第三方支付回调接口Referer校验失败问题排查求助

解决第三方支付回调的Referer检查失败问题

针对你遇到的Forbidden (Referer checking failed - no Referer.): /callback/错误,即便已经配置csrf_exempt和跨域相关设置,可按以下步骤排查解决:

1. 确认csrf_exempt的正确使用方式

csrf_exempt必须作用于请求处理的入口点,不同视图类型的写法有区别:

  • 函数视图:直接装饰在函数上方
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@csrf_exempt
def payment_callback(request):
    if request.method == "POST":
        # 处理支付交易数据并存库逻辑
        return HttpResponse("SUCCESS")
    return HttpResponse("METHOD NOT ALLOWED")
  • 类视图:必须装饰dispatch方法(而非单独的post方法),因为CSRF检查在请求分发阶段执行
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@method_decorator(csrf_exempt, name="dispatch")
class PaymentCallbackView(View):
    def post(self, request):
        # 处理支付回调逻辑
        return HttpResponse("SUCCESS")

2. 检查CSRF相关配置的正确性

注意Django版本对应的配置项:

  • Django 3.2+ 正确的信任源配置是CSRF_TRUSTED_ORIGINS,而非CSRF_ALLOWED_ORIGIN(可能是你拼写错误),需添加支付平台的完整域名(带协议):
# settings.py
CSRF_TRUSTED_ORIGINS = ["https://pay.example.com"]  # 替换为实际支付平台域名
  • 如果支付平台回调请求完全不带Referer头,仅靠csrf_exempt就应该跳过CSRF检查,此时若仍报错,需排查是否有其他中间件或服务器配置拦截了请求。

3. 排查服务器或反向代理的Referer限制

如果你的服务部署在Nginx等反向代理后,可能是代理配置中添加了Referer校验规则,导致无Referer的请求被拦截:

  • 修改Nginx配置,针对/callback/路径允许无Referer的请求:
location /callback/ {
    valid_referers none;  # 允许无Referer的请求
    # 其他原有配置(如proxy_pass等)
}

4. 检查中间件顺序与自定义中间件

  • 确保CsrfViewMiddleware在SessionMiddleware之后,且没有自定义中间件在它之前执行额外的Referer检查:
# settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',  # 位置正确
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 其他中间件
]
  • 若有自定义中间件,检查是否在其中添加了Referer校验逻辑,若有则需针对/callback/路径跳过校验。

5. 验证请求是否到达目标视图

在回调视图中添加日志或打印语句,确认请求是否真的进入了视图处理逻辑:

@csrf_exempt
def payment_callback(request):
    print("请求已进入回调视图")
    print("请求头Referer:", request.META.get('HTTP_REFERER'))
    # 后续处理逻辑

如果日志未输出,说明请求在中间件或服务器层面就被拦截了,需重点排查这部分配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:37:37